瀏覽器專屬 CSS Hack:區分 Firefox / Opera / Safari / Internet Explorer

瀏覽器專屬 CSS Hack:區分 Firefox / Opera / Safari / Internet Explorer
CSS Hack 是在標準 CSS 沒辦法兼容各瀏覽器顯示效果時才會用上的補救方法,在各瀏覽器廠商解析 CSS 沒有達成一致前,我們只能用這樣的方法來完成這樣的任務。網上你可能能搜索到一大堆的 CSS Hack,但是我今天發布的你可能並不都很了解,因為這些都是只針對單獨一個瀏覽器的 CSS Hack。

為了向你展示這些 CSS Hack 是否正常運作,我新建六個 P 標籤,並給每一個 P 標籤一個特有的 id。這將向你展示 CSS Hack 的運作情況。

<p id="opera">我來自 Opera 7.2 - 9.5</p>
<p id="safari">我是神奇的 Safari</p>
<p id="firefox">我來自 Firefox</p>
<p id="firefox12">我是你爺爺 Firefox 1 - 2 </p>
<p id="ie7">我是囧 IE 7</p>
<p id="ie6">我是腦瘸 IE 6</p>

然後我讓這些 P 標籤默認都不顯示

<style type="text/css">
body p{display: none;}
</style>

使用 IE CSS 條件注釋區分 IE 瀏覽器

最簡單的區分 IE 瀏覽器的方法自然是使用他們的條件注釋。 微軟創建了一個強大的語法來讓我們去實現這個功能。我不想再詳細地介紹 IE 條件注釋了,我想你在搜索引擎能搜索到上萬個搜索條目,我這裡只要這兩個:

<!--[if IE 7]>
<style type="text/css">
</style>
<![endif]-->
 
<!--[if IE 6]>
<style type="text/css">
</style>
<![endif]-->

使用 CSS 解析器 Hacks 區分 IE

雖說 IE 條件注釋十分簡單好用,但是如果你想把全部的 CSS 放到一個文件里的話,那麼你不得不使用別的方法。注意這裡的 IE 7 Hack將只對 IE7 有效,因為 IE6 根本不知道 > 選擇符。同時你也得注意 > 選擇符對於其他瀏覽器同樣是無效的。

/* IE 7 */
html > body #ie7
{*display: block;}
 
/* IE 6 */
body #ie6
{_display: block;}

CSS Hack 區分 Firefox

第一個使用了 body:empty 來區分 Firefox 1 和 2 。第二個 hack使用了全部 Firefox 瀏覽器的專有擴展 -moz。 -moz 只對 Firefox有效,使用這個 Hack 大可不必擔心其他瀏覽器的影響。

/* Firefox 1 - 2 */
body:empty #firefox12
{display: block;}
 
