摘要:本節(jié)內(nèi)容會(huì)跟著上一節(jié)的內(nèi)容繼續(xù)完善,首先會(huì)補(bǔ)充選擇器的瀏覽器支持情況主要是說,比如我們最常用的群組選擇器在時(shí)才被支持,并且還支持了很多我們沒有想到的選擇器,如子元素選擇器,屬性選擇器,了解后你會(huì)發(fā)現(xiàn)還是挺了不起的。
前言
上一篇系列文章整理了CSS選擇器的基礎(chǔ)使用方法,因?yàn)閮?nèi)容較多且細(xì)致,寫了很多DEMO,目前將它整理成適合移動(dòng)端瀏覽器的CSS選擇器的參考手冊(cè),方便學(xué)習(xí)CSS的人參考使用,馬上就要搞定了,之后會(huì)放出 (笑臉)。
本節(jié)內(nèi)容會(huì)跟著上一節(jié)的內(nèi)容繼續(xù)完善,首先會(huì)補(bǔ)充CSS選擇器的瀏覽器支持情況(主要是說IE),比如我們最常用的s1,s2,…,sN群組選擇器在IE7時(shí)才被支持,并且IE7還支持了很多我們沒有想到的選擇器,如子元素選擇器,屬性選擇器,了解后你會(huì)發(fā)現(xiàn)IE7還是挺了不起的。
之后還會(huì)補(bǔ)充平常使用選擇器遇到的一些問題以及解決方案,最后了解瀏覽器是如何讀取選擇器的,怎樣使用選擇器能達(dá)到高效率。
瀏覽器支持 了不起的IE7當(dāng)我們?cè)陂_發(fā)網(wǎng)頁時(shí),如果網(wǎng)頁需要兼容IE6,那么自然地會(huì)把IE6和IE7瀏覽器歸為一路貨色,對(duì)于不兼容的選擇器和屬性都將不再考慮使用,可是你是否知道IE7相比IE6增加了許多選擇器可以用,如群組選擇器,相鄰選擇器,兄弟選擇器,屬性選擇器。
以下選擇器是不支持IE6,僅支持 IE7 及以上的瀏覽器
基本選擇器選擇器 | 描述 | 版本 |
---|---|---|
s1,s2,...,sN | 群組選擇器,同時(shí)匹配所有s1元素或s2元素 | 2.1 |
E > F | 子元素選擇器,匹配所有E元素的子元素F | 2.1 |
E + F | 毗鄰元素選擇器,匹配所有緊隨E元素之后的同級(jí)元素F | 2.1 |
E ~ F | 匹配任何E標(biāo)簽之后的同級(jí)F標(biāo)簽 | 3 |
選擇器 | 描述 | 版本 |
---|---|---|
E[attr] | 匹配att屬性的E元素 | 2.1 |
E[attr="val"] | 匹配att屬性且屬性值等于val的E元素 | 2.1 |
E[attr~="val"] | 匹配att屬性且屬性值中的詞列表有一個(gè)等于val的E元素 | 2.1 |
E[attr^="val"] | 匹配att屬性且屬性值為以val開頭的字符串的E元素 | 3 |
E[attr$="val"] | 匹配att屬性且屬性值為以val結(jié)尾的字符串的E元素 | 3 |
E[attr*="val"] | 匹配att屬性且屬性值為包含val的字符串的E元素 | 3 |
E[att|="val"] | 匹配att屬性且屬性值為以val開頭并用連接符"-"分隔的字符串的E元素 | 2.1 |
在IE7瀏覽器,單復(fù)選框的checked在屬性選擇器中是不被支持的,這部分內(nèi)容會(huì)在下面的常見問題中詳細(xì)說明。
偽類選擇器選擇器 | 描述 | 版本 |
---|---|---|
E:hover | 設(shè)置元素在其鼠標(biāo)懸停時(shí)的樣式 | 2.1 |
E:first-child | 匹配父元素的第一個(gè)子元素E | 2.1 |
E:hover在IE6中只有a元素可用
偽元素選擇器選擇器 | 描述 | 版本 |
---|---|---|
E:first-letter | 選擇文本塊的第一個(gè)字母 | 2.1 |
E:first-line | 選擇元素的第一行 | 2.1 |
雖然來到IE8的時(shí)代,但是對(duì)于新選擇器的支持并不多,不過還好我們最常用的E:before和E:after配合content屬性都在IE8中得到了很好的支持。
以下選擇器不支持IE6,IE7,僅支持 IE8 及以上的瀏覽器
偽類選擇器選擇器 | 描述 | 版本 |
---|---|---|
E:focus | 設(shè)置對(duì)象在成為輸入焦點(diǎn)時(shí)的樣式 | 2.1 |
選擇器 | 描述 | 版本 |
---|---|---|
E:before | 在元素前面插入內(nèi)容,配合"content"使用 | 2.1 |
E:after | 在元素后面插入內(nèi)容,配合"content"使用 | 2.1 |
IE最好的時(shí)代就是迎接CSS3的到來,從IE9支持了一大坨新CSS3的偽類以及偽元素,我就勉強(qiáng)給IE使用上這個(gè)酷炫點(diǎn)的修飾語。
以下選擇器不支持IE6,IE7,IE8,僅支持 IE9 及以上的瀏覽器
偽類選擇器選擇器 | 描述 | 版本 |
---|---|---|
E:checked | 匹配用戶界面上處于選中狀態(tài)的元素E | 3 |
E:enabled | 匹配用戶界面上處于可用狀態(tài)的元素E | 3 |
E:disabled | 匹配用戶界面上處于禁用狀態(tài)的元素E | 3 |
E:root | 匹配文檔的根元素,對(duì)于HTML文檔,就是HTML元素 | 3 |
E:last-child | 匹配父元素的最后一個(gè)子元素E | 3 |
E:nth-last-child(n) | 匹配父元素的倒數(shù)第n個(gè)子元素E | 3 |
E:nth-of-type(n) | 匹配同類型中的第n個(gè)同級(jí)兄弟元素E | 3 |
E:nth-last-of-type(n) | 匹配同類型中的倒數(shù)第n個(gè)同級(jí)兄弟元素E | 3 |
E:first-of-type | 匹配同類型中的第一個(gè)同級(jí)兄弟元素E | 3 |
E:last-of-type | 匹配同類型中的最后一個(gè)同級(jí)兄弟元素E | 3 |
E:only-child | 匹配父元素僅有的一個(gè)子元素E | 3 |
E:only-of-type | 匹配同類型中的唯一的一個(gè)同級(jí)兄弟元素E | 3 |
E:empty | 匹配沒有任何子元素(包括text節(jié)點(diǎn))的元素E | 3 |
E:not(s) | 匹配不含有s選擇符的元素 | 3 |
E:target | 匹配文檔中特定"id"點(diǎn)擊后的效果 | 3 |
選擇器 | 描述 | 版本 |
---|---|---|
E::first-letter | 選擇文本塊的第一個(gè)字母 | 3 |
E::first-line | 選擇元素的第一行 | 3 |
E::before | 在元素前面插入內(nèi)容,配合"content"使用 | 3 |
E::after | 在元素后面插入內(nèi)容,配合"content"使用 | 3 |
E::selection | 設(shè)置對(duì)象被選擇時(shí)的樣式 | 3 |
如何才能讓IE6~8支持CSS3偽類和屬性選擇器,也許你已經(jīng)想到了,我們會(huì)用JavaScript工具來進(jìn)行輔助,那么剛好|8e50989464f7517425e2c31ba2d6dd59424|就可以完成這件事情,而且使用起來很簡單,只要把selectivizr.js引入到頁面上就可以了,如下:
但是使用它還有一些注意事項(xiàng):
必須要引用一個(gè)JavaScript庫,比如jQuery
只能解析標(biāo)簽引入的樣式,如果是定義的樣式是不會(huì)解析的
動(dòng)態(tài)生成的DOM不會(huì)做二次映射
需要在標(biāo)準(zhǔn)模式的DTD才能夠生效
項(xiàng)目地址:http://selectivizr.com
常見問題與Bug * 通配符造成繼承失效* { color:red; } #test{ color:blue; }
▲ 最終text的顏色卻是紅色的
按照我們的理解,id的優(yōu)先級(jí)是高于*通配符的,而文字也本應(yīng)該繼承id元素的color值,所以最終的文字應(yīng)該是藍(lán)色呀。
所以這里混淆了一個(gè)概念,繼承的樣式的優(yōu)先級(jí)永遠(yuǎn)低于元素本身的樣式,包括通配符選擇器,所以大家在開發(fā)中,應(yīng)該盡可能的避免濫用通配符,以免帶來一些隱性問題。
關(guān)于這個(gè)問題,還可以參考《關(guān)于CSS特殊性的問題》
而在IE6及更早瀏覽器并不支持通配選擇符(*),只是將它忽略了,所以也變相的能看到效果。
E:hover 失效E:hover偽類用于設(shè)置元素在其鼠標(biāo)懸停時(shí)的樣式,但是在某種情況會(huì)導(dǎo)致效果失效,如下:
#test { background:red; } #test div { display:none; } #test:hover div{ display:block; background:yellow; }
觸發(fā)我看到我了吧
▲ 當(dāng)觸發(fā)#test:hover時(shí),此效果是在IE6中是無效的,因?yàn)樵贗E6中,E:hover偽類僅能用于a(超鏈接)對(duì)象,且該a對(duì)象必須要擁有href屬性。
E:hover還有一種失效的狀態(tài),是大家最常見的,代碼如下:
a:link {color:gray;} a:hover{color:green;} a:visited{color:yellow;} a:active{color:blue;}
文字
▲ 當(dāng)超鏈接處于a:hover時(shí),你會(huì)發(fā)現(xiàn)其效果是無效,文字的顏色不會(huì)變成綠色,這是因?yàn)槌溄拥膫晤悩邮綍鴮懯怯泄潭樞虻模荒茴嵉梗@四個(gè)屬性正確的定義順序?yàn)椋?/p>
a:link {} a:visited {} a:hover {} a:active {}E:focus 失效
#test:focus + p { font-weight:bold; }
文字
▲ 當(dāng)點(diǎn)擊button按鈕觸發(fā):focus時(shí)將鄰近元素的文字進(jìn)行加粗,但是這個(gè)效果在IE8是失效的,如何來修復(fù)它呢,只需要添加一個(gè)空的:focus選擇器,如下:
#test:focus + p { font-weight:bold; } #test:focus {}E:first-line 失效
如果在當(dāng)前選擇器內(nèi)使用了!important,:first-line偽類內(nèi)部的定義的屬性會(huì)被完全忽略,示例:
p { color:blue; } p:first-line { color:red !important; }
第一行文字,
第二行文字
▲ 正常情況下第一行的文字會(huì)變成紅色,但是在IE8瀏覽器卻忽略它沒有任何變化,如何來解決這個(gè)問題呢,把!important去掉就好了,如下:。
p { color:blue; } p:first-line { color:red; }E:first-letter 失效
E:first-letter失效和E:first-line失效的問題是相同的,解決方案請(qǐng)參考上方。
E > F 失效就是子選擇器中間有注釋會(huì)導(dǎo)致屬性失效,如下:
#test > /*子選擇器*/ p { color:red; }
文字
▲ 如果你非要這樣寫注釋,那么在IE7下會(huì)導(dǎo)致子選擇器失效,同樣,E + F鄰近選擇器也有同樣的問題,如何解決呢,不在選擇器中間添加注釋就可以了。
性能優(yōu)化CSS 選擇器我們都在使用,但是如何讓它變的更簡潔,高效呢?
首先選擇器對(duì)性能的影響源于瀏覽器匹配選擇器和文檔元素時(shí)所消耗的時(shí)間,所以優(yōu)化選擇器的原則是應(yīng)盡量避免使用消耗更多匹配時(shí)間的選擇器,但是在此之前我們需要先了解瀏覽器的匹配機(jī)制,就是它是如何讀取我們的選擇器的。
#nav > a { color:red; }
當(dāng)我們看到這個(gè)選擇器的時(shí)候,會(huì)認(rèn)為首先會(huì)找到id為nav的元素,然后在找到其子元素,將樣式屬性應(yīng)用到a元素上。
事實(shí)上,卻恰恰相反,因?yàn)闉g覽器讀取選擇器時(shí),不是按照我們的閱讀習(xí)慣從左到右,而是遵循的從選擇器的右邊到左邊進(jìn)行讀取的。
當(dāng)我們知道這個(gè)匹配機(jī)制后,再回來看這個(gè)選擇器,瀏覽器必須先遍歷頁面中所有的 a 元素,然后查找其父元素的id是否為nav,這樣一來你就會(huì)發(fā)看似高效的選擇器在實(shí)際中的匹配開銷是很高的。
理解了CSS選擇器從右到左匹配的機(jī)制后,我們?cè)倏匆韵聝煞N選擇器:
div #nav
#nav div
你是否會(huì)認(rèn)為第2種選擇器的效率要高于第1種,那么就錯(cuò)了,其實(shí)第一個(gè)選擇器的效率更高,因?yàn)榈谝粋€(gè)選擇器的關(guān)鍵選擇器使用了#id選擇器”,而第二個(gè)選擇器的關(guān)鍵選擇器使用的是div標(biāo)簽選擇器。
這里所說的關(guān)鍵選擇器,就是CSS選擇器中最右邊部分,它是被瀏覽器最先尋找的,那么哪類選擇器是最高效的?哪個(gè)是會(huì)影響選擇器效率的關(guān)鍵選擇器?
選擇器效率在上面內(nèi)容中我們了解瀏覽器的匹配機(jī)制,以及關(guān)鍵選擇器的重要性,那么哪些CSS選擇器能夠減少性能損耗呢?
Google 資深web開發(fā)工程師 Steve Souders 對(duì) CSS 選擇器的執(zhí)行效率從高到低做了一個(gè)排序:
id選擇器(#id)
類選擇器(.className)
標(biāo)簽選擇器(div,h1,p)
相鄰選擇器(h1+p)
子選擇器(ul > li)
后代選擇器(li a)
通配符選擇器(*)
屬性選擇器(a[rel="external"])
偽類選擇器(a:hover,li:nth-child)
從Steve Souders的CSS Test我們可以看出#id選擇器和.className類選擇器在速度上的差異很小很小。而在一個(gè)a標(biāo)簽選擇器的測試上顯示,它比#id選擇器和類選擇器的速度慢了很多,從這里我們可以看出#id、.className選擇器 和 a標(biāo)簽、li a后代選擇器中間的差異較大,但是相互之間的差異較小。
接下來舉幾個(gè)示例:
#nav {} .menu{}
p#nav {} p.menu {}
▲ 上面的選擇器效率要高于下面的選擇器,標(biāo)簽元素會(huì)降低選擇器效率
優(yōu)化建議我們理解了CSS選擇器從右到左匹配的機(jī)制,也了解關(guān)鍵選擇器的重要性,以及CSS選擇器的效率排序,那么在使用選擇器的時(shí)候,通過避免不恰當(dāng)?shù)氖褂茫瑏硖嵘?CSS 選擇器性能。
避免使用通用選擇器#nav * {…}
▲ 這個(gè)選擇器所做的是選擇所有在頁面上的單個(gè)元素(是每個(gè)單個(gè)的元素),然后去看看它們是否有一個(gè)#nav的父元素。這是非常不高效選擇器,開銷太大了,應(yīng)該避免關(guān)鍵選擇器是通配選擇器的情況。
避免使用標(biāo)簽或 class 選擇器限制 id 選擇器/* Bad */ div#nav {…} .menuBalck#menu {…} /* Good */ #nav {…} #menu {…}
▲ ID選擇器本身就是唯一的,加上div反而增加不必要的匹配;
避免使用標(biāo)簽限制 class 選擇器/* Bad */ span.red {…} /* Good */ .text-red {…}
▲ 在標(biāo)簽上定義class選擇器,在開發(fā)和維護(hù)時(shí)容易混淆,一般不建議這樣寫。
避免使用多層標(biāo)簽選擇器。使用 class 選擇器替換,減少css查找/* Bad */ a[href="#"] > span > em {…} /* Good */ .className {}
▲ 這種情況建議直接定義.className 選擇器,然后使用
避免過渡使用子選擇器/* Bad */ div ul li a {} div > ul > li > a {} /* Good */ .className {…}
▲ 這種情況建議直接定義.className 選擇器,然后使用
避免過度限制選擇器/* Bad */ html body .wrapper #content a {} /* Good */ #content a {}
▲ 這里至少有3個(gè)選擇器是完全不需要的,過度限制選擇器使瀏覽器工作比它實(shí)際需要的更繁重,花費(fèi)的時(shí)間更多,所以這里應(yīng)該避免。
利用可繼承性/* Bad */ #nav > li > a { color:red; } /* Good */ #nav { color:red; }
▲ 在使用選擇器之前,請(qǐng)先考慮利用繼承性實(shí)現(xiàn)
下一節(jié)繼續(xù)整理選擇器的優(yōu)先級(jí)和繼承性相關(guān)內(nèi)容。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/111132.html
摘要:如對(duì)知識(shí)點(diǎn)感興趣,可移步至知識(shí)整理之篇就是針對(duì)不同的瀏覽器或不同版本瀏覽器寫特定的樣式達(dá)到讓瀏覽器兼容的過程。對(duì)于偽元素的定義偽元素在中創(chuàng)建了一些抽象元素,這些對(duì)象不存在與常文檔流中。隱藏元素的幾種方法該屬性隱藏元素,單元素在文檔流中仍占據(jù) CSS篇主要從CSS兼容、CSS3新特性、CSS選擇器、高頻屬性、高頻布局、高頻知識(shí)點(diǎn)、性能優(yōu)化等方面進(jìn)行歸納。如對(duì)HTML知識(shí)點(diǎn)感興趣,可移步至...
摘要:從現(xiàn)在開始,養(yǎng)成寫技術(shù)博客的習(xí)慣,或許可以在你的職業(yè)生涯發(fā)揮著不可忽略的作用。如果想了解更多優(yōu)秀的前端資料,建議收藏下前端英文網(wǎng)站匯總這個(gè)網(wǎng)站,收錄了國外一些優(yōu)質(zhì)的博客及其視頻資料。 前言 寫文章是一個(gè)短期收益少,長期收益很大的一件事情,人們總是高估短期收益,低估長期收益。往往是很多人堅(jiān)持不下來,特別是寫文章的初期,剛寫完文章沒有人閱讀會(huì)有一種挫敗感,影響了后期創(chuàng)作。 從某種意義上說,...
摘要:從現(xiàn)在開始,養(yǎng)成寫技術(shù)博客的習(xí)慣,或許可以在你的職業(yè)生涯發(fā)揮著不可忽略的作用。如果想了解更多優(yōu)秀的前端資料,建議收藏下前端英文網(wǎng)站匯總這個(gè)網(wǎng)站,收錄了國外一些優(yōu)質(zhì)的博客及其視頻資料。 前言 寫文章是一個(gè)短期收益少,長期收益很大的一件事情,人們總是高估短期收益,低估長期收益。往往是很多人堅(jiān)持不下來,特別是寫文章的初期,剛寫完文章沒有人閱讀會(huì)有一種挫敗感,影響了后期創(chuàng)作。 從某種意義上說,...
摘要:任務(wù)五一個(gè)最常見的移動(dòng)端頁面完成的事情學(xué)習(xí)張鑫旭世界相關(guān)章節(jié)張鑫旭系列了解通配符選擇器性能優(yōu)化瀏覽器渲染原理學(xué)習(xí)各屬性及效果完成任務(wù)五學(xué)習(xí)編碼規(guī)范編碼規(guī)范并按照編碼規(guī)范優(yōu)化代碼完成深度思考計(jì)劃的事情找時(shí)間把前面任務(wù)的官方提供鏈接過一遍,查缺 任務(wù)五、 一個(gè)最常見的移動(dòng)端頁面 完成的事情 float學(xué)習(xí) 張鑫旭《CSS世界》相關(guān)章節(jié) 張鑫旭 float系列 了解CSS通配符 &...
閱讀 2222·2021-09-30 09:47
閱讀 980·2021-08-27 13:01
閱讀 2968·2019-08-30 15:54
閱讀 3693·2019-08-30 15:53
閱讀 834·2019-08-29 14:07
閱讀 721·2019-08-28 18:16
閱讀 806·2019-08-26 18:37
閱讀 1415·2019-08-26 13:27