關(guān)于IE8 及以下的兼容性問題

本文分享下我在項(xiàng)目中積累的IE8+兼容性問題的解決方法。根據(jù)我的實(shí)踐經(jīng)驗(yàn)佩研,如果你在寫HTML/CSS時(shí)候是按照W3C推薦的方式寫的复罐,然后下面的幾點(diǎn)都關(guān)注過政供,那么基本上很大一部分IE8+兼容性問題都OK了(這里的IE8+主要是指IE8霸琴,據(jù)個(gè)人目測椒振,IE9+的渲染效果已經(jīng)非常好了)。

前期準(zhǔn)備

測試IE兼容性必須要在Windows中測沈贝,而且是Win7+杠人,因?yàn)閃inXP最高只支持IE8,IE9就呵呵啦宋下!大部分做Web的童鞋都不是使用Windows做為開發(fā)環(huán)境嗡善,要么是Linux發(fā)行版,要么是Mac OS学歧。怎么辦罩引?一般有2種方法:

開Windows虛擬機(jī)

將開發(fā)環(huán)境暫時(shí)切換到Windows

如果你的機(jī)器足夠快,我推薦前一種方式枝笨。但如果機(jī)器不行袁铐,開虛擬機(jī)就會很卡。

我覺得可以把精力集中在這幾個(gè)瀏覽器上:IETester(IE8-IE9)横浑、360瀏覽器剔桨、搜狗瀏覽器、Chrome徙融。IETester測完了建議再用真實(shí)的IE8洒缀、IE9過一遍,以防萬一欺冀。

DOCTYPE

首先需要確保你的HTML頁面開始部分要有DOCTYPE聲明树绩。DOCTYPE告訴瀏覽器使用什么樣的HTML或XHTML規(guī)范來解析HTML文檔,具體會影響:

對標(biāo)記隐轩、attributes 饺饭、properties的約束規(guī)則

對瀏覽器的渲染模式產(chǎn)生影響,不同的渲染模式會影響到瀏覽器對于CSS 代碼甚至 JavaScript 腳本的解析

DOCTYPE是非常關(guān)鍵的职车,目前的最佳實(shí)踐就是在HTML文檔的首行鍵入:

對于DOCTYPE的具體闡述就不展開了瘫俊,可以參考:《正確使用DOCTYPE》、《CS002: DOCTYPE 與瀏覽器模式分析》悴灵。

使用meta標(biāo)簽調(diào)節(jié)瀏覽器的渲染方式

IE8中有一個(gè)“兼容性視圖”的概念扛芽,當(dāng)初IE8發(fā)布時(shí),相對于IE6/7已經(jīng)做出了非常大的改進(jìn)称勋,但是很多老站點(diǎn)僅針對IE6/7進(jìn)行了優(yōu)化,使用IE8渲染反而會一團(tuán)糟涯竟。為了照顧這些苦逼的前端工程師赡鲜,IE8加入了“兼容性視圖”功能空厌,這樣的話就可以在IE8中使用IE6或IE7的內(nèi)核渲染頁面。這個(gè)當(dāng)然不是我們想要的银酬,所以需要使用meta標(biāo)簽來強(qiáng)制IE8使用最新的內(nèi)核渲染頁面嘲更,代碼如下:

IE=edge表示強(qiáng)制使用IE最新內(nèi)核,chrome=1表示如果安裝了針對IE6/7/8等版本的瀏覽器插件Google Chrome Frame(可以讓用戶的瀏覽器外觀依然是IE的菜單和界面揩瞪,但用戶在瀏覽網(wǎng)頁時(shí)赋朦,實(shí)際上使用的是Chrome瀏覽器內(nèi)核),那么就用Chrome內(nèi)核來渲染李破。關(guān)于此meta標(biāo)簽的具體說明宠哄,可參見StackOverflow上的精彩回答

國內(nèi)存在很多雙核瀏覽器比如360瀏覽器嗤攻、搜狗瀏覽器毛嫉,它們是怎么決定某頁面到底使用哪種內(nèi)核渲染?下面引用一段360瀏覽器v6新特性的官方說明

