您的位置:首頁 > 設計教程 > 網頁設計 > 內頁

前端寶典:經典的CSS hack方法(解決IE6-IE11,Firefox/Safari/Opera/Chrome兼容問題)

核心提示: 前端經常會遇到各瀏覽器表現不一致的情況,某些情況我們會極不情愿的使用這個不太友好的方式來達到大家要求的頁面表現,要知道一名好的前端,要盡可能不使用hack的情況下實現需求,做到較好的用戶體驗。

做前端多年,雖然不是經常需要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+已經不再支持條件注釋): ,針對IE6及以下版本: 。這類Hack不僅對CSS生效,對寫在判斷語句里面的所有代碼都會生效。

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

CSS hack方式一:條件注釋法

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

只在IE下生效

只在IE6下生效

只在IE6以上版本生效

只在IE8上不生效

非IE瀏覽器生效

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
\0 color:red\0 紅色 N N N N Y N Y N Y N
\9\0 color:red\9\0 粉色 N N N N N N Y N Y N
!important color:blue !important;color:green; 棕色 N N Y N Y N Y N Y Y

說明:在標準模式中

“-″減號是IE6專有的hack

“\9″ IE6/IE7/IE8/IE9/IE10都生效

“\0″ IE8/IE9/IE10都生效,是IE8/9/10的hack

“\9\0″ 只對IE9/IE10生效,是IE9/10的hack

demo如下

body:nth-of-type(1).iehack{

color:#F00;/*對WindowsIE9/Firefox7+/Opera10+/所有Chrome/Safari的CSShack,選擇器也適用幾乎全部Mobile/Linux/Macbrowser*/

}

.demo1,.demo2,.demo3,.demo4{

width:100px;

height:100px;

}

.hack{

/*demo1*/

/*demo1注意順序,否則IE6/7下可能無法正確顯示,導致結果顯示為白色背景*/

background-color:red;/*Allbrowsers*/

background-color:blue!important;/*AllbrowsersbutIE6*/

*background-color:black;/*IE6,IE7*/

+background-color:yellow;/*IE6,IE7*/

background-color:gray\9;/*IE6,IE7,IE8,IE9,IE10*/

background-color:purple\0;/*IE8,IE9,IE10*/

background-color:orange\9\0;/*IE9,IE10*/

_background-color:green;/*OnlyworksinIE6*/

*+background-color:pink;/*WARNING:OnlyworksinIE7?Isitright?*/

}

/*可以通過javascript檢測IE10,然后給IE10的

標簽加上class=”ie10″這個類*/

.ie10#hack{

color:red;/*OnlyworksinIE10*/

}

/*demo2*/

.iehack{

/*該demo實例是用于區分標準模式下ie6~ie9和Firefox/Chrome的hack,注意順序

IE6顯示為:綠色,

IE7顯示為:黑色,

IE8顯示為:紅色,

IE9顯示為:藍色,

Firefox/Chrome顯示為:橘色,

(本例IE10效果同IE9,Opera最新版效果同IE8)

*/

background-color:orange;/*all-forFirefox/Chrome*/

background-color:red\0;/*ie8/9/10/Opera-forie8/ie10/Opera*/

background-color:blue\9\0;/*ie9/10-forie9/10*/

*background-color:black;/*ie6/7-forie7*/

_background-color:green;/*ie6-forie6*/

}

/*demo3

實例是用于區分標準模式下ie6~ie9和Firefox/Chrome的hack,注意順序

IE6顯示為:紅色,

IE7顯示為:藍色,

IE8顯示為:綠色,

IE9顯示為:粉色,

Firefox/Chrome顯示為:橘色,

(本例IE10效果同IE9,Opera最新版效果也同IE9為粉色)

*/

.element{

background-color:orange;/*allIE/FF/CH/OP*/

}

.element{

*background-color:blue;/*IE6+7,doesn'tworkinIE8/9asIE7*/

}

.element{

_background-color:red;/*IE6*/

}

.element{

background-color:green\0;/*IE8+9+10*/

}

:root.element{background-color:pink\0;}/*IE9+10*/

/*demo4*/

/*

該實例是用于區分標準模式下ie6~ie10和Opera/Firefox/Chrome的hack,本例特別要注意順序

IE6顯示為:橘色,

IE7顯示為:粉色,

IE8顯示為:黃色,

IE9顯示為:紫色,

IE10顯示為:綠色,

Firefox顯示為:藍色,

Opera顯示為:黑色,

Safari/Chrome顯示為:灰色,

*/

.hacktest{

background-color:blue;/*都識別,此處針對firefox*/

background-color:red\9;/*allie*/

background-color:yellow\0;/*forIE8/IE9/10最新版opera也認識*/

+background-color:pink;/*forie6/7*/

_background-color:orange;/*forie6*/

}

@mediascreenand(min-width:0){

.hacktest{background-color:black\0;}/*opera*/

}

@mediascreenand(min-width:0){

.hacktest{background-color:purple\9;}/*forIE9/IE10PS:國外有些習慣常寫作\0,根本沒考慮Opera也認識\0的實際*/

}

@mediascreenand(-ms-high-contrast:active),(-ms-high-contrast:none){

.hacktest{background-color:green;}/*forIE10+此寫法可以適配到高對比度和默認模式,故可覆蓋所有ie10的模式*/

}

@mediascreenand(-webkit-min-device-pixel-ratio:0){.hacktest{background-color:gray;}}/*forChrome/Safari*/

/*#963棕色:rootisforIE9/IE10,優先級高于@media,慎用!如果二者合用,必要時在@media樣式加入!important才能區分IE9和IE10*/

/*

:root.hacktest{background-color:#963\9;}

*/

 

demo1是測試不同IE瀏覽器下hack 的顯示效果

IE6顯示為:粉色,

IE7顯示為:粉色,

IE8顯示為:藍色,

IE9顯示為:藍色,

Firefox/Chrome/Opera顯示為:藍色,

文章源自 設計聯盟 www.vfazluf.cn 中國最具影響力的創意設計綜合網站

編輯:Beach

搜索推薦
設計聯盟官方微信
設計聯盟官方微信
微信公眾號:designlinks
掃一掃 訂閱最新資訊
回到頂部
四川麻将换三张下载 股票短线经验 好运彩是个什么平台 大发快三首页 河北快3开奖直播 融资融券的股票 幸运5分彩官方开奖 国盛配资 手机炒股app制作 南京配资网 甘肃十一选五前三基本走势 山西十一选五中奖规则 体彩11选五助手 黑龙江省p62开奖结果 智慧农业股票趋势 今天排列三开奖号码 陕西体彩高频十一选五推荐号