對於前端開發者來講,世界上存在着一個神奇的東西——IE瀏覽器,尤其是低版本的IE瀏覽器,慘不忍睹的兼容性使其臭名昭著。前端工作者很多的時間都花在了和它打交道上,所以大家紛紛吐槽IE瀏覽器如何的渣,簡直是萬惡之源。但是IE瀏覽器市場份額有非常大,噴完還要接着搞兼容。對於IE瀏覽器來講,我們應該有一個客觀的評價。首先其兼容性差,原因可想而知,更新速度太慢,要幾年才出一個版本,而市場上的FireFox、chrome等瀏覽器幾個月就有一個版本上市。中間那么長的時間足以將其bug充分的暴露出來,其他瀏覽器就沒有bug?當然不是!只是其他瀏覽器更新周期短,bug暴露機會小,而且修復速度快罷了。現在市場上的IE瀏覽器主要有IE6、IE7、IE8、IE9、IE10、IE11等版本,IE5.5基本在市場上消失,所以后面的兼容性問題我們不做討論。就這幾個版本,而且bug主要集中在IE6,所以我們針對他們解決就行了。而其他瀏覽器要是有bug就有點蛋疼了,原因是版本太多,比如Chrome,現在的版本都到30+了。另一方面就是瀏覽器大戰的歷史遺留問題,IE瀏覽器憑借其親爹windows的強大實力占領了令人眼紅的市場份額,似乎想主導整個瀏覽器市場,很多地方自以為是,不與別人一致。舉個例子:Chrome瀏覽器開發出一個好的功能,一般FireFox、Opera、Safari就會趕緊開發出來,並且盡量與其一致,而IE的反應則是要么根本不搭理你,要么實現的時候存在偏差,或者實現完全相同的功能,但是名字一定要跟人家不一樣,妄圖讓其他瀏覽器按照他的規范走,並主導別人。(以上純屬本人惡意猜測)然后呢!大家都看到了,親爹windows不要它了。win10搭載的是Edge瀏覽器,呵呵噠。現在讓我們步入正題,討論一些常用的IE瀏覽器Bug及解決辦法(資歷淺薄,有不對的地方望指正):
PS:IEtester開發者工具不支持濾鏡,只要按照標准寫法寫即可。利用Edge的模仿各版本IE瀏覽器效果並不與真實版本效果一致,修復了部分的Bug,可能是微軟給臉上抹點白。
一、IE的不支持部分
盡量遵守元素嵌套規范,比如不要用p標簽包h標簽。
若一個div中有兩個span,要垂直居中則兩個span都要vertical-align:Middle;
二、兼容性問題及解決辦法
1、IE6雙邊距bug:
在IE6下,塊元素有浮動和橫向margin值,橫向的margin會變成兩倍。和margin方向有關系。
7、IE6下父級元素包不住子級的相對定位
對div進行清除浮動;
19、div#footer 的上面div中的div進行百分比布局時,如果footer不設置寬度,在IE6中footer會被拉上去,
+、設置#footer{width: 100%};這樣會出現上面的問題。上面div的margin-bottom 會消失
+、設置#footer{clear:both;};
三、hack
<!--[if IE]>
這段文字只在IE瀏覽器顯示
<![endif]-->
<!--[if IE 6]>
這段文字只在IE6瀏覽器顯示
<![endif]-->
<!--[if lt IE 8] 這段文字只在IE8瀏覽器以下顯示 <![endif]-->
<!--[if gte IE 6]> 這段文字只在IE6以上(包括)版本IE瀏覽器顯示 <![endif]-->
<!--[if ! IE 8]> 這段文字在非IE8瀏覽器顯示 <![endif]-->
<!--[if !IE]> 這段文字只在非IE瀏覽器顯示 <![endif]-->
2、屬性前綴法:
標准模式下:
#selector{
-color: red; /* 減號和下划線是IE6專有的hack */
color:blue\9; /* \9 IE6-IE10都生效 */
color: pink\0; /* \0 IE8-IE11生效 */
color: green\9\0; /* \9\0 IE9和IE10生效 */
*color: yellow; /* [.*+<>] IE6-IE7生效 */
}
3、選擇器前綴法:
*+html selector{color:blue;} /* *+html前綴只支持IE7 */
注意:
不管是什么方法,書寫的順序都是firefox的寫在前面,IE7的寫在中間,IE6的寫在最后面;
IE6下在!important后面加屬性,會破壞掉前面的優先級。
還有很多其他瀏覽器的hack,這里來不再一一介紹,很多教程,介紹一個比較清楚的 CSS Hack
http://www.duitang.com/static/csshack.html
四、雜碎
1、支持png圖片透明效果:
selector{
background-img: url(xx.jpg);
_filter : progid:DXImageTransform.Microsoft.AlphaImageLoader(src="XX.png", sizingMethod="crop");
}
2、模擬固定定位:
selector{ position: absolute;
top: expression(eval(document.documentElement.scrollTop+(document.documentElement.clientHeight-this.offsetHeight)/2)); }