對於前端開發者來說,世界上存在着一個神奇的東西——IE瀏覽器,尤爲是低版本的IE瀏覽器,慘不忍睹的兼容性使其臭名昭著。前端工做者不少的時間都花在了和它打交道上,因此你們紛紛吐槽IE瀏覽器如何的渣,簡直是萬惡之源。可是IE瀏覽器市場份額有很是大,噴完還要接着搞兼容。對於IE瀏覽器來說,咱們應該有一個客觀的評價。首先其兼容性差,緣由可想而知,更新速度太慢,要幾年纔出一個版本,而市場上的FireFox、chrome等瀏覽器幾個月就有一個版本上市。中間那麼長的時間足以將其bug充分的暴露出來,其餘瀏覽器就沒有bug?固然不是!只是其餘瀏覽器更新週期短,bug暴露機會小,並且修復速度快罷了。如今市場上的IE瀏覽器主要有IE六、IE七、IE八、IE九、IE十、IE11等版本,IE5.5基本在市場上消失,因此後面的兼容性問題咱們不作討論。就這幾個版本,並且bug主要集中在IE6,因此咱們針對他們解決就好了。而其餘瀏覽器要是有bug就有點蛋疼了,緣由是版本太多,好比Chrome,如今的版本都到30+了。另外一方面就是瀏覽器大戰的歷史遺留問題,IE瀏覽器憑藉其親爹windows的強大實力佔領了使人眼紅的市場份額,彷佛想主導整個瀏覽器市場,不少地方自覺得是,不與別人一致。舉個例子:Chrome瀏覽器開發出一個好的功能,通常FireFox、Opera、Safari就會趕忙開發出來,而且儘可能與其一致,而IE的反應則是要麼根本不搭理你,要麼實現的時候存在誤差,或者實現徹底相同的功能,可是名字必定要跟人家不同,妄圖讓其餘瀏覽器按照他的規範走,並主導別人。(以上純屬本人惡意猜想)而後呢!你們都看到了,親爹windows不要它了。win10搭載的是Edge瀏覽器,呵呵噠。如今讓咱們步入正題,討論一些經常使用的IE瀏覽器Bug及解決辦法(資歷淺薄,有不對的地方望指正):css
PS:IEtester開發者工具不支持濾鏡,只要按照標準寫法寫便可。利用Edge的模仿各版本IE瀏覽器效果並不與真實版本效果一致,修復了部分的Bug,多是微軟給臉上抹點白。html
1、IE的不支持部分前端
儘可能遵照元素嵌套規範,好比不要用p標籤包h標籤。chrome
若一個div中有兩個span,要垂直居中則兩個span都要vertical-align:Middle;express
2、兼容性問題及解決辦法windows
一、IE6雙邊距bug:瀏覽器
在IE6下,塊元素有浮動和橫向margin值,橫向的margin會變成兩倍。和margin方向有關係。ssh
七、IE6下父級元素包不住子級的相對定位工具
<!--[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]-->
二、屬性前綴法:佈局
標準模式下:
#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生效 */
}
三、選擇器前綴法:
*+html selector{color:blue;} /* *+html前綴只支持IE7 */
注意:
不論是什麼方法,書寫的順序都是firefox的寫在前面,IE7的寫在中間,IE6的寫在最後面;
IE6下在!important後面加屬性,會破壞掉前面的優先級。
還有不少其餘瀏覽器的hack,這裏來再也不一一介紹,不少教程,介紹一個比較清楚的 CSS Hack
http://www.duitang.com/static/csshack.html
4、雜碎
一、支持png圖片透明效果:
selector{
background-img: url(xx.jpg);
_filter : progid:DXImageTransform.Microsoft.AlphaImageLoader(src="XX.png", sizingMethod="crop");
}
二、模擬固定定位:
selector{ position: absolute;
top: expression(eval(document.documentElement.scrollTop+(document.documentElement.clientHeight-this.offsetHeight)/2)); }