瀏覽器兼容

CSS Hack

不同的瀏覽器對某些CSS代碼解析會存在一定的差異,因此就會導(dǎo)致不同瀏覽器下給用戶展示的頁面效果不一樣炊邦,碰到這樣的情況就需要開發(fā)人員通過針對不同的瀏覽器對應(yīng)寫出不同的CSS代碼埃碱,從而達到兼容不同瀏覽器的目的旅挤,不會讓頁面因為瀏覽器的不同而產(chǎn)生有差異的顯示饵婆,這種技術(shù)有個專門的名稱就是CSS Hack礼华。

在中國咐鹤,這種差異主要是體現(xiàn)在主流瀏覽器上,我們只要解決了主流瀏覽器之間的CSS差異就可以了圣絮。目前流行的主流瀏覽器有Internet Explorer,Google Chrome,FireFox,Apple Safair以及Opera,在本文里對應(yīng)簡稱為IE(后面如果添加數(shù)字祈惶,數(shù)字代表版本號,例如IE8)扮匠。

CSS Hack原理是通過不同瀏覽器自身所帶有的特別標(biāo)識符以及CSS中優(yōu)先級的機制來實現(xiàn)不同瀏覽器里CSS樣式兼容性的問題捧请。

CSS Hack有三種實現(xiàn)方式,它們分別是:CSS類內(nèi)部的Hack棒搜、CSS選擇器的Hack和HTML頭部的Hack疹蛉。

CSS類內(nèi)部的Hack:是指CSS屬性或?qū)傩灾道锛由现挥心硞€瀏覽器自己可以識別的特殊字符串。例如IE6和IE7都會識別在CSS里屬性名稱前加上“*”號的屬性力麸,但是firefox卻無法識別帶“*”號的屬性可款,因此下面的代碼:
body{
background:green;/* firefox下的顯示 * /
*background:red; /* IE6和IE7下的顯示 * /
}
CSS選擇器的Hack:它是指在CSS選擇器前面加上只有某種瀏覽器自己可以識別的特殊字符串。例如:IE6能識別*html .class{}克蚂,IE7能識別*+html .class{}闺鲸。

HTML頭部的Hack:這種方式主要是針對IE瀏覽器,IE瀏覽器是廣大Web前端工程師的痛埃叭,它不僅有很多自己獨有的區(qū)別于其他瀏覽器的CSS樣式摸恍,自己不同版本之間的CSS實現(xiàn)也會存在很大的差異。下面我們來看看這種方式的寫法:


<link src="iecss.css" rel="stylesheet" />
<![endif]-->

lt   小于
gt  大于
gte  大于或等于
lte  小于或等于
赤屋!   非

這種寫法會被非IE的瀏覽器所忽略误墓,只有IE瀏覽器才會執(zhí)行上面的代碼,上面這段代碼的意思是當(dāng)IE的版本是8或者比8低的IE瀏覽器才會執(zhí)行下面的樣式益缎。

下面我們來看一段代碼:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>CSS hack技術(shù)</title>
</head>
<style type="text/css">
div {
width:400px;
height:120px;
margin-bottom:20px;
border-style:solid;
border-width:1px;
}
div.d01{
background:red;/* FF */ background:blue\0;/* OP */ background:turquoise\9;/* IE8+ */ [background:red;background:black;/* SA,CH */
*background:green; /* IE7 */ _background:yellow;/* IE6 */
}</style>
<body>
<div class="d01">
</div>
</body>
</html>

運行這個頁面,firefox顯示的顏色是red然想,opera為blue莺奔,ie6為yellow,ie7為green,ie8以上的版本是turquoise令哟,chrome和safari為blcak恼琼。這個CSS Hack是我平時常用的一套模式。這里要說明下屏富,ie8以上包括ie8的CSS樣式差異性較少晴竞,而chrome和safari之間的CSS樣式差異較小,因此這里我并沒有為它們單獨進行hack狠半。
  如果我們把上面代碼里的div.d01的內(nèi)容順序調(diào)整下噩死,例如下面這樣:
background:blue\0;/* OP\ */ background:turquoise\9;/* IE8+ */ [background:red;background:black;/* SA,CH */ *background:green; /* IE7 */ _background:yellow;/* IE6 */ background:red;/* FF */

我們會發(fā)現(xiàn)不同瀏覽器顯示的效果就會發(fā)生變化。ie8以上的版本以及opera顯示正常神年,但是chrome已维,safari,ie6已日,ie7顯示的是紅色垛耳,而firefox則沒有任何顏色。引起這個問題的原因是CSS優(yōu)先級的問題飘千,例如background:turquoise\9;這種寫法不會導(dǎo)致高版本的ie在顯示上產(chǎn)生偏差堂鲜,是因為高版本的ie會優(yōu)先使用這個樣式,對于同級別的CSS樣式护奈,最后面的樣式會覆蓋前面的樣式缔莲,例如我們在ie6和ie7下看到的情況,此外逆济,如果正確的樣式前面的樣式寫法導(dǎo)致瀏覽器無法正常解析酌予,那么就會導(dǎo)致整個CSS樣式加載的失敗,例如firefox奖慌。
  因此編寫CSS Hack時候抛虫,對于屬性排列的順序是特別注意的。
  CSS Hack是一個總結(jié)性和經(jīng)驗性很強的技術(shù)简僧,它不像很多編程技術(shù)那樣需要我們?nèi)シ磸?fù)理解一些邏輯上的關(guān)系建椰,而是需要我們平時多留心,多實踐岛马。接下來我將會列舉不同瀏覽器之間的CSS Hack技術(shù)棉姐,大家可以根據(jù)自己實際的情況選擇應(yīng)用。
  對于ie啦逆,我們這邊主要考慮ie6伞矩,ie7,ie8夏志,ie9乃坤,這四種版本的ie是目前中國市場上最流行的ie版本,雖然ie10已經(jīng)出來,但是ie10現(xiàn)在使用的用戶相對較少湿诊,這邊不會作為重點講解狱杰。
  對于CSS類內(nèi)部的Hack ,ie6有自己專有的判斷標(biāo)識“”,其他的瀏覽器都不會識別””,ie6也支持”*”厅须,但是“*”也被ie7識別仿畸,因此當(dāng)我們只想?yún)^(qū)別ie6和ie7的時候,可以按下面的代碼書寫:
