1. 程式人生 > >CSS Hack寫法與IE6下的常見Bug

CSS Hack寫法與IE6下的常見Bug

    總結一下本人在IE6、IE7下使用的CSS Hack寫法,以防哪天又遇到需要相容IE6、7的任務。

一 CSS Hack

由於不同廠商的流覽器或某瀏覽器的不同版本(如IE6-IE11,Firefox/Safari/Opera/Chrome等),對CSS的支援、解析不一樣,導致同樣的CSS在不同瀏覽器的環境中呈現出不一致的頁面展現效果。

這時為了獲得統一的頁面效果,就需要針對不同的瀏覽器或不同版本寫特定的CSS樣式,把針對不同的瀏覽器/不同版本寫相應的CSS程式碼的過程,叫做CSS Hack

• 屬性字首法(即類內部Hack):例如 IE6能識別下劃線”_“和星號” *

“,IE7能識別星號” * “和加號”+“,但不能識別下劃線”_”,IE6~IE9都認識”\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生效,對寫在判斷語句裡面的所有程式碼都會生效。

根據這張圖先給出結論:

IE6識別 *_\9
IE7識別 *+\9
IE8識別 \9\0
上述幾種符號在FireFox上、Chrome都不識別
(IE各版本在標準和怪異模式下可識別的字首詞請參考:http://blog.csdn.net/freshlover/article/details/12132801

第一和第二種CSS Hack方式都可以使用此結論。

下面我們用例子說明

<style>
/*選擇器字首法*/
#cshk{ height
:20px
; }
//所有瀏覽器都識別 *html #cshk {height:50px; }//僅IE6識別 *+html #cshk {height:80px; }//僅IE7識別 /*屬性字首法*/ #color{ /*書寫順序為所有瀏覽器的樣式在最前,其次是IE8、IE7,最後是IE6。 */ color:red;//所有瀏覽器都識別 color:blue\9;//IE9及以下均識別 color:blue\0;//僅IE8識別 +color:orange;//僅IE7識別 _color:green;//僅IE6識別 }
</style>

二 IE6下的Bug

inline-block

IE6/IE7下對display:inline-block的支援性不好。
1、inline元素的display屬性設定為inline-block時,所有的瀏覽器都支援;
2、block元素的display屬性設定為inline-block時,IE6/IE7瀏覽器是不支援的;

IE6下塊元素如何實現display:inline-block的效果?

有兩種方法:
1、 先使用display:inline-block屬性觸發塊元素,然後再定義display:inline,讓塊元素呈遞為內聯物件(兩個display 要先後放在兩個CSS宣告中才有效果,這是IE的一個經典bug,如果先定義了display:inline-block,然後再將display設回 inline或block,layout不會消失)。程式碼如下(…為省略的其他屬性內容):

div {display:inline-block;…}
div {display:inline;}

2、直接讓塊元素設定為內聯物件呈遞(設定屬性display:inline),然後觸發塊元素的layout(如:zoom:1 或float屬性等)。程式碼如下:

div { display:inline-block; _zoom:1;_display:inline;} /*推薦IE6*/
div { display:inline-block; *zoom:1;*display:inline;} /*推薦:IE6、7*/

margin雙倍bug

注意: 該bug只會出現在IE6上。

出現這個bug需要具備三個條件:
    1、瀏覽器為IE6,大於IE6的ie系列版本和火狐等其他瀏覽器不會出現這個情況。
    2、物件設定了float屬性,如.ILeft { float: left;}
    3、物件設定了margin屬性,如.ILeft { float: left; width: 150px; margin-left: 15px}

以上的class=ILeft的層在IE6下瀏覽就會出現左邊距為30px的情況,而不是正常想象中的15px。

解決辦法是
給物件的css屬性加上 display:inline 即可解決該bug
程式碼:.ILeft { float: left; width: 150px; margin-left: 15px; display:inline}

再次重新整理網頁,在IE6下的margin雙倍的bug就消失了

參考文件