原書: 響應式Web設計實踐css
目錄:html
媒體查詢:html5
媒體查詢容許根據設備的信息----諸如屏幕寬度, 方向或者分辨率等屬性來使用不一樣的樣式node
斷點:ios
那些被指定的,開始應用某一新的媒介查詢的點. 例如, 一個在980px處的斷點的意思是, 當瀏覽器寬度大於或小於這一數值時, 新的媒介查詢將被觸發git
#container{ width: 95%; padding: .625em 1.05% 1.5em; /*10px/16px 10px/948px 24px/16px*/ margin: auto 0; } .main{ float: left; margin-right: 2.53%; /* 24/948 */ width: 65.823%; /*624/948*/ } .aside{ float: right; width: 31.645%; /*300/948 */ }
aside img, .main img, .slats img{ width:100%; max-width: 100%; }
不能夠在html中定義img的height和width的屬性值, 若是設定了這些值, 就不能按比例縮放圖片了.github
目的: 固定右邊邊欄, 只讓主欄流動
方法: 使用表格佈局web
.main{ display: table-cell; padding-right: 2.53%; /* 24/948 */ } aside{ display: table-cell; width: 300px; }
使用條件註釋來爲IE 7 及如下版本的IE瀏覽器提供備用樣式: (!IEMobile的條件判斷是由於Windows Phone 7 也會加載這個備用樣式)chrome
<!--[if (lt Ie 8) & (!IEMobile)]> <link rel="stylesheet" type="text/css" href="css/ie.css" media="all"> <![endif]-->
在移動設備上, 不少設備都會給瀏覽器返回一個數值較大的佈局視口. 編程
視口標籤:
<meta name="viewport" content="directive, directive" />
視口的屬性:
width: 能夠將視口設置爲某一特定的寬度, 或者設置爲設備屏幕的寬度
最佳選擇是在width聲明中使用device-width
<meta name="viewport" content="width=device-width" />
<meta name="viewport" content="height=device-height" />
<meta name="viewport" content="user-scalable=no" />
<meta name="viewport" content="initial-scale=.5, width=device-width" />
如這個例子中, width屬性被設成設備的寬度, 同時initial-scale被設置爲.5, 這意味着瀏覽器將會縮小顯示全部東西: 例如在一個320px寬的設備上, 頁面會顯示爲640px
媒介查詢能夠經過問詢瀏覽器來肯定特定的表達式是否爲真. 若是爲真, 就加載一些特殊的, 適用於這種狀況的樣式, 從而達到調整佈局的目的.
媒介查詢的通常形式爲:
@media [not|only] type [and] (expr) { rules }
包含四個基本組成部分:
每一種媒介類型都會告訴用戶代理(例如瀏覽器)是否要加載特定的樣式表. 例如, 若是知道screen媒介類型, 那麼全部經過計算機顯示器來瀏覽頁面的用戶代理都會加載相應的樣式. 若是是print媒介類型, 那麼相應的樣式將會在打印或打印預覽時進行加載.
十種類型:
all | 全部設備(默認) |
braille | 盲文觸覺反饋設備 |
embossed | 分頁盲文打印機 |
handeld | 手持設備(一般爲小屏幕而且多是黑白屏幕) |
打印或打印預覽 | |
projection | 投影儀 |
screen | 彩色計算機屏幕 |
speech | 語言合成器 |
tty | 使用固定字符間距的設備(終端或打印設備) |
tv | 電視機 |
樣式中的查詢語句以下:
@media print {
}
也能夠採用外部樣式文件的形式, 並在link元素內指定媒介屬性:
<link rel="stylesheet" href="print.css" media="print" />
不管哪一種方法, 被引用的CSS的效果只有在打印或打印預覽時才能看到.
每條媒介查詢都必須包含一種媒介類型,若是沒有設置媒介類型, 該條查詢將使用默認值all, 但在不一樣瀏覽器中的實際行爲是各不相同的.
判斷設備視口的寬度是否大於320px:
@media screen and (min-width: 320px){
}
先檢測訪問頁面的設備是否屬於screen, 而後測試設備的視口寬度----寬度至少爲320px
可使用的媒介特性, 而且min-和max-前綴也都適用於這些特性
特性 | 描述 | 值 | 能夠指定最小或最大 |
width | 描述設備顯示區域的寬度 | <長度>(例如320) | 是 |
height | 描述設備顯示區域的高度 | <長度>(例如600) | 是 |
device-width | 描述設備渲染界面的寬度 | <長度>(例如320) | 是 |
device-height | 描述設備渲染界面的高度 | <長度>(例如600) | 是 |
orientation | 指定設備處於豎直(高度大於寬度)或者水平(寬度大於高度)狀態 | portrait | landscape | 否 |
aspect-ratio | width屬性和height屬性的比值 | <比值>(例如16/9) | 是 |
device-aspect-ratio | device-width屬性和device-height屬性的比值 | <比值>(例如16/9) | 是 |
color | 設備的每一個顏色份量的比特數 | <整數>(例如1) | 是 |
color-index | 設備的顏色查找表中的條目數 | <整數>(例如256) | 是 |
monochrome | 黑白屏幕設備每一個像素的比特數(若是不是黑白屏幕將返回0) | <整數>(例如8) | 是 |
resolution | 設備的分辨率(像素密度), 能夠以點每英尺[dpi]或者點每釐米[dpcm]來表示 | <分辨率>(例如118dpcm> | 是 |
scan | "tv"類設備的掃描過程 | progressive | interlace | 否 |
grid | 返回該設備是網格設備(1)仍是位圖設備(0) | <整數>(例如1) | 否 |
@media screen and (color) {} /*判斷設備是否配備有彩色屏幕*/ @media not screen and (color){} /*等於 not (screen and (color))*/ @media screen and (color), projection and (color) /*逗號表示or */ /*不少瀏覽器支持媒介類型, 但不支持媒介查詢, 有時這會致使瀏覽器去嘗試下載那些你不但願用戶看到的樣式. 這時候就能夠用only關鍵字, 對那些較老瀏覽器隱藏媒介查詢, 這樣它們就並不會識別出相應的樣式了. 而支持only關鍵字的瀏覽器則會繼續處理帶有only關鍵字的查詢語句*/ @media only screen and (color) /* 若是設備不支持媒介查詢, 那麼它將會忽略這條查詢. 若是設備支持媒介查詢, 那麼設備將會將上面這條查詢與下面這條查詢等效對待 @media screen and (color)
媒介查詢既能夠寫在頁面內部, 也能夠經過link元素的media屬性被包含到頁面中去.
@media all and (max-width: 768px){ } @media all and (max-width: 320px){ }
@media all and (min-width: 320px){ } @media all and (min-width: 768px){ }
能得到瀏覽器更好的支持,
且能夠下降css文件的複雜性
傳統的作法: 使用一些固定的標準寬度: 320px(iphone和其餘一些設備), 768px(ipad)和1024px
存在的問題是: 可能會忽視在這些寬度之間的設備.
1) 更好的作法是 追隨內容:
根據內容來決定應該在哪裏設置斷點以及須要設置多少個斷點.
其實就是縮放瀏覽器, 而後緩慢拉寬窗口直到有些東西須要調整時設置斷點.
2) 增長對大屏幕的支持.
3) 使用em爲媒體查詢增長靈活性
即便用em爲單位來設置斷點
優先爲移動平臺建立.
自定義數據屬性: 專門爲頁面存儲自定義數據並具備data-前綴的屬性, 一般出於腳本編程的目的而設置
<ul class="slats"> <li class="group" data-src="images/ball.jpg"> <a href="#"> <h3>sssssssssss</h3> </a> </li> <li class="group" data-src="images/ball1.jpg"> <a href="#"> <h3>sssssssssss</h3> </a> </li> <li class="group" data-src="images/ball2.jpg"> <a href="#"> <h3>sssssssssss</h3> </a> </li> </ul>
js代碼:
//添加一個用來幫助快速選取元素的工具函數 q: function(query){ //HTML5向Web API新引入了document.querySelector以及document.querySelectorAll兩個方法用來更方便地從DOM選取元素,功能相似於jQuery的選擇器。 //兩個方法使用差很少的語法,都是接收一個字符串參數,這個參數須要是合法的CSS選擇語法。其中參數能夠包含多個css選擇器, 用逗號隔開 //使用這兩個方法沒法查找帶僞類狀態的元素 //其中, querySelectorAll會返回全部知足添加的元素, 結果是個nodeLists集合 //querySelector返回知足條件的單個元素,按照深度優先和先序遍歷的原則使用參數提供的css選擇器在DOM進行查找,返回第一個知足條件的元素 if(document.querySelectorAll) { var res = document.querySelectorAll(query); } else { //addRule()貌似是IE中的方法. DOM中用insertRule() var d = document; a = d.styleSheet[0] || d.createStyleSheet(); a.addRule(query, 'f:b'); //遍歷文檔的全部元素, 若是已經添加了屬性(f:b)的話, 意味着這個元素存在. 將其push到數組c中 for(var l=d.all, b=0, c=[], f=l.length; b<f; b++){ l[b].currentStyle.f && c.push(l[b]); a.removeRule(0); var res = c; } return res; } } //加載圖片 var lazy = Utils.q('[data-src]'); for(var i=0; i<lazy.length; i++){ var source = lazy[i].getAttribute('data-src'); //建立image var img = new Image(); img.src = source; //插入 lazy[i].insertBefore(img, lazy[i].firstChild); }
//這樣,在手機上或其餘小窗口瀏覽器中加載頁面時, 就不會請求圖片了 if (window.matchMedia("(min-width: 37.5em)").matches) { //load in the images var lazy = Utils.q('[data-src]'); for(var i=0; i<lazy.length; i++){ var source = lazy[i].getAttribute('data-src'); var img = new Image(); img.src = source; lazy[i].insertBefore(img, lazy[i].firstChild); } }
min-resolution //非WebKit. 須要兩個值中的一個, 第一個值是屏幕分辨率, 單位多是每英寸的點數, 也能夠是每釐米的點數. 或者新的每像素的點數(dppx) -webkit-min-device-pixel-ratio //Webkit. 須要賦予一個十進制的表示像素比的值
中間兩章講設計.
其中涉及到一個模型的問題:
我以前瞭解的是使用圖形處理軟件來建立初始模型(好比PS). 可是靜態模型對響應式設計並無任何幫助. 因此應當到瀏覽器中去設計.
return !!window.JSON; //檢測設備是否原生支持JSON
此外參考: Media Queries 媒體查詢常見設備斷點