div.d02{ *background:green; /* IE7\ */ _background:yellow;/* IE6 */}

上面的寫法既可以區(qū)分ie6和ie7朗和,但是如果我們顛倒其位置错沽,那么不管是ie6還是ie7都會顯示green顏色±。”*”和“_”是ie6和ie7專屬的甥捺,其他版本的瀏覽器都不支持該標(biāo)記。
  ie6和ie7除了上面兩個專屬標(biāo)記镀层,IE6還能識別能識別*html selector{}镰禾,IE7還能能識別*+html . selector {},大家看下面這段代碼:
*html div.d03{ background:yellow;/* IE6 */}*+html div.d03{ background:green;/* IE7 */}

這兩種寫法是等價的唱逢。IE6的*html selector {}和IE7的*+html . selector {}也都是專有標(biāo)記吴侦,別的瀏覽器都不會識別的。
  還有個很有趣的標(biāo)記坞古,就是!important备韧,在網(wǎng)上很多資料說該標(biāo)記IE6不支持,IE7和firefox支持痪枫,為了驗證網(wǎng)上說法本人寫了下面的樣式:
div.d04{ background:red !important; }

使用的瀏覽器配置如下:
  支持IE7织堂,IE8,IE9奶陈;IE6通過ietester實現(xiàn)易阳;firefox版本是23.0.1;chrome的版本是27.0.1453.116 m吃粒;opera的版本是12.12潦俺,運行上面的樣式實際的效果是:
  IE6,IE7徐勃,chrome事示,safari顯示為紅色,而 其他瀏覽器都沒有顯示任何顏色僻肖。

瀏覽器兼容的思路

  • 要不要做

    產(chǎn)品的角度(產(chǎn)品的受眾肖爵、受眾的瀏覽器比 例、效果優(yōu)先還是基本功能優(yōu)先)
    成本的角度 (有無必要做某件事)
    做到什么程度

  • 讓哪些瀏覽器支持哪些效果
    如何做

  • 根據(jù)兼容需求選擇技術(shù)框架/庫(jquery)

    1. Bootstrap (>=ie8)
    2. jQuery 1.~ (>=ie6), jQuery 2.~ (>=ie9)
    3. Vue (>= ie9)
    
  • 根據(jù)兼容需求選擇兼容工具(html5shiv.js臀脏、respond.js劝堪、css reset法挨、normalize.css、Modernizr)

  • postCSS

  • 條件注釋幅聘、CSS Hack、js 能力檢測做一些修補

漸進增強和優(yōu)雅降級

** 漸進增強 (progressive enhancement)**

  • 針對低版本瀏覽器進行構(gòu)建頁面窃植,保證最基本的功能帝蒿,然后再針對高級瀏覽器進行效果、交互等改進和追加功能達到更好的用戶體驗巷怜。

優(yōu)雅降級 (graceful degradation)

  • 一開始就構(gòu)建完整的功能葛超,然后再針對低版本瀏覽器進行兼容。

