溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

HTML條件注釋的知識(shí)點(diǎn)有哪些

發(fā)布時(shí)間:2022-02-22 15:26:19 來源:億速云 閱讀:156 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了HTML條件注釋的知識(shí)點(diǎn)有哪些的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇HTML條件注釋的知識(shí)點(diǎn)有哪些文章都會(huì)有所收獲,下面我們一起來看看吧。

最近經(jīng)??吹筋愃七@樣的 HTML 代碼片段,很多前端開發(fā)人員應(yīng)該都熟悉:

1 <!--[if lt IE 7]> <html class="ie6"> <![endif]-->
2 <!--[if IE 7]> <html class="ie7"> <![endif]-->
3 <!--[if IE 8]> <html class="ie8"> <![endif]-->
4 <!--[if gt IE 8]><!--> <html> <!--<![endif]-->

  這段代碼包含了一些條件注釋,它會(huì)根據(jù)瀏覽器的不同選擇性地給<html>標(biāo)記添加(或不添加)一個(gè)包含瀏覽器版本信息的 class屬性。具體來說,對于IE5-IE8,<html>標(biāo)記會(huì)增加一個(gè) class 屬性,屬性值由IE的版本來決定。對于 IE9、較 IE9 更高的IE版本以及非 IE 瀏覽器,<html>保持原樣。這樣,我們就可以針對 IE5-IE8 這些老式瀏覽器來編寫只對它們生效的 CSS 代碼,比如:

1 .foo { color: red;}2 .ie6 .foo { color: yellow;}
3 .ie7 .foo { color: blue;}

進(jìn)一步地,我們就可以避免類似這樣的 CSS hack:

1 /***** 選擇器(Selector) Hacks ******/
2 .foo { color: red;}
3 * html .foo { color: yellow; } 
4 *:first-child+html .foo { color: blue; } 
5 6 /***** 屬性(Attribute) Hacks ******/
7 .foo { color: red; *color: blue; _color: yellow;} 

 使用“HTML條件注釋”來避免 CSS hack,這是一種目前比較流行而且比較安全穩(wěn)定的技術(shù)。這種技術(shù)的代碼有很多版本,再介紹一個(gè)比較有意思的,來自于 HTML5 Boilerplate:  

1 /***** 選擇器(Selector) Hacks ******/
2 .foo { color: red;}
3 * html .foo { color: yellow; } 
4 *:first-child+html .foo { color: blue; } 
5 6 /***** 屬性(Attribute) Hacks ******/
7 .foo { color: red; *color: blue; _color: yellow;}

   文章寫到這里,我感覺,寫了這么多,全是大家可能都知道的事兒。其實(shí),這篇文章的主題,不是討論條件注釋和 CSS hack 孰優(yōu)孰劣,也不是討論哪種條件注釋方案最好,我想講一些條件注釋技術(shù)實(shí)現(xiàn)代碼的細(xì)節(jié)。

  我們聚焦文章的第一段示例代碼??催@段代碼的第一行:

<!--[if lt IE 7]> <html class="ie6"> <![endif]-->

就算我們沒有條件注釋的知識(shí),憑字面我們也能大概猜出這行代碼的作用:在 IE6 或更低版本的瀏覽器中,這行注釋會(huì)被解析成<html class="ie6">。在其他IE瀏覽器(IE7-9)中,它會(huì)被解析成空。在非IE瀏覽器中,毫無疑問,它會(huì)被當(dāng)做我們所熟知的一般 HTML 注釋,它會(huì)被忽略。事實(shí)上,瀏覽器的確是這樣做的。

  在IE條件注釋的概念體系中,一共有兩種條件注釋類型。這種條件注釋的類型被稱作 downlevel-hidden。它的語法是這樣的:

<!--[if expression]> HTML <![endif]-->

語法的細(xì)節(jié)說明可以查看文章結(jié)尾的參考資源。

  在將要討論語法怪異的第四行代碼之前,讓我們先思考一個(gè)問題。憑借現(xiàn)有的 HTML 條件注釋的特性,我們能夠?qū)崿F(xiàn)“IE9、較IE9更高的 IE 版本以及非 IE 瀏覽器中,<html>保持原樣”這一目標(biāo)嗎?

1 <!--[if gt IE 8 | !IE]> <html> <![endif]-->2 ...3 </html>

這樣可以嗎?不可以。IE9 瀏覽器中,注釋條件為真,代碼會(huì)解析為<html>。但是,IE10 以及非IE瀏覽器中,這行代碼會(huì)被忽略,這會(huì)導(dǎo)致 HTML 文檔缺少起始<html>標(biāo)記。從高亮的HTML上,我們可以明顯地看出來。特別強(qiáng)調(diào)一下,微軟已經(jīng)宣布,IE10 不再支持條件注釋。

  憑借現(xiàn)有的 HTML 條件注釋的特性,我們沒有辦法實(shí)現(xiàn)我們的目標(biāo)。怎么辦?

  在 IE 條件注釋的概念體系中,還有另外一種條件注釋類型叫 downlevel-revealed,它的語法是這樣的:

<![if expression]> HTML <![endif]>

很幸運(yùn),我們可以利用 downlevel-revealed 類型的條件注釋來實(shí)現(xiàn)之前的目標(biāo)。

<![if gt IE 8]> <html> <![endif]>

  對于這行代碼瀏覽器的解析是這樣的:在 IE9 中,瀏覽器會(huì)識(shí)別出這是一段條件注釋,并且條件為真,所以這段代碼會(huì)解析為<html>。在IE8-IE5中,注釋的條件為假,故解析為空。在 IE10 以及非 IE 瀏覽器中,<![if gt IE 8]> 以及 <![endif]>會(huì)被當(dāng)做無法識(shí)別的標(biāo)簽,整條代碼最終被解析為<html>。感謝微軟,我們的目標(biāo)實(shí)現(xiàn)了。

  但是,這段代碼,是無法通過(X)HTML驗(yàn)證的。為了能夠通過通過(X)HTML驗(yàn)證,我們可以使用一種改進(jìn)的語法,代碼可以修改為:

<!--[if gt IE 8]--> <html> <!--[endif]-->

 我們增加了4個(gè) --,這使得代碼看起來非常的怪異,這與downlevel-hidden類型有點(diǎn)差別,但它能被IE5-IE9識(shí)別為條件注釋別并處理。對于改進(jìn)過的代碼,IE5-IE8的解析方式不變。IE10以及非IE瀏覽器會(huì)把<!--[if gt IE 8]-->  <!--[endif]-->當(dāng)作一般注釋來解析,最終結(jié)果不變。但是,IE9出問題了:注釋條件仍然為真,解析結(jié)果卻變成了--> <html>。我們再次改進(jìn)一下語法,代碼可以修改為:

<!--[if gt IE 8]<!--> <html> <!--[endif]-->

 我們只是增加了一個(gè) <! 。 對于再次改進(jìn)過的代碼,IE5-IE8的解析方式不變。IE10以及非IE瀏覽器會(huì)把<!--[if gt IE 8]<!-->  <!--[endif]-->當(dāng)作一般注釋來解析,最終結(jié)果不變。IE9的問題被修復(fù)了。

關(guān)于“HTML條件注釋的知識(shí)點(diǎn)有哪些”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“HTML條件注釋的知識(shí)點(diǎn)有哪些”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI