[CSS] 詳細解釋 @media 屬性與 (max-width:) and (min-width) 之間的關系及用法


[CSS] 詳細解釋 @media 屬性與 (max-width:) and (min-width) 之間的關系及用法

現在 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 代碼。

  1.  
    max-height: 200px;
  2.  
    overflow: hidden;
  3.  
     

以及 .large-3 的代碼

  1.  
    width: 25%;
  2.  
     

以及 column

  1.  
    position: relative;
  2.  
    z-index: 1;
  3.  
    min-height: 2px;
  4.  
    margin: 0;
  5.  
    padding: 0;
  6.  
    float: left;
  7.  
     

CSS 很簡單,大家一目了然其作用。將 section 下面的 4個塊寫成4個 li 同時給個相對定位和左浮動最小高度和Z軸,Yes so easy.

但是按住 Ctrl 同時移動鼠標滾輪放大網頁,we will find everthing has changed.

這里的 section 變成了兩格占一排,再看樣式 large-3 被划上了刪除線.

取而代之的是 medium-6 。

  1.  
    width: 50%;
  2.  
     

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 。

  1.  
    width: 100%;
  2.  
     

於是,我們可以得出以下結論。

  1. @media only screen and (max-width) 的值改變,則對應 class 改變。
  2. large-3 是四個 li 的共同樣式,值為 width: 25% 。所以 float: left 在一起就是其父元素section#promos.promos.row 的 width: 100% 。

  3. medium-6 { width: 50% } 則相應的是 每2個 li 左浮動在一起為一行( width: 100% )。

  4. small-12 { width: 100% } 則一個 li 便左浮動占據一行。
  5. 所以它的響應式設計思路與 bootstrap 的 Gird System 同樣原理。
  6. 所有的一切都由 @media 控制,針對不同媒體類型(或者說屏幕寬度)自適應采用不同的樣式規則。當你重置瀏覽器大小的過程中,頁面會根據瀏覽器的寬度和高度重新渲染頁面。(不明覺厲咯)

@media 如何使用?

通常這種類型的文檔在 w3cschool 類型的網站代碼屬性收集最全最權威,當然還有國內山寨但更強大版 w3cschool.cc 即 菜鳥教程 。

以下內容 據此摘錄 與修改,當然為了更便於各位理解。

CSS3 多媒體查詢

CSS3 的多媒體查詢繼承了 CSS2 多媒體類型的所有思想: 取代了查找設備的類型,CSS3 根據設置自適應顯示。媒體查詢可用於檢測很多事情,例如:

  • viewport(視窗) 的寬度與高度

  • 設備的寬度與高度

  • 朝向 (智能手機橫屏,豎屏)

  • 分辨率

目前很多針對蘋果手機,Android 手機,平板等設備都會使用到多媒體查詢。

自適應視窗

必須在 <head> 中添加一個 <meta> 標簽:

&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&gt;

代碼原意翻譯過來既是: 視窗的寬度等於設備寬度,原始比例始終為 1:1 。這樣在改變 device-width 的時候任意變化修改都能自適應了。

Bootstrap自適應視窗簡介

多媒體查詢語法

  • 多媒體查詢由多種媒體組成,可以包含一個或多個表達式,表達式根據條件是否成立返回 true 或 false 。
  • 如果指定的多媒體類型匹配設備類型則查詢結果返回 true,文檔會在匹配的設備上顯示指定樣式效果。
  • 除非你使用了 not 或 only 操作符,否則所有的樣式會適應在所有設備上顯示效果。

方法一: 直接寫在 CSS 樣式中讓其根據設備判斷:

@mediamediatypeand|not|only (mediafeature) {
    CSS-Code; }   

方法二: 針對不同的媒體設備外部鏈入不同的 stylesheets:

&lt;link rel=&quot;stylesheet&quot; media=&quot;mediatype and|not|only (media feature)&quot; href=&quot;mystylesheet.css&quot;&gt;

not / only / all

not: not是用來排除掉某些特定的設備的,比如 @media not print(非打印設備)。

only: 用來定某種特別的媒體類型。

對於支持 Media Queries 的移動設備來說,如果存在 only 關鍵字,移動設備的 Web 瀏覽器會忽略 only關鍵字並直接根據后面的表達式應用樣式文件。對於不支持 Media Queries 的設備但能夠讀取 Media Type 類型的 Web瀏覽器,遇到 only 關鍵字時會忽略這個樣式文件。

all: 所有設備,這個應該經常看到。

多媒體類型 mediatype

描述
all 用於所有多媒體類型設備
print 用於打印機
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 屬性怎么辦?當然有辦法了。 辦法就是:

 @mediascreen ( max-width: 1068px ) and (min-width: 765px) {   CSScode }   @mediascreenand (max-width: 640px) and (min-width: 481px){   CSScode }   

那么屏幕 retina 分辨率怎么辦?看看 apple 怎么做:

這是完整代碼:

 @mediaonlyscreenand (-webkit-min-device-pixel-ratio:                              1.5) and (max-width: 735px), onlyscreenand (max-width: 735px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 735px) and (min-resolution: 144dpi){   }   @mediaonlyscreenand (max-width: 735px){   }   @mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 1068px), onlyscreenand (max-width: 1068px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 1068px) and (min-resolution: 144dpi){   }   @mediaonlyscreenand (max-width: 1068px){   }   @mediaonlyscreenand (max-width: 1068px) and (max-width: 735px){   }   @mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 735px), onlyscreenand (max-width: 735px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 735px) and (min-resolution: 144dpi){   }   @mediaonlyscreenand (max-width: 735px){   }   @mediaonlyscreenand (max-width: 1068px) and (max-width: 735px){   }   @mediaonlyscreenand (max-width: 1068px){   }   @mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 1068px), onlyscreenand (max-width: 1068px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 1068px) and (min-resolution: 144dpi){   }   @mediaonlyscreenand (max-width: 1068px){   }   @mediaonlyscreenand (max-width: 1441px) and (max-width: 735px){   }   @mediaonlyscreenand (max-width: 1068px) and (max-width: 1441px){   }   @mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 1441px), onlyscreenand (max-width: 1441px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 1441px) and (min-resolution: 144dpi){   }   @mediaonlyscreenand (max-width: 1441px){   }   