/* Firefox */
@-moz-document url-prefix()
{#firefox { display: block; }}

CSS Hack 區分 Safari

Safari 的 CSS hack 與 Firefox 的 hack 看起來很像,使用的是 Safari瀏覽器的專有擴展 -webkit 且只對 Safari 瀏覽器有效。

/* Safari */
@media screen and (-webkit-min-device-pixel-ratio:0)
{#safari { display: block; }}

CSS Hack 區分 Opera

/* Opera */
@media all and (-webkit-min-device-pixel-ratio:10000), not all and (-webkit-min-device-pixel-ratio:0)
{head~body #opera { display: block; }}

然後,全部合在一起便是

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>CSS Browser Hacks</title>
<style type="text/css">
body p
{
display: none;
}
/* Opera */
html:first-child #opera
{
display: block;
}
/* IE 7 */
html > body #ie7
{
*display: block;
}
/* IE 6 */
body #ie6
{
_display: block;
}
/* Firefox 1 - 2 */
body:empty #firefox12
{
display: block;
}
/* Firefox */
@-moz-document url-prefix()
{
#firefox { display: block; }
}
/* Safari */
@media screen and (-webkit-min-device-pixel-ratio:0)
{
#safari { display: block; }
}
/* Opera */
@media all and (-webkit-min-device-pixel-ratio:10000), not all and (-webkit-min-device-pixel-ratio:0)
{
head~body #opera { display: block; }
}
</style>
</head>
 
<body>
<p id="opera">我來自 Opera 7.2 - 9.5</p>
<p id="safari">我是神奇的 Safari</p>
<p id="firefox">我來自 Firefox</p>
<p id="firefox12">我是你爺爺 Firefox 1 - 2 </p>
<p id="ie7">我是囧 IE 7</p>
<p id="ie6">我是腦瘸 IE 6</p>
</body>
</html>

CSS Hack 雖好且方便兼容各瀏覽器,但是通不過 W3C 驗證,所以還得自己權衡是否有必要去使用。

-Via.

文中涉及資源頁面
* http://msdn.microsoft.com/en-us/library/ms537512.aspx
* http://www.javascriptkit.com/dhtmltutors/csshacks3.shtml
* http://perishablepress.com/press/2006/08/27/css-hack-dumpster/
* http://thomas.tanreisoftware.com/?p=11#opera

View Demo CSS Browser Hacks


  • http://rpsh.net/ 任平生

    這些 hack 好讓人抓狂啊。。。

  • http://welee.org welee

    很好,比 sofish 那篇更詳細,連 Safari 都顧到了,不知有沒有 Chrome 的?我想如果想通過 W3C 的話用 JavaScript 來處理不知行不行…

  • http://www.ediyang.com eddie

    呵呵有錯啊
    我用IE8查看,顯示我是囧IE7

  • http://showfom.com/ Showfom

    (*^__^*) 嘻嘻…… 開發一個合格的網頁得經過那麼多個瀏覽器,哎,生活真是累……

  • http://fisio.cn/ fisio

    我老是把 moz 看成 maoz…

  • http://www.iqbee.cn 吖Bee

    呵呵,瀏覽器多是個問題!

  • http://leeiio.me/ Leeiio

    @任平生
    研究這麼複雜的CSS Hack的人都是牛人~
    @welee
    Chrome用的和safari一樣的核心兩者應該相差無幾吧。
    @eddie
    呃,還沒考慮到IE8,你可以幫忙補充我更新進去呵呵!
    @Showfom
    生活就是折騰。
    @fisio
    你肯定暗戀人家。
    @吖Bee
    如果普及的標準能夠統一瀏覽器再多也不怕了~

  • http://www.g9net.com/ wlsy

    有之前好像有看到一個叫Conditional-CSS的也是對多瀏覽器寫不同hack

  • http://7-leaf.cn 葉子

    瓜牛你的頁面東西好多啊,眼花了

  • http://leeiio.me/ Leeiio

    @wlsy
    Conditional-CSS就是文中提到的條件註釋,不過僅限IE瀏覽器呃。
    @葉子
    忙著畢業,沒時間折騰了。

  • http://booto.net Kimcool

    老實說,你首頁太大了。

  • http://leeiio.me/ Leeiio

    @Kimcool
    我也發現了,圖片太大了,很多冗餘js代碼,主要是沒時間,忙著畢業呵呵

  • http://7-leaf.cn 葉子

    :neutral: :lol: :lol:

  • http://7-leaf.cn 葉子

    文章首頁顯示部分的php語句怎麼寫的 :oops: :oops:

  • http://nsyta.guaniu.com/ nsyta

    之前弄那個下載站的時候這麼學著人老外學過。。。當時很頭疼微軟把IE7 fix了很多針對IE 6的hack不管用了。。- -後來忘記怎麼解決了。。。

  • http://nsyta.guaniu.com/ nsyta

    上面打漏了。。。- -後來忘記怎麼解決了。。。最終無意中被我看到這種Hack就照葫蘆畫瓢居然管用了當時高興的- -

  • http://leeiio.me/ Leeiio

    @nsyta
    你復活了。

  • http://www.naease.com Panther

    加你QQ了 ,找你幫點忙 呵呵

  • http://an9.name an9

    出錯了。

  • http://heybronco.net Bronco

    我恨IE6~~ :evil:

  • vc

    幸好我們現在做的項目只要能在FF跑就行。
    PS:留言在opera下錯位了。

  • Lucifer

    好文章
    IE 系列其實通過css 條件注釋 就全部解決了 所以IE 8倒沒關係
    個人覺得 能夠不用hack 還是不要用先
    真的沒辦法的時候再通過hack來解決兼容性問題

  • http://leeiio.me/ Leeiio

    @ Lucifer
    我也是這麼個建議,能不hack則不hack~

  • Pingback: RSSA頻道 » Blog Archive » CSS 3.0 中文參考手冊(CHM版)

  • http://www.css88.com 愚人碼頭

    :idea: 今天用到了,轉載了一下

  • Pingback: JoyfulBoy » 前端技術 » XHTML CSS » 各款瀏覽器專屬的 CSS Hack

  • Pingback: 專屬 CSS Hack – WEB前端開發- 專註前端開發,關注用戶體驗

  • http://www.tulongzhiji.com/mopvhs/ MOPVHS

    沒有標準真是可怕呢~~ :?:

  • http://blog.163.com/yss_dlut/ yss

    hao yang de! learn more, thanks

  • http://wanz.im 丸子

    路過,純屬意外。不要回復我。。

    • http://leeiio.me/ Leeiio

      @丸子 我就是要回復你 :roll:

  • 小西

    :razz: 很詳細,有些用過,有些收藏(希望不用去用到),
    然後說說我的看法,在我的實踐中,我不認為ie6是最難搞的,反而是ie7,
    最好搞定的當屬Webkit核。

  • Pingback: » Blog Archive » 專屬 CSS Hack

  • Pingback: 針對主流瀏覽器的各種專屬CSS hack « starhusb

  • http://www.smileyoumouth.com Huang ChengZhi

    腦腐亮了。不錯不錯

  • Pingback: Although want to use less as far as possible, but still want to remember these CSS Hack

  • 瞭然

    閣下的文字讓我受益匪淺,非常不錯,謝謝!

  • asdf

    很有用,非常感謝! :razz:

  • kael

    我遇到一個 Chrome下正常的,但是Safari下有問題的例子,可能是我代碼不夠規範,正考慮要不要用hack,同樣是基於webkit的內核,哎,前端的命苦啊,html5的時代快點到來吧。。。 :razz: :razz: :razz:

  • 櫻子

    樓主應該吧chrome也加進去~~~

  • http://www.jackness.org jackness

    嘿嘿,好文章,寫得比較全面,如果 有 chrome 的話就更完美了