由于眾所周知的情況妇菱,國內(nèi)的主流瀏覽器都是雙核瀏覽器:基于Webkit內(nèi)核用于常用網(wǎng)站的高速瀏覽承粤。基于IE的內(nèi)核用于兼容網(wǎng)銀闯团、舊版網(wǎng)站辛臊。以360的幾款瀏覽器為例,我們優(yōu)先通過Webkit內(nèi)核渲染主流的網(wǎng)站房交,只有小量的網(wǎng)站通過IE內(nèi)核渲染彻舰,以保證頁面兼容。在過去很長一段時(shí)間里涌萤,我們主要的控制手段是一個(gè)幾百k大小網(wǎng)址庫淹遵,一個(gè)通過長期人工運(yùn)營收集的網(wǎng)址庫。

盡管我們努力通過用戶反饋负溪、代碼標(biāo)簽智能判斷技術(shù)提高瀏覽器的自動(dòng)切核準(zhǔn)確率透揣。但是在很多情況下,我們?nèi)匀粺o法達(dá)到百份百正確川抡。因此辐真,我們新增加了一個(gè)控制手段:內(nèi)核控制Meta標(biāo)簽。只要你在自己的網(wǎng)站里增加一個(gè)Meta標(biāo)簽崖堤,告訴360瀏覽器這個(gè)網(wǎng)址應(yīng)該用哪個(gè)內(nèi)核渲染侍咱,那么360瀏覽器就會在讀取到這個(gè)標(biāo)簽后,立即切換對應(yīng)的內(nèi)核密幔。并將這個(gè)行為應(yīng)用于這個(gè)二級域名下所有網(wǎng)址楔脯。

解決方法360已經(jīng)告訴我們了,通過meta標(biāo)簽的方式建議其使用Webkit胯甩,代碼如下:

我沒有做細(xì)致的調(diào)查昧廷,不知道其他的雙核瀏覽器是否支持此特性堪嫂。

Media Query

IE8似乎無法識別Media Query,所以需要hack一下啦木柬!推薦采用Respond.js解決此問題皆串,具體方法參見它的文檔即可。

實(shí)現(xiàn)CSS3的某些特性

IE8不支持CSS3的很多新特性眉枕,不過我們可以使用一些比較成熟的hack方法恶复,我采用的是CSS3 PIE,它支持的特性有這些:border-radius速挑、box-shadow谤牡、border-image、multiple background images梗摇、linear-gradient等拓哟。

特別注意:請一定閱讀CSS PIE給出的Know Issues

識別HTML5元素

如果你在前端代碼中使用了HTML5的新標(biāo)簽(nav/footer等)伶授,那么在IE中這些標(biāo)簽可能無法正常顯示断序。

關(guān)于max-width

還有一個(gè)在IE8中經(jīng)常遇到的問題就是max-width,網(wǎng)頁中圖片的尺寸可能比較寬糜烹,我會給它設(shè)置max-width: 100%來限制其寬度最大為父容器的寬度违诗,但是有時(shí)候卻不奏效,慢慢摸索才得知IE解析max-width所遵循的規(guī)則:嚴(yán)格要求直接父元素的寬度是固定的疮蹦。經(jīng)實(shí)驗(yàn)發(fā)現(xiàn)Chrome所遵守的規(guī)則比IE松一些诸迟,所以這個(gè)問題應(yīng)該不歸屬為IE兼容性問題,不過我還是提一下吧愕乎。

placeholder

IE8下不支持HTML5屬性placeholder阵苇,不過為解決此問題的js插件挺多的,比如:jquery-placeholder感论。

last-child

first-child是CSS2的內(nèi)容绅项,但是last-child就不是了,所以IE8不買賬比肄。推薦的做法不是使用last-child快耿,而是給最后一個(gè)元素設(shè)置一個(gè).last的class,然后對此進(jìn)行樣式設(shè)置芳绩,這樣就全部兼容了掀亥。

