史上最全的CSShack方式一覽

科技探索者發表於2017-11-20

做前端多年,雖然不是經常需要hack,但是我們經常會遇到各瀏覽器表現不一致的情況。基於此,某些情況我們會極不情願的使用這個不太友好的方式來達到大家要求的頁面表現。我個人是不太推薦使用hack的,要知道一名好的前端,要儘可能不使用hack的情況下實現需求,做到較好的使用者體驗。可是啊,現實太殘酷,瀏覽器廠商之間歷史遺留的問題讓我們在目標需求下不得不向hack妥協,雖然這只是個別情況。今天,結合自己的經驗和理解,做了幾個demo把IE6~IE10和其他標準瀏覽器的CSS hack做一個總結,也許本文應該是目前最全面的hack總結了吧。

什麼是CSS hack

由於不同廠商的流覽器或某瀏覽器的不同版本(如IE6-IE11,Firefox/Safari/Opera/Chrome等),對CSS的支援、解析不一樣,導致在不同瀏覽器的環境中呈現出不一致的頁面展現效果。這時,我們為了獲得統一的頁面效果,就需要針對不同的瀏覽器或不同版本寫特定的CSS樣式,我們把這個針對不同的瀏覽器/不同版本寫相應的CSS code的過程,叫做CSS hack!

CSS hack的原理

由於不同的瀏覽器和瀏覽器各版本對CSS的支援及解析結果不一樣,以及CSS優先順序對瀏覽器展現效果的影響,我們可以據此針對不同的瀏覽器情景來應用不同的CSS。

CSS hack分類

CSS Hack大致有3種表現形式,CSS屬性字首法、選擇器字首法以及IE條件註釋法(即HTML頭部引用if IE)Hack,實際專案中CSS Hack大部分是針對IE瀏覽器不同版本之間的表現差異而引入的。

  • 屬性字首法(即類內部Hack):例如 IE6能識別下劃線”_”和星號” * “,IE7能識別星號” * “,但不能識別下劃線”_”,IE6~IE10都認識”9″,但firefox前述三個都不能認識。

  • 選擇器字首法(即選擇器Hack):例如 IE6能識別*html .class{},IE7能識別*+html .class{}或者*:first-child+html .class{}。

  • IE條件註釋法(即HTML條件註釋Hack):針對所有IE(注:IE10+已經不再支援條件註釋): <!–[if IE]>IE瀏覽器顯示的內容 <![endif]–>,針對IE6及以下版本: <!–[if lt IE 6]>只在IE6-顯示的內容 <![endif]–>。這類Hack不僅對CSS生效,對寫在判斷語句裡面的所有程式碼都會生效。

  

CSS hack書寫順序,一般是將適用範圍廣、被識別能力強的CSS定義在前面。

CSS hack方式一:條件註釋法

 

這種方式是IE瀏覽器專有的Hack方式,微軟官方推薦使用的hack方式。舉例如下

	只在IE下生效
	<!--[if IE]>
	這段文字只在IE瀏覽器顯示
	<![endif]-->
	
	只在IE6下生效
	<!--[if IE 6]>
	這段文字只在IE6瀏覽器顯示
	<![endif]-->
	
	只在IE6以上版本生效
	<!--[if gte IE 6]>
	這段文字只在IE6以上(包括)版本IE瀏覽器顯示
	<![endif]-->
	
	只在IE8上不生效
	<!--[if ! IE 8]>
	這段文字在非IE8瀏覽器顯示
	<![endif]-->
	
	非IE瀏覽器生效
	<!--[if !IE]>
	這段文字只在非IE瀏覽器顯示
	<![endif]-->

CSS hack方式二:類內屬性字首法

屬性字首法是在CSS樣式屬性名前加上一些只有特定瀏覽器才能識別的hack字首,以達到預期的頁面展現效果。

IE瀏覽器各版本 CSS hack 對照表

hack 寫法 例項 IE6(S) IE6(Q) IE7(S) IE7(Q) IE8(S) IE8(Q) IE9(S) IE9(Q) IE10(S) IE10(Q)
* *color 青色 Y Y Y Y N Y N Y N Y
+ +color 綠色 Y Y Y Y N Y N Y N Y
-color 黃色 Y Y N N N N N N N N
_ _color 藍色 Y Y N Y N Y N Y N N
# #color 紫色 Y Y Y Y N Y N Y N Y

相關文章