前言
現在 HTML5/CSS3 很流行罷,也是未來時代的趨勢。在 HTML5 帶來的許多實用功能之後,CSS3也同帶來了一些牛逼哄哄的功能呢。
- 動畫 animation
- 轉化 transform
- 過渡 translation
儘快這已足夠讓我們興奮,許多之前必須用 JS 或 JQ 寫的效果用 CSS 就能實現,現在幾行 CSS3 代碼就夠了。
但是最值得注目的應該是 @media
多媒體查詢。
@media 是什麼怎麼用?
蘋果官網對 CSS3 @media 的使用:
我第一次看到這個是在 蘋果官網,大概這樣:
DOM 結構代碼:
結構大家都懂,但我們能夠很明顯注意到 class
的區別,只有 promo-title-0/1/2/3
不同。那麼,爲什麼?
我們看到了 promos li
的 css 代碼。
以及 .large-3
的代碼
以及 column
CSS 很簡單,大家一目瞭然其作用。將 section
下面的 4個塊寫成4個 li
同時給個相對定位和左浮動最小高度和Z軸,Yes so easy.
但是按住 Ctrl 同時移動鼠標滾輪放大網頁,we will find everthing has changed.
這裏的 section
變成了兩格佔一排,再看樣式 large-3
被劃上了刪除線.
取而代之的是 medium-6
。
Question 1: So @media only screen
and (max-width: 1068px)
是什麼鬼?
爲什麼這時候 @media 下定義的樣式讓 CSS 發生了變化,從 large-3
變成了 medium-6
那麼 small-12
會發生什麼?
我們再縮小來看一看,
;
這裏 section
變成了一格佔一排,之前的 @media
only screen and (max-width: 1068px)
變成了 @media
only screen and (max-width: 735px)
;再看 class 又由 medium-6
變成了 small-12
。
於是,我們可以得出以下結論。
@media only screen and (max-width)
的值改變,則對應 class 改變。large-3
是四個 li 的共同樣式,值爲width: 25%
。所以float: left
在一起就是其父元素section#promos.promos.row
的width: 100%
。medium-6 { width: 50% }
則相應的是 每2個 li 左浮動在一起爲一行(width: 100%
)。small-12 { width: 100% }
則一個 li 便左浮動佔據一行。- 所以它的響應式設計思路與
bootstrap
的 Gird System同樣原理。 - 所有的一切都由
@media
控制,針對不同媒體類型(或者說屏幕寬度)自適應採用不同的樣式規則。當你重置瀏覽器大小的過程中,頁面會根據瀏覽器的寬度和高度重新渲染頁面。(不明覺厲咯)
@media 如何使用?
通常這種類型的文檔在 w3cschool 類型的網站代碼屬性收集最全最權威,當然還有國內山寨但更強大版 w3cschool.cc 即 菜鳥教程。
以下內容據此摘錄與修改,當然爲了更便於各位理解。
CSS3 多媒體查詢
CSS3 的多媒體查詢繼承了 CSS2 多媒體類型的所有思想: 取代了查找設備的類型,CSS3 根據設置自適應顯示。
媒體查詢可用於檢測很多事情,例如:
viewport(視窗) 的寬度與高度
設備的寬度與高度
朝向 (智能手機橫屏,豎屏)
分辨率
目前很多針對蘋果手機,Android 手機,平板等設備都會使用到多媒體查詢。
自適應視窗
必須在 <head>
中添加一個 <meta>
標籤:
<meta name="viewport" content="width=device-width, initial-scale=1">
代碼原意翻譯過來既是: 視窗的寬度等於設備寬度,原始比例始終爲 1:1 。這樣在改變 device-width 的時候任意變化修改都能自適應了。
多媒體查詢語法
- 多媒體查詢由多種媒體組成,可以包含一個或多個表達式,表達式根據條件是否成立返回
true
或false
。 - 如果指定的多媒體類型匹配設備類型則查詢結果返回 true,文檔會在匹配的設備上顯示指定樣式效果。
- 除非你使用了 not 或 only 操作符,否則所有的樣式會適應在所有設備上顯示效果。
方法一: 直接寫在 CSS 樣式中讓其根據設備判斷:
方法二: 針對不同的媒體設備外部鏈入不同的 stylesheets:
<link rel="stylesheet" media="mediatype and|not|only
(media feature)" href="mystylesheet.css">
not / only / all
not: not是用來排除掉某些特定的設備的,比如 @media not print(非打印設備)。
only: 用來定某種特別的媒體類型。
對於支持 Media Queries 的移動設備來說,如果存在 only 關鍵字,移動設備的 Web 瀏覽器會忽略 only關鍵字並直接根據後面的表達式應用樣式文件。
對於不支持 Media Queries 的設備但能夠讀取 Media Type 類型的 Web瀏覽器,遇到 only 關鍵字時會忽略這個樣式文件。all: 所有設備,這個應該經常看到。
多媒體類型 mediatype
值 | 描述 |
---|---|
all | 用於所有多媒體類型設備 |
用於打印機 | |
screen | 用於電腦屏幕,平板,智能手機等。 |
speech | 用於屏幕閱讀器 |
多媒體特性 media feature
值 | 描述 |
---|---|
aspect-ratio | 定義輸出設備中的頁面可見區域寬度與高度的比率 |
color | 定義輸出設備每一組彩色原件的個數。如果不是彩色設備,則值等於0 |
color-index | 定義在輸出設備的彩色查詢表中的條目數。如果沒有使用彩色查詢表,則值等於0 |
device-aspect-ratio | 定義輸出設備的屏幕可見寬度與高度的比率。 |
device-height | 定義輸出設備的屏幕可見高度。 |
device-width | 定義輸出設備的屏幕可見寬度。 |
grid | 用來查詢輸出設備是否使用柵格或點陣。 |
height | 定義輸出設備中的頁面可見區域高度。 |
max-aspect-ratio | 定義輸出設備的屏幕可見寬度與高度的最大比率。 |
max-color | 定義輸出設備每一組彩色原件的最大個數。 |
max-color-index | 定義在輸出設備的彩色查詢表中的最大條目數。 |
max-device-aspect-ratio | 定義輸出設備的屏幕可見寬度與高度的最大比率。 |
max-device-height | 定義輸出設備的屏幕可見的最大高度。 |
max-device-width | 定義輸出設備的屏幕最大可見寬度。 |
max-height | 定義輸出設備中的頁面最大可見區域高度。 |
max-monochrome | 定義在一個單色框架緩衝區中每像素包含的最大單色原件個數。 |
max-resolution | 定義設備的最大分辨率。 |
max-width | 定義輸出設備中的頁面最大可見區域寬度。 |
min-aspect-ratio | 定義輸出設備中的頁面可見區域寬度與高度的最小比率。 |
min-color | 定義輸出設備每一組彩色原件的最小個數。 |
min-color-index | 定義在輸出設備的彩色查詢表中的最小條目數。 |
min-device-aspect-ratio | 定義輸出設備的屏幕可見寬度與高度的最小比率。 |
min-device-width | 定義輸出設備的屏幕最小可見寬度。 |
min-device-height | 定義輸出設備的屏幕的最小可見高度。 |
min-height | 定義輸出設備中的頁面最小可見區域高度。 |
min-monochrome | 定義在一個單色框架緩衝區中每像素包含的最小單色原件個數 |
min-resolution | 定義設備的最小分辨率。 |
min-width | 定義輸出設備中的頁面最小可見區域寬度。 |
monochrome | 定義在一個單色框架緩衝區中每像素包含的單色原件個數。如果不是單色設備,則值等於0 |
orientation | 定義輸出設備中的頁面可見區域高度是否大於或等於寬度。 |
resolution | 定義設備的分辨率。如:96dpi, 300dpi, 118dpcm |
scan | 定義電視類設備的掃描工序。 |
width | 定義輸出設備中的頁面可見區域寬度。 |
至此,我們解釋之前 apple 官網 的 Question1 :
@media only screen and (max-width: 1068px)
僅電腦設備中的頁面最大可見區域寬度爲 1068px 時顯示其定義的樣式。所以當設備寬度小於 1068px 採用 medium-6
。
@media only screen and (max-width: 735px)
僅電腦設備中的頁面最大可見區域寬度爲 735px 時顯示其定義的樣式。所以當設備寬度小於 735px 採用 small-12
。
這個時候小夥版你也一定機智的想到了如果我想做一個 平板 和 手機之間的 @media 屬性怎麼辦?當然有辦法了。 辦法就是:
那麼屏幕 retina 分辨率怎麼辦?看看 apple 怎麼做:
這是完整代碼:
是不是很有趣? apple 將設計化簡爲繁,但這背後的代價卻更大。但爲了給用戶最直觀明瞭和完美的呈現,這些都不足爲懼。
但如果你以爲 copy 上面代碼就夠了? Too young too naive! 我們需要學習的還很多,你會發現有時候寫入 CSS3 @media 屬性沒卵用。
比如: Quesition2: -webkit-min-device-pixel-ratio
是個什麼鬼?
@media 細緻深入理解
不同設備有不同的寬高,不同分辨率,不同的DPI,不同的長寬比,如何區分?如何針對?它們對應的 @media 屬性功能怎麼寫入呢?
上面表格中其實全部有標明方法 但你真的理解了嗎?這樣更簡單一些!
不同的寬高:
width/height 定義輸出設備中的頁面可見區域寬度/高度。
max/min-width/height 定義輸出設備中的頁面最大/小可見區域寬度/高度。
device-width/height 定義輸出設備的屏幕可見寬/高度。
max/min-device-width/height 定義輸出設備的屏幕最大/小可見寬/高度。
不同的分辨率:
resolution 定義設備的分辨率。如:96dpi, 300dpi, 118dpcm
max/min-resolution 定義設備的最大/小分辨率。
不同的長寬比:
aspect-ratio 定義輸出設備中的頁面可見區域寬度與高度的比率。
device-aspect-ratio 定義輸出設備的屏幕可見寬度與高度的比率。
max/min-aspect-ratio 定義輸出設備的屏幕可見寬度與高度的最大/小比率。
max/min-device-aspect-ratio 定義輸出設備的屏幕可見寬度與高度的最大/小比率。
那麼 Question2 -webkit-min-device-pixel-ratio
是個什麼鬼?
它得意思是:Gives the number of device pixels per CSS pixel. css px 和物理 px(device px) 之間的比率即設備像素比率。
iphone 的物理分辨率是 320X480,但是呈現的內容卻是 640×960,但其實我們設置的 css px 是相對於物理分辨率的,即 320×480,但是因爲我們設置的 css px 要顯示在更寬闊的 640×960 的內容區域裏頭,所以10個 css px 在 640×960 的呈現效果就相當於5個 device px 在 320×480 的呈現效果。
所以如果圖片得大小是100×100,那麼到iphone裏頭就會被放大2倍,於是圖像會變得比以前模糊,通常得解決辦法是,用 background-size 設置爲50%,以前的一半,然後再在 iphone 放大2倍,等於沒變化,恢復到正常效果,不模糊了。
則是一種兼容寫法, -webkit-min-device-pixel-ratio
跟 min-resolution
意思一致, 我們發現每個逗號間除了-webkit-min-device-pixel-ratio
唯一的不同是什麼?
dppx
dpi
單位,所以這裏的兼容這是兼容不同的瀏覽器的計算單位。
不同設備 pixel-ratio/dpi/dppx 值的區別
@media 注意事項
寫作順序問題
這簡直是個小技巧,一開始我也十分納悶。爲什麼寫的有些 @media 沒有起作用。原來有這麼回事:
我們知道 min-width
表示最小即大於等於,max-width
表示最大即小於等於; 但我們也很清楚 CSS 樣式 跟 DOM 結構 跟 JS 一樣 從前往後加載,後面重複代碼會覆蓋之前代碼。
那麼這樣的順序有問題嗎?
會發生什麼?
當 device-width <= 640
時 樣式3
起作用
當 640 <= device-width <= 321
時 樣式2
起作用但無效
當 device-width >= 640
時 樣式1
起作用
Question3: 爲什麼上面代碼不起起作用但無效?
min-width:320px
即 width
>= 320px
max-width: 640px and min-width: 32px
即 640
<= width <= 320px
max-width: 640px
即 width
<= 640px
Answer3:根據 CSS 從上至下執行的規律以及我們的分析:
當視窗寬度大於等於 320px 時候執行樣式1,(有效)
當視窗寬度小於等於 640px 大於等於 320px 時執行樣式2,有效但無法使用,因爲被 樣式3
覆蓋。(CSS
解析器跟 JS 一樣在相同方法上覆蓋之前定義的方法)
當視窗寬度小於等於 640px 時執行樣式3。(有效)
解決辦法:
調整順序並適當修改,
當 width <= 320px
時,執行 樣式1;
當 640px <= width <= 321px
時,執行 樣式2;(給 min-wdith
的值
+1px 以讓 devic-width 值等於320時 樣式2 不會覆蓋 樣式1)
當 width >= 641px
時,執行 樣式3;
代碼如下:
所以是不是很簡單?萬能了也。任意分辨率混搭啊。
注意事項總結:
1, 適配順序
max-wdith: number0
小於等於 分辨率從大寫到小 如果同一選擇器樣式在更小分辨率下沒有重寫則會沿用 CSS中定義的基本樣式
(min-width: number1) and (max-width: number2)
大於等於number1 同時滿足 小於等於 number2
寫完 max-wdith
則開始寫其中間值;
number1 必須在 number0 的基礎上 +1px 以避免覆蓋之前 width
<= number0
時的樣式,
number2 則不要求必須在 number3 的基礎上 -1px (因爲後面定義的 width
>= number3
就算 width 的 number 相等也會根據先後原則覆蓋這個樣式) 。
min-wdith: number3
大於等於 分辨率從小寫到大 如果同一選擇器樣式在更大分辨率下沒有重寫則會沿用之前@media
定義的樣式 其次再是 CSS中定義的基本樣式
結語
說了這麼多,但我們都最喜歡福利了。彩蛋如下:
Bootstrap 的 @media 屬性寫法
apple 的 @media 屬性寫法 ( 含 Retina ) PS:前文順序不同 因爲其定義的選擇器不是同一組 下列代碼筆者已經修改
推薦閱讀材料:
筆者心得:
@media 用好了做自適應網站手到擒來,而且極其方便。值得你花時間深入研究學習。
如果文章有錯誤或者紕漏敬請指正,非常感謝。
原網址:http://blog.qiji.tech/archives/10167?utm_source=tuicool&utm_medium=referral