讓IE可以變相支持CSS3選擇器

別誤會(huì),IE是不支持CSS3高級(jí)選擇器,包括最新的IE8,但是CSS選擇器的確是很有用的,它可以大大的簡化我們的工作,提高我們的代碼效率,并讓我們很方便的制作高可維護(hù)性的頁面。
然而IE對高級(jí)CSS選擇器特別是CSS3選擇器的支持讓我們一直不能將CSS選擇器推廣應(yīng)用。不過,雖然我們無法左右瀏覽器的市場份額,卻可以通過一些技術(shù)改善我們的工作。我們也可以使用其它的一些技術(shù),讓IE可以變相支持CSS3選擇器。
一位來自英國的網(wǎng)頁開發(fā)工程師Keith Clark開發(fā)了一個(gè)JavaScript方案來使IE支持CSS3選擇器。該腳本支持從IE5到IE8的各個(gè)版本。
用法
你只需要下載Robert Nyman的DOMAssistant腳本和ie-css3.js并將它們在你的頁面的head標(biāo)簽中導(dǎo)入,如下:
<head>
<script type="text/javascript" src="DOMAssistantCompressed-2.7.4.js"></script>
<script type="text/javascript" src="ie-css3.js"></script>
</head>
支持的選擇器
- :nth-child
- :nth-last-child
- :nth-of-type
- :nth-last-of-type
- :first-child
- :last-child
- :only-child
- :first-of-type
- :last-of-type
- :only-of-type
- :empty
ie-css3的一些限制
- 樣式表必須通過<link>標(biāo)簽引入。頁面級(jí)的樣式表或者內(nèi)聯(lián)的樣式表將無效。不過你可以在外部樣式文件中使用@import 導(dǎo)入其它樣式文件;
- 樣式表文件必須和頁面放在同一個(gè)域名下面;
- 使用file://路徑的樣式文件將由于瀏覽器的安全問題而不起作用;
- :not()選擇器尚不支持;
- 該方法不是動(dòng)態(tài)的,樣式被應(yīng)用之后再改變DOM,將會(huì)無效。
如何工作的?
ie-css3.js下載頁面的每一個(gè)樣式文件并解析它的CSS3偽選擇器。如果一個(gè)選擇器被找到,它就會(huì)被替換為同名的CSS class。比如: div:nth-child(2) 將會(huì)變成 div._iecss-nth-child-2 。然后,Robert Nyman的DOMAssistant用于尋找匹配元素CSS3選擇器的DOM節(jié)點(diǎn)然后將相應(yīng)的CSS類添加給它。
最終,元素的樣式表會(huì)被新的版本替代,然后用CSS3選擇器對相應(yīng)元素添加對應(yīng)的樣式。
避免IE的CSS解釋器
根據(jù)W3C的規(guī)定,一個(gè)瀏覽器應(yīng)該無視它不認(rèn)識(shí)的CSS規(guī)則。這就出現(xiàn)一個(gè)問題——我們需要利用樣式表文件中的CSS3選擇器,但是IE會(huì)將它們丟棄。
為了避免這個(gè)問題,每一個(gè)樣式文件都會(huì)通過XMLHttpRequest下載。這允許該腳本繞開瀏覽器內(nèi)置的CSS解釋器并能夠讀取原始的CSS文件。
替代方案
顯然這個(gè)也并非完美的方案,對于Ajax網(wǎng)站來說,它基本上是不能用的,因?yàn)樵?strong>生成的樣式表被應(yīng)用之后再改變DOM,就不會(huì)有效了。但是事實(shí)上我們可以自己來自定義一個(gè)ie-css3的。只是沒有它這個(gè)這么智能。
使用 cssQuery
cssQuery是由業(yè)界大牛Dean Edwards開發(fā)的一個(gè)Javascript組件。它就是為CSS 選擇器而生的。它可以支持幾乎所有的CSS 選擇器,包括CSS3選擇器。當(dāng)然它在實(shí)現(xiàn)的時(shí)候進(jìn)行了分級(jí),分別針對CSS1,CSS2和CSS3制作了一個(gè)獨(dú)立的js包,以及一個(gè)標(biāo)準(zhǔn)包。支持所有A級(jí)瀏覽器。
簡單的用法:
var tags = cssQuery("body > p");
var tags = cssQuery("[href]");
var tags = cssQuery("a[href='#']");
然后你就可以自己寫一些js為相應(yīng)的對象添加想用的樣式了。
我建議對支持CSS高級(jí)選擇器的瀏覽器使用原生的CSS選擇器寫法,然后通過cssQuery在IE中動(dòng)態(tài)的為響應(yīng)的元素添加一個(gè)樣式名。
比如,我們可以這樣寫CSS:
a[herf='#'],a.empty{color:red}
這里的第一條CSS3選擇器是用于Firefox/webkit等支持CSS3選擇器的非IE瀏覽器的,a.empty是專門為IE而寫。然后通過CSSQuery動(dòng)態(tài)的在IE瀏覽器中為對應(yīng)的元素添加樣式:
var tags = cssQuery("a[href='#']");
tags.className="empty";
當(dāng)然,上面的這段js最好使用IE的條件注釋。
使用 jQuery
據(jù)說jQuery的選擇器比cssQuery要快很多。當(dāng)然,無可否認(rèn),jQuery的選擇器是目前流行的js框架中最好用的一個(gè)。而使用jquery來實(shí)現(xiàn)類似上述功能要方便很多,因?yàn)閖Query的選擇器更好用。
OK,jQuery的做法和cssQuery有些類似,CSS可以寫成上面一樣的,JS可以這樣寫:
$("a[href='#']").addClass("empty");
更具體的用法可以查看我之前寫的一個(gè)小例子《使用jQuery創(chuàng)建個(gè)性化鏈接樣式》
使用 DOMAssistant
DOMAssistant也是一個(gè)很不錯(cuò)的JS庫,它提供了一些類似jQuery的功能,比如CSS 選擇器、事件以及一些DOM操作。它的優(yōu)點(diǎn)就是小巧,壓縮后只有9KB,我想這就是Keith Clark選擇DOMAssistant來作為ie-css3.js的基礎(chǔ)框架的主要原因吧。jQuery越來越肥胖了,而且用于實(shí)現(xiàn)這個(gè)功能有些浪費(fèi)了。而且DOMAssistant的用法和jQuery非常類似。
事實(shí)上,DOMAssistant的選擇器和對DOM的CSS Class的操作與jQuery一模一樣。
$("a[href='#']").addClass("empty");
欲了解更多,可查看DOMAssistant官方,以及下載官方中文PDF文檔
總結(jié)
其實(shí),無論是ie-css3.js本身,還是后來我們討論的三種替代方法,都是一種方法,就是用js動(dòng)態(tài)的添加class到頁面元素中。不同是ie-css3自動(dòng)化的完成了這些工作,而后面的三種方案要自己動(dòng)手根據(jù)自己的項(xiàng)目寫一些js來實(shí)現(xiàn)。我認(rèn)為ie-css3最方便,基本不用怎么維護(hù),但是它一刀切,效率比較低,而且靈活性差,不適合于ajax項(xiàng)目。而后面的這幾種方案靈活性強(qiáng),但是要做很多額外的工作,無論你是將IE專用樣式獨(dú)立到一個(gè)專用的css文件中還是像文中寫的那樣和CSS3選擇器寫到一起,都會(huì)大大的增加你的工作量和維護(hù)成本。
為IE,我們要額外付出很多。
相關(guān)文章
- 這篇文章主要介紹了css3選擇器基本介紹,需要的朋友可以參考下2014-12-15
HTML5/CSS3實(shí)現(xiàn)的華麗的日期選擇器源碼
本文要介紹的是一款外觀比較華麗的HTML5/CSS3日歷應(yīng)用,這款日歷應(yīng)用的特點(diǎn)是擁有非??岬娜掌谶x擇效果,鼠標(biāo)滑過日期時(shí)即會(huì)有立體的背景展現(xiàn)出來,相比之前分享的HTML5/CS2014-11-26- 無論是偽類還是偽元素,都屬于CSS選擇器的范疇。所以它們的定義可以在CSS標(biāo)準(zhǔn)的選擇器章節(jié)找到。分別是 CSS2.1 Selectors 和 CSS Selector Level 3,兩者都已經(jīng)是推薦標(biāo)準(zhǔn)2014-09-04
- css偽類選擇器對于大家來說最熟悉的莫過于:link,:focus,:hover之類的了,本文為大家介紹下兩種新增的Css3偽選擇器,感興趣的朋友不要錯(cuò)過2013-12-24
- 今天說說九個(gè)CSS3結(jié)構(gòu)性偽類選擇器2012-04-18
- 前面花了兩節(jié)內(nèi)容分別在《CSS3選擇器——基本選擇器》和《CSS3選擇器——屬性選擇器》介紹了CSS3選擇器中的基本選擇器和屬性選擇器使用方法,今天要和大家一起學(xué)習(xí)CSS3選擇2012-01-21
- 上一切在《CSS3選擇器——基本選擇器》中主要介紹了CSS3選擇器的第一部分,這節(jié)主要和大家一起來學(xué)習(xí)CSS3選擇器的第二部分——屬性選擇器2012-01-21
- CSS的選擇器,我想大家并不會(huì)陌生吧,因?yàn)樘焯煸谑褂?,但對于CSS3的選擇器,要運(yùn)用的靈活到位,我想對很多朋友還是一定的難度,特別是CSS3中的:nth選擇器2012-01-21
- CSS3標(biāo)準(zhǔn)已提出數(shù)年,但是目前能實(shí)現(xiàn)她的瀏覽器并不多,雖然部分瀏覽器能實(shí)現(xiàn)部分規(guī)范,但這又有什么用呢?面對更多的兼容性問題,今天我們就來“前瞻”一下CSS3的一個(gè)偽類2010-07-10
- 用法 你只需要下載Robert Nyman的DOMAssistant腳本和ie-css3.js并將它們在你的頁面的head標(biāo)簽中導(dǎo)入,如下: 復(fù)制代碼代碼如下: <head> <script type="2010-01-21