瀏覽器兼容的寫法

  1. 條件注釋:
    <!–-[if IE 7]><link rel="stylesheet" href="ie7.css" type="text/css" /><![endif]–->

  2. 屬性選擇器
    .box{
    color: red;
    _color: blue; /*ie6*/
    *color: pink; /*ie6 7*/
    color: yellow\9; /*ie/edge 6-8*/
    }

  3. 選擇器前綴法
    *html //只對IE6生效
    *+html //只對IE7生效
    @media screen\9{...} //只對IE6 7生效

  4. 條件注釋結(jié)合類選擇器

    <html dir="ltr" lang="en-US" class="no-js">

  5. 利用Modernizr工具

  • 條件注釋
    在HTML源碼中被IE有條件解釋的語句延塑,可被用來向IE提供及隱藏代碼绣张。
    但使用了條件注釋的頁面只能在IE9中正常工作,IE10不再支持條件注釋关带。
    項目 范例 說明
  • IE Hack
    針對不同的IE瀏覽器編寫不同的CSS侥涵,從而使IE能夠渲染出預(yù)期效果的過程。

  • js 能力檢測
    使用JS的語法檢測瀏覽器支持的屬性宋雏,以便展示效果

  • html5shiv.js
    用來在 IE6芜飘、7、8 中模擬實現(xiàn) html5 的標(biāo)簽磨总,以實現(xiàn)對 IE 6嗦明、7、8 的兼容

  • respond.js
    在IE6蚪燕、7中模擬實現(xiàn)CSS3的媒體查詢娶牌,實現(xiàn)響應(yīng)式

  • css reset
    用來完全去除瀏覽器的默認(rèn)樣式

  • normalize.css
    是css reset的改良版,在css reset的基礎(chǔ)上保護有用的瀏覽器默認(rèn)樣式馆纳、為大部分HTML元素提供一般化的樣式诗良、修復(fù)瀏覽器自身的bug并保證各瀏覽器的一致性、使用一些小技巧優(yōu)化CSS可用性厕诡、用注釋和詳細的文檔來解釋代碼累榜。

  • Modernizr
    Modernizr是一 個 JavaScript 庫,用于檢測用戶瀏覽器的 HTML5 與 CSS3 特性

  • postCSS
    PostCSS是一個JS插件轉(zhuǎn)換樣式表的工具灵嫌,這些插件能夠檢驗?zāi)愕腃SS壹罚、支持變量和混合,轉(zhuǎn)化css3的新特性語法寿羞、行內(nèi)圖片等猖凛。

一般在哪個網(wǎng)站查詢屬性兼容性?

可以使用 caniuse.com來查詢CSS屬性兼容情況绪穆,使用browserhacks.com來查詢?yōu)g覽器兼容的寫法辨泳。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末虱岂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子菠红,更是在濱河造成了極大的恐慌第岖,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件试溯,死亡現(xiàn)場離奇詭異蔑滓,居然都是意外死亡,警方通過查閱死者的電腦和手機遇绞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門键袱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人摹闽,你說我怎么就攤上這事蹄咖。” “怎么了付鹿?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵澜汤,是天一觀的道長。 經(jīng)常有香客問我倘屹,道長银亲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任纽匙,我火速辦了婚禮务蝠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘烛缔。我一直安慰自己馏段,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布践瓷。 她就那樣靜靜地躺著院喜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪晕翠。 梳的紋絲不亂的頭發(fā)上喷舀,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天,我揣著相機與錄音淋肾,去河邊找鬼硫麻。 笑死,一個胖子當(dāng)著我的面吹牛樊卓,可吹牛的內(nèi)容都是我干的拿愧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼碌尔,長吁一口氣:“原來是場噩夢啊……” “哼浇辜!你這毒婦竟也來了券敌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤柳洋,失蹤者是張志新(化名)和其女友劉穎待诅,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熊镣,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡咱士,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了轧钓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡锐膜,死狀恐怖毕箍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情道盏,我是刑警寧澤而柑,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站荷逞,受9級特大地震影響媒咳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜种远,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一涩澡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坠敷,春花似錦妙同、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至限次,卻和暖如春芒涡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卖漫。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工费尽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人懊亡。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓依啰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親店枣。 傳聞我的和親對象是個殘疾皇子速警,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,700評論 2 345

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

  • 做前端多年叹誉,雖然不是經(jīng)常需要hack,但是我們經(jīng)常會遇到各瀏覽器表現(xiàn)不一致的情況闷旧〕せ恚基于此,某些情況我們會極不情愿的...
    大女表哥閱讀 1,088評論 0 9
  • 一忙灼、如何調(diào)試 IE 瀏覽器匠襟? 在IE7以上的版本中可以通過按快捷鍵F12調(diào)出開發(fā)人員調(diào)試框,如下圖IE7以上調(diào)試工...
    dengpan閱讀 543評論 0 2
  • 1.如何調(diào)試 IE 瀏覽器 IE7以上(包括Edge)自帶開發(fā)者工具该园。Edge: 安裝虛擬機酸舍,安裝各種不同版本的I...
    26d608950683閱讀 1,604評論 0 5
  • 什么是 CSS hack CSS hack是通過在CSS樣式中加入一些特殊的符號,讓不同的瀏覽器識別不同的符號(什...
    怎么昵稱閱讀 383評論 0 1
  • 最怕面對鏡子的面孔 在臟亂頭發(fā)的掩蓋下藏污納垢 瞳孔里幾乎沒有透著光亮 有時瞳孔睜得很大卻布滿血絲 有時垂頭喪氣長...
    年輪止閱讀 355評論 4 3