現(xiàn)在 HTML5/CSS3 很流行罷,也是未來時代的趨勢。在 HTML5 帶來的許多實用功能之后,CSS3也同帶來了一些牛逼哄哄的功能呢。
盡快這已足夠讓我們興奮,許多之前必須用 JS 或 JQ 寫的效果用 CSS 就能實現(xiàn),現(xiàn)在幾行 CSS3 代碼就夠了。
但是最值得注目的應(yīng)該是 @media 多媒體查詢。
我第一次看到這個是在 蘋果官網(wǎng) ,大概這樣:
DOM 結(jié)構(gòu)代碼:
結(jié)構(gòu)大家都懂,但我們能夠很明顯注意到 class 的區(qū)別,只有 promo-title-0/1/2/3 不同。那么,為什么?
我們看到了 promos li 的 css 代碼。
max-height: 200px;overflow: hidden;
以及 .large-3 的代碼
width: 25%;
以及 column
position: relative;z-index: 1;min-height: 2px;margin: 0;padding: 0;float: left;
CSS 很簡單,大家一目了然其作用。將 section 下面的 4個塊寫成4個 li 同時給個相對定位和左浮動最小高度和Z軸,Yes so easy.
但是按住 Ctrl 同時移動鼠標滾輪放大網(wǎng)頁,we will find everthing has changed.
這里的 section 變成了兩格占一排,再看樣式 large-3 被劃上了刪除線.
取而代之的是 medium-6 。
width: 50%;
為什么這時候 @media 下定義的樣式讓 CSS 發(fā)生了變化,從 large-3 變成了 medium-6 那么 small-12 會發(fā)生什么?
我們再縮小來看一看,
;
這里 section 變成了一格占一排,之前的 @media only screen and (max-width: 1068px) 變成了 @media only screen and (max-width: 735px) ;再看 class 又由 medium-6 變成了 small-12 。
width: 100%;
于是,我們可以得出以下結(jié)論。
large-3 是四個 li 的共同樣式,值為 width: 25% 。所以 float: left 在一起就是其父元素 section#promos.promos.row 的 width: 100% 。
medium-6 { width: 50% } 則相應(yīng)的是 每2個 li 左浮動在一起為一行( width: 100% )。
通常這種類型的文檔在 w3cschool 類型的網(wǎng)站代碼屬性收集最全最權(quán)威,當然還有國內(nèi)山寨但更強大版 w3cschool.cc 即 菜鳥教程 。
以下內(nèi)容 據(jù)此摘錄 與修改,當然為了更便于各位理解。
CSS3 的多媒體查詢繼承了 CSS2 多媒體類型的所有思想: 取代了查找設(shè)備的類型,CSS3 根據(jù)設(shè)置自適應(yīng)顯示。媒體查詢可用于檢測很多事情,例如:
viewport(視窗) 的寬度與高度
設(shè)備的寬度與高度
朝向 (智能手機橫屏,豎屏)
分辨率
目前很多針對蘋果手機,Android 手機,平板等設(shè)備都會使用到多媒體查詢。
代碼原意翻譯過來既是: 視窗的寬度等于設(shè)備寬度,原始比例始終為 1:1 。這樣在改變 device-width 的時候任意變化修改都能自適應(yīng)了。
Bootstrap自適應(yīng)視窗簡介
方法一: 直接寫在 CSS 樣式中讓其根據(jù)設(shè)備判斷:
@mediamediatypeand|not|only (mediafeature) { CSS-Code;}
方法二: 針對不同的媒體設(shè)備外部鏈入不同的 stylesheets:
<link rel="stylesheet" media="mediatype and|not|only (media feature)" href="mystylesheet.css">
not: not是用來排除掉某些特定的設(shè)備的,比如 @media not print(非打印設(shè)備)。
only: 用來定某種特別的媒體類型。
對于支持 Media Queries 的移動設(shè)備來說,如果存在 only 關(guān)鍵字,移動設(shè)備的 Web 瀏覽器會忽略 only關(guān)鍵字并直接根據(jù)后面的表達式應(yīng)用樣式文件。對于不支持 Media Queries 的設(shè)備但能夠讀取 Media Type 類型的 Web瀏覽器,遇到 only 關(guān)鍵字時會忽略這個樣式文件。
all: 所有設(shè)備,這個應(yīng)該經(jīng)??吹健?/p>
值 | 描述 |
---|---|
all | 用于所有多媒體類型設(shè)備 |
用于打印機 | |
screen | 用于電腦屏幕,平板,智能手機等。 |
speech | 用于屏幕閱讀器 |
值 | 描述 |
---|---|
aspect-ratio | 定義輸出設(shè)備中的頁面可見區(qū)域?qū)挾扰c高度的比率 |
color | 定義輸出設(shè)備每一組彩色原件的個數(shù)。如果不是彩色設(shè)備,則值等于0 |
color-index | 定義在輸出設(shè)備的彩色查詢表中的條目數(shù)。如果沒有使用彩色查詢表,則值等于0 |
device-aspect-ratio | 定義輸出設(shè)備的屏幕可見寬度與高度的比率。 |
device-height | 定義輸出設(shè)備的屏幕可見高度。 |
device-width | 定義輸出設(shè)備的屏幕可見寬度。 |
grid | 用來查詢輸出設(shè)備是否使用柵格或點陣。 |
height | 定義輸出設(shè)備中的頁面可見區(qū)域高度。 |
max-aspect-ratio | 定義輸出設(shè)備的屏幕可見寬度與高度的最大比率。 |
max-color | 定義輸出設(shè)備每一組彩色原件的最大個數(shù)。 |
max-color-index | 定義在輸出設(shè)備的彩色查詢表中的最大條目數(shù)。 |
max-device-aspect-ratio | 定義輸出設(shè)備的屏幕可見寬度與高度的最大比率。 |
max-device-height | 定義輸出設(shè)備的屏幕可見的最大高度。 |
max-device-width | 定義輸出設(shè)備的屏幕最大可見寬度。 |
max-height | 定義輸出設(shè)備中的頁面最大可見區(qū)域高度。 |
max-monochrome | 定義在一個單色框架緩沖區(qū)中每像素包含的最大單色原件個數(shù)。 |
max-resolution | 定義設(shè)備的最大分辨率。 |
max-width | 定義輸出設(shè)備中的頁面最大可見區(qū)域?qū)挾取?/td> |
min-aspect-ratio | 定義輸出設(shè)備中的頁面可見區(qū)域?qū)挾扰c高度的最小比率。 |
min-color | 定義輸出設(shè)備每一組彩色原件的最小個數(shù)。 |
min-color-index | 定義在輸出設(shè)備的彩色查詢表中的最小條目數(shù)。 |
min-device-aspect-ratio | 定義輸出設(shè)備的屏幕可見寬度與高度的最小比率。 |
min-device-width | 定義輸出設(shè)備的屏幕最小可見寬度。 |
min-device-height | 定義輸出設(shè)備的屏幕的最小可見高度。 |
min-height | 定義輸出設(shè)備中的頁面最小可見區(qū)域高度。 |
min-monochrome | 定義在一個單色框架緩沖區(qū)中每像素包含的最小單色原件個數(shù) |
min-resolution | 定義設(shè)備的最小分辨率。 |
min-width | 定義輸出設(shè)備中的頁面最小可見區(qū)域?qū)挾取?/td> |
monochrome | 定義在一個單色框架緩沖區(qū)中每像素包含的單色原件個數(shù)。如果不是單色設(shè)備,則值等于0 |
orientation | 定義輸出設(shè)備中的頁面可見區(qū)域高度是否大于或等于寬度。 |
resolution | 定義設(shè)備的分辨率。如:96dpi, 300dpi, 118dpcm |
scan | 定義電視類設(shè)備的掃描工序。 |
width | 定義輸出設(shè)備中的頁面可見區(qū)域?qū)挾取?/td> |
至此,我們解釋之前 apple 官網(wǎng) 的 Question1 :
@media only screen and (max-width: 1068px)
僅電腦設(shè)備中的頁面最大可見區(qū)域?qū)挾葹?1068px 時顯示其定義的樣式。所以當設(shè)備寬度小于 1068px 采用 medium-6 。
@media only screen and (max-width: 735px)
僅電腦設(shè)備中的頁面最大可見區(qū)域?qū)挾葹?735px 時顯示其定義的樣式。所以當設(shè)備寬度小于 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 將設(shè)計化簡為繁,但這背后的代價卻更大。但為了給用戶最直觀明了和完美的呈現(xiàn),這些都不足為懼。
但如果你以為 copy 上面代碼就夠了? Too young too naive! 我們需要學(xué)習(xí)的還很多,你會發(fā)現(xiàn)有時候?qū)懭?CSS3 @media 屬性沒卵用。
上面表格中其實全部有標明方法 但你真的理解了嗎?這樣更簡單一些!
width/height 定義輸出設(shè)備中的頁面可見區(qū)域?qū)挾?高度。
max/min-width/height 定義輸出設(shè)備中的頁面最大/小可見區(qū)域?qū)挾?高度。
device-width/height 定義輸出設(shè)備的屏幕可見寬/高度。
max/min-device-width/height 定義輸出設(shè)備的屏幕最大/小可見寬/高度。
resolution 定義設(shè)備的分辨率。如:96dpi, 300dpi, 118dpcm
max/min-resolution 定義設(shè)備的最大/小分辨率。
aspect-ratio 定義輸出設(shè)備中的頁面可見區(qū)域?qū)挾扰c高度的比率。
device-aspect-ratio 定義輸出設(shè)備的屏幕可見寬度與高度的比率。
max/min-aspect-ratio 定義輸出設(shè)備的屏幕可見寬度與高度的最大/小比率。
max/min-device-aspect-ratio 定義輸出設(shè)備的屏幕可見寬度與高度的最大/小比率。
那么 Question2 -webkit-min-device-pixel-ratio 是個什么鬼?
它得意思是:Gives the number of device pixels per CSS pixel. css px 和物理 px(device px) 之間的比率即設(shè)備像素比率。
iphone 的物理分辨率是 320X480,但是呈現(xiàn)的內(nèi)容卻是 640×960,但其實我們設(shè)置的 css px 是相對于物理分辨率的,即 320×480,但是因為我們設(shè)置的 css px 要顯示在更寬闊的 640×960 的內(nèi)容區(qū)域里頭,所以10個 css px 在 640×960 的呈現(xiàn)效果就相當于5個 device px 在 320×480 的呈現(xiàn)效果。
所以如果圖片得大小是100×100,那么到iphone里頭就會被放大2倍,于是圖像會變得比以前模糊,通常得解決辦法是,用 background-size 設(shè)置為50%,以前的一半,然后再在 iphone 放大2倍,等于沒變化,恢復(fù)到正常效果,不模糊了。
@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 意思一致, 我們發(fā)現(xiàn)每個逗號間除了 -webkit-min-device-pixel-ratio 唯一的不同是什么?
dppx dpi 單位,所以這里的兼容這是兼容不同的瀏覽器的計算單位。
設(shè)備像素比devicePixelRatio簡單介紹
單位 pixel-ratio/dpi/dppx 區(qū)別
不同設(shè)備 pixel-ratio/dpi/dppx 值的區(qū)別
設(shè)備兼容 及 瀏覽器 支持情況區(qū)別及簡明易懂案例
這簡直是個小技巧,一開始我也十分納悶。為什么寫的有些 @media 沒有起作用。原來有這么回事:
我們知道 min-width 表示最小即大于等于, max-width 表示最大即小于等于; 但我們也很清楚 CSS 樣式 跟 DOM 結(jié)構(gòu) 跟 JS 一樣 從前往后加載,后面重復(fù)代碼會覆蓋之前代碼。
那么這樣的順序有問題嗎?
/*樣式1*/@media (min-width: 320px) { .container{ width: 92%; margin: 4%; }} /*樣式2*/@media (min-width:320px) and (max-width: 640px){ .container{ width: 86%; margin: 7%; }} /*樣式3*/@media (max-width: 640px) { .container{ width: 80%; margin: 10%; }}
會發(fā)生什么?
當 device-width <= 640 時 樣式3 起作用
當 640 <= device-width <= 321 時 樣式2 起作用但無效
當 device-width >= 640 時 樣式1 起作用
min-width:320px 即 width >= 320px
max-width: 640px and min-width: 32px 即 640 <= width <= 320px
max-width: 640px 即 width <= 640px
當視窗寬度大于等于 320px 時候執(zhí)行樣式1,(有效)
當視窗寬度小于等于 640px 大于等于 320px 時執(zhí)行樣式2,有效但無法使用,因為被 樣式3 覆蓋。( CSS 解析器跟 JS 一樣在相同方法上覆蓋之前定義的方法 )
當視窗寬度小于等于 640px 時執(zhí)行樣式3。(有效)
解決辦法:
調(diào)整順序并適當修改,
當 width <= 320px 時,執(zhí)行 樣式1;
當 640px <= width <= 321px 時,執(zhí)行 樣式2;(給 min-wdith 的值 +1px 以讓 devic-width 值等于320時 樣式2 不會覆蓋 樣式1)
當 width >= 641px 時,執(zhí)行 樣式3;
代碼如下:
/*樣式1*/@media (max-width: 320px) { .container{ width: 92%; margin: 4%; }} /*樣式2*/@media (min-width:321px) and (max-width: 639px){ .container{ width: 86%; margin: 7%; }} /*樣式3*/@media (min-width: 640px) { .container{ width: 80%; margin: 10%; }}
所以是不是很簡單?萬能了也。任意分辨率混搭啊。
1, 適配順序
max-wdith: number0 小于等于 分辨率從大寫到小 如果同一選擇器樣式在更小分辨率下沒有重寫則會沿用 CSS中定義的基本樣式
mW <= 320; mW <= 480; mW <= 768; mW <= 960; mW <= 1080; mW <= 1280; mW <= 1440; /*@media 則會根據(jù) `` max-width `` 的大小變化從小到小取值 */
(min-width: number1) and (max-width: number2) 大于等于number1 同時滿足 小于等于 number2
寫完 max-wdith 則開始寫其中間值;
number2 則不要求必須在 number3 的基礎(chǔ)上 -1px (因為后面定義的 width >= number3 就算 width 的 number 相等也會根據(jù)先后原則覆蓋這個樣式) 。
min-wdith: number3 大于等于 分辨率從小寫到大 如果同一選擇器樣式在更大分辨率下沒有重寫則會沿用之前 @media 定義的樣式 其次再是 CSS中定義的基本樣式
mW >= 1440; mW >= 1280; mW >= 1080; mW >= 960; mW >= 768; mW >= 480; mW >= 320; /*@media 則會根據(jù) `` min-width `` 的大小變化從大到小取值 */
說了這么多,但我們都最喜歡福利了。彩蛋如下:
國外某網(wǎng)站給出的 iPad @media 屬性寫法
國外某妹子推薦的 browser @media 寫法
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:前文順序不同 因為其定義的選擇器不是同一組 下列代碼筆者已經(jīng)修改
@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"; }}
推薦閱讀材料:
CSS3 媒體查詢
CSS3 Media Queries
筆者心得:
@media 用好了做自適應(yīng)網(wǎng)站手到擒來,而且極其方便。值得你花時間深入研究學(xué)習(xí)。
如果文章有錯誤或者紕漏敬請指正,非常感謝。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com