background-size: cover

如果你想使用background-size: cover設(shè)置全屏背景,很遺憾IE8辦不到...但可以使用IE獨(dú)有的AlphaImageLoader濾鏡來實(shí)現(xiàn)妥色,添加一條如下的CSS樣式:

filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=Enabled, sizingMethod=Size , src=URL)

將sizingMethod設(shè)置為scale就OK了搪花。

還沒完,如果你在此背景之上放置了鏈接,那這個(gè)鏈接是無法點(diǎn)擊的撮竿。一般情況下的解決辦法是為鏈接或按鈕添加position:relative使其相對浮動(dòng)丁稀。

filter blur

CSS3中提供支持濾鏡效果的屬性filter,比如支持高斯模糊效果的blur(類似iOS7的效果):

filter:blur(10px);-webkit-filter:blur(10px);-moz-filter:blur(10px);

IE8對filter: blur(10px)的顯示效果是對HTML元素進(jìn)行小范圍的模糊處理倚聚,這個(gè)效果并不是高斯模糊,要想支持高斯模糊凿可,需要如下設(shè)置:

filter:progid:DXImageTransform.Microsoft.Blur(PixelRadius='10');

在實(shí)踐中發(fā)現(xiàn)一個(gè)坑就是惑折,所有position: relative的元素都不會生效。

其他的發(fā)現(xiàn)是枯跑,IE9對filter: blur(10px)無效惨驶,而對filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius='10');是針對元素小范圍的模糊效果。

以上就是我在開發(fā)中遇到的IE瀏覽器的兼容性問題敛助。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粗卜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子纳击,更是在濱河造成了極大的恐慌续扔,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,331評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件焕数,死亡現(xiàn)場離奇詭異纱昧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)堡赔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評論 3 398
  • 文/潘曉璐 我一進(jìn)店門识脆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人善已,你說我怎么就攤上這事灼捂。” “怎么了换团?”我有些...
    開封第一講書人閱讀 167,755評論 0 360
  • 文/不壞的土叔 我叫張陵悉稠,是天一觀的道長。 經(jīng)常有香客問我啥寇,道長偎球,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,528評論 1 296
  • 正文 為了忘掉前任辑甜,我火速辦了婚禮衰絮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘磷醋。我一直安慰自己猫牡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,526評論 6 397
  • 文/花漫 我一把揭開白布邓线。 她就那樣靜靜地躺著淌友,像睡著了一般煌恢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上震庭,一...
    開封第一講書人閱讀 52,166評論 1 308
  • 那天瑰抵,我揣著相機(jī)與錄音,去河邊找鬼器联。 笑死二汛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拨拓。 我是一名探鬼主播肴颊,決...
    沈念sama閱讀 40,768評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼渣磷!你這毒婦竟也來了婿着?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,664評論 0 276
  • 序言:老撾萬榮一對情侶失蹤醋界,失蹤者是張志新(化名)和其女友劉穎竟宋,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體形纺,經(jīng)...
    沈念sama閱讀 46,205評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袜硫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,290評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挡篓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婉陷。...
    茶點(diǎn)故事閱讀 40,435評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖官研,靈堂內(nèi)的尸體忽然破棺而出秽澳,到底是詐尸還是另有隱情,我是刑警寧澤戏羽,帶...
    沈念sama閱讀 36,126評論 5 349
  • 正文 年R本政府宣布担神,位于F島的核電站,受9級特大地震影響始花,放射性物質(zhì)發(fā)生泄漏妄讯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,804評論 3 333
  • 文/蒙蒙 一酷宵、第九天 我趴在偏房一處隱蔽的房頂上張望亥贸。 院中可真熱鬧,春花似錦浇垦、人聲如沸炕置。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,276評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽朴摊。三九已至默垄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間甚纲,已是汗流浹背口锭。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留介杆,地道東北人讹弯。 一個(gè)月前我還...
    沈念sama閱讀 48,818評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像这溅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子棒仍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,442評論 2 359

推薦閱讀更多精彩內(nèi)容