是不是很有趣? 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倍,等於沒變化,恢復到正常效果,不模糊了。

 @mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 1441px), onlyscreenand (max-width: 1441px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 1441px) and (min-resolution: 144dpi) {   }   

則是一種兼容寫法, -webkit-min-device-pixel-ratio 跟 min-resolution 意思一致, 我們發現每個逗號間除了 -webkit-min-device-pixel-ratio 唯一的不同是什么?

dppx dpi 單位,所以這里的兼容這是兼容不同的瀏覽器的計算單位。

設備像素比devicePixelRatio簡單介紹

單位 pixel-ratio/dpi/dppx 區別

不同設備 pixel-ratio/dpi/dppx 值的區別

設備兼容 及 瀏覽器 支持情況區別及簡明易懂案例

@media 注意事項

寫作順序問題

這簡直是個小技巧,一開始我也十分納悶。為什么寫的有些 @media 沒有起作用。原來有這么回事:

我們知道 min-width 表示最小即大於等於, max-width 表示最大即小於等於; 但我們也很清楚 CSS 樣式 跟 DOM 結構 跟 JS 一樣 從前往后加載,后面重復代碼會覆蓋之前代碼。

那么這樣的順序有問題嗎?

  1.  
    /*樣式1*/
  2.  
    @media (min-width: 320px) {
  3.  
       .container{ width: 92%; margin: 4%; }
  4.  
    }
  5.  
     
  6.  
     
  7.  
    /*樣式2*/
  8.  
    @media (min-width:320px) and (max-width: 640px){
  9.  
       .container{ width: 86%; margin: 7%; }
  10.  
    }
  11.  
     
  12.  
     
  13.  
    /*樣式3*/
  14.  
    @media (max-width: 640px) {
  15.  
       .container{ width: 80%; margin: 10%; }
  16.  
    }
  17.  
     

會發生什么?

當 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.  
    /*樣式1*/
  2.  
    @media (max-width: 320px) {
  3.  
       .container{ width: 92%; margin: 4%; }
  4.  
    }
  5.  
     
  6.  
     
  7.  
    /*樣式2*/
  8.  
    @media (min-width:321px) and (max-width: 639px){
  9.  
       .container{ width: 86%; margin: 7%; }
  10.  
    }
  11.  
     
  12.  
     
  13.  
    /*樣式3*/
  14.  
    @media (min-width: 640px) {
  15.  
       .container{ width: 80%; margin: 10%; }
  16.  
    }
  17.  
     

所以是不是很簡單?萬能了也。任意分辨率混搭啊。

注意事項總結:

1, 適配順序

max-wdith: number0 小於等於 分辨率從大寫到小 如果同一選擇器樣式在更小分辨率下沒有重寫則會沿用 CSS中定義的基本樣式

 mW <= 320; mW <= 480; mW <= 768; mW <= 960; mW <= 1080; mW <= 1280; mW <= 1440;  /*@media 則會根據 `` max-width `` 的大小變化從小到小取值 */   

(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中定義的基本樣式

 mW >= 1440; mW >= 1280; mW >= 1080; mW >= 960; mW >= 768; mW >= 480; mW >= 320;  /*@media 則會根據 `` min-width `` 的大小變化從大到小取值 */

Bootstrap 的 @media 屬性寫法

@media (max-width: 767px) {   // col-xs }   @media (min-width: 768px) and (max-width: 991px) {   // col-sm }   @media (min-width: 992px) and (max-width: 1199px) {   // col-md }   @media (min-width: 1200px) {   // col-lg }   

apple 的 @media 屬性寫法 ( 含 Retina ) PS:前文順序不同 因為其定義的選擇器不是同一組 下列代碼筆者已經修改

@mediaonlyscreenand (max-width: 1441px){     .container::after{ content: "1441"; } }   @mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 1441px), onlyscreenand (max-width: 1441px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 1441px) and (min-resolution: 144dpi){     .container::after{ content: "1441 Retina"; } }   @mediaonlyscreenand (min-width: 1068px) and (max-width: 1441px){     .container::after{ content: "1068 - 1441"; } }   @mediaonlyscreenand (max-width: 1068px){     .container::after{ content: "1068"; } }   @mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 1068px), onlyscreenand (max-width: 1068px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 1068px) and (min-resolution: 144dpi){     .container::after{ content: "1068 Retina"; } }   @mediaonlyscreenand (max-width: 1068px) and (min-width: 735px){     .container::after{ content: "735 - 1068"; } }   @mediaonlyscreenand (max-width: 735px){     .container::after{ content: "735"; } }   @mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 735px), onlyscreenand (max-width: 735px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 735px) and (min-resolution: 144dpi){     .container::after{ content: "735 Retina"; } }   @mediaonlyscreenand (max-width: 340px){     .container::after{ content: "340"; } }   @mediaonlyscreenand (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 340px), onlyscreenand (max-width: 340px) and (min-resolution: 1.5dppx), onlyscreenand (max-width: 340px) and (min-resolution: 144dpi){     .container::after{ content: "340 Retina"; } }   @mediaonlyscreenand (min-width: 1441px) {     .container::after{ content: "1441"; } }  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM