CSS Hack詳解

字號(hào):


    摘要:
    在我們制作頁(yè)面時(shí)CSS hack由于不同的瀏覽器,比如Internet Explorer,Mozilla Firefox等,對(duì)CSS的解析認(rèn)識(shí)不一樣,因此會(huì)導(dǎo)致生成的頁(yè)面效果不一樣,得不到我們所需要的頁(yè)面效果。 這個(gè)時(shí)候我們就需要針對(duì)不同的瀏覽器去寫(xiě)不同的CSS,讓它能夠同時(shí)兼容不同的瀏覽器,能在不同的瀏覽器中也能得到我們想要的頁(yè)面效果。
    CSS Hack大致有3種表現(xiàn)形式,屬性級(jí)Hack、選擇器Hack以及IE條件Hack
    注意:盡可能減少對(duì)CSS Hack的使用。
    原理:
    由于不同的瀏覽器對(duì)CSS的支持及解析結(jié)果不一樣,還由于CSS中的優(yōu)先級(jí)的關(guān)系。我們就可以根據(jù)這個(gè)來(lái)針對(duì)不同的瀏覽器來(lái)寫(xiě)不同的CSS。
    實(shí)際應(yīng)用:
    選擇器:
    語(yǔ)法:
    <hack> selector{ sRules }
    說(shuō)明:
    選擇不同的瀏覽器及版本
    通常如未作特別說(shuō)明,所有的代碼和示例的默認(rèn)運(yùn)行環(huán)境都為標(biāo)準(zhǔn)模式。
    一些CSS Hack由于瀏覽器存在交叉認(rèn)識(shí),所以需要通過(guò)層層覆蓋的方式來(lái)實(shí)現(xiàn)對(duì)不同瀏覽器進(jìn)行Hack的。
    簡(jiǎn)單列舉幾個(gè):
    代碼如下:
    * html .test{color:#090;} /* For IE6 and earlier */
    * + html .test{color:#ff0;} /* For IE7 */
    .test:lang(zh-cn){color:#f00;} /* For IE8+ and not IE */
    .test:nth-child(1){color:#0ff;} /* For IE9+ and not IE */
    :root .test {background-color:green;} /* For IE9 and Opera */
    @media screen and (-webkit-min-device-pixel-ratio:0) {.test {color:gray;}} /* For Chrome and Safari */
    @-moz-document url-prdfix() {.test {color:#fff}} /* For Forefox */
    * 上述代碼中的3,4兩行就是典型的利用能力來(lái)進(jìn)行選擇的CSS Hack。
    IE條件Hack:
    語(yǔ)法:
    代碼如下:
    <!--[if <keywords>? IE <version>?]>
    HTML代碼塊
    <![endif]-->
    取值:
    <keywords>
    if條件共包含6種選擇方式:是否、大于、大于或等于、小于、小于或等于、非指定版本
    是否:
    指定是否IE或IE某個(gè)版本。關(guān)鍵字:空
    大于:
    選擇大于指定版本的IE版本。關(guān)鍵字:gt(greater than)
    大于或等于:
    選擇大于或等于指定版本的IE版本。關(guān)鍵字:gte(greater than or equal)
    小于:
    選擇小于指定版本的IE版本。關(guān)鍵字:lt(less than)
    小于或等于:
    選擇小于或等于指定版本的IE版本。關(guān)鍵字:lte(less than or equal)
    非指定版本:
    選擇除指定版本外的所有IE版本。關(guān)鍵字:!
    <version>
    目前的常用IE版本為6.0及以上
    說(shuō)明:
    用于選擇IE瀏覽器及IE的不同版本
    if條件Hack是HTML級(jí)別的(包含但不僅是CSS的Hack,可以選擇任何HTML代碼塊)
    如不想在非IE中看到某區(qū)域,可這樣寫(xiě):
    代碼如下:
    <!--[if IE]>
    <p>你在非IE中將看不到我的身影</p>
    <![endif]-->
    上述p代碼塊,將只在IE中可見(jiàn)。
    if條件6種選擇方式的使用示例(下述代碼中被條件注釋包含的HTML代碼塊也可以是link標(biāo)記):
    是否,示例代碼:
    代碼如下:
    <!--[if IE]>
    <style>
    .test{color:red;}
    </style>
    <![endif]-->
    在上述代碼中,只有IE瀏覽,才能看到應(yīng)用了test類的元素是紅色文本。
    大于,示例代碼:
    代碼如下:
    <!--[if gt IE 6]>
    <style>
    .test{color:red;}
    </style>
    <![endif]-->
    在上述代碼中,只有IE6以上,才能看到應(yīng)用了test類的元素是紅色文本。
    大于或等于,示例代碼:
    代碼如下:
    <!--[if gte IE 6]>
    <style>
    .test{color:red;}
    </style>
    <![endif]-->
    在上述代碼中,只有IE6以上(含IE6),才能看到應(yīng)用了test類的元素是紅色文本。
    小于,示例代碼:
    代碼如下:
    <!--[if lt IE 7]>
    <style>
    .test{color:red;}
    </style>
    <![endif]-->
    在上述代碼中,只有IE7以下,才能看到應(yīng)用了test類的元素是紅色文本。
    小于或等于,示例代碼:
    代碼如下:
    <!--[if lte IE 7]>
    <style>
    .test{color:red;}
    </style>
    <![endif]-->
    在上述代碼中,只有IE7以下(含IE7),才能看到應(yīng)用了test類的元素是紅色文本。
    非指定版本,示例代碼:
    代碼如下:
    <!--[if ! IE 7]>
    <style>
    .test{color:red;}
    </style>
    <![endif]-->
    在上述代碼中,除IE7以外的IE版本,都能看到應(yīng)用了test類的元素是紅色文本。
    屬性級(jí):
    語(yǔ)法:
    selector{<hack>property:value;}或者selector{property:value<hack>;}
    取值:
    _:選擇IE6及以下。連接線(中劃線)(-)亦可使用,為了避免與某些帶中劃線的屬性混淆,所以使用下劃線(_)更為合適。
    *:選擇IE7及以下。諸如:(+)與(#)之類的均可使用,不過(guò)業(yè)界對(duì)(*)的認(rèn)知度更高
    \9:選擇IE6+,可以區(qū)別所有IE和FireFox。
    \0:選擇IE8+和Opera
    [;property:value;];:選擇webkit核心瀏覽器(Chrome,Safari)。IE7及以下也能識(shí)別。中括號(hào)內(nèi)外的3個(gè)分號(hào)必須保留,第一個(gè)分號(hào)前可以是任意規(guī)則或任意多個(gè)規(guī)則
    [;color:#f00;]; 與 [color:#f00;color:#f00;]; 與 [margin:0;padding:0;color:#f00;]; 是等價(jià)的。生效的始終是中括號(hào)內(nèi)的最后一條規(guī)則,所以通常選用第一種寫(xiě)法最為簡(jiǎn)潔。
    注意:!important并不是一個(gè)hack手段,他是被用來(lái)改變css的優(yōu)先級(jí)的,因?yàn)閕e6是不識(shí)別!important,所以就被拿來(lái)當(dāng)做css hack的一種,這是錯(cuò)誤的。
    說(shuō)明:
    選擇不同的瀏覽器及版本
    瀏覽器優(yōu)先級(jí)別:FF<IE9<IE8<IE7<IE6,CSS hack書(shū)寫(xiě)順序一般為FF IE9 IE8 IE7 IE6
    一些CSS Hack由于瀏覽器存在交叉認(rèn)識(shí),所以需要通過(guò)層層覆蓋的方式來(lái)實(shí)現(xiàn)對(duì)不同瀏覽器進(jìn)行Hack的。如下面這個(gè)例子:
    如想同一段文字在IE6,7,8顯示為不同顏色,可這樣寫(xiě):
    代碼如下:
    .test{
    color:#090\9; /* For IE8+ */
    *color:#f00; /* For IE7 and earlier */
    _color:#ff0; /* For IE6 and earlier */
    }
    * 上述Hack均需運(yùn)行在標(biāo)準(zhǔn)模式下,若在怪異模式下運(yùn)行,這些Hack將會(huì)被不同版本的IE相互識(shí)別,導(dǎo)致失效。
    HACK Demo:
    代碼如下:
    .demo{color:#f1ee18;/*所有識(shí)別*/ background-color:#00deff\9; /*IE6、7、8識(shí)別*/ +background-color:#a200ff;/*IE6、7識(shí)別*/ _background-color:#1e0bd1/*IE6識(shí)別*/}
    @media screen and (-webkit-min-device-pixel-ratio:0){.demo{background-color:#f1ee18}}{} /* Safari(Chrome) 有效 */
    @media all and (min-width: 0px){ .demo{background-color:#f1ee18;/*opera and Safari(Chrome) and firefox*/ background-color:#4cac70\0;}/* 僅 Opera 有效 */ }{}
    .demo, x:-moz-any-link, x:default{background-color:#4eff00;/*IE7、Firefox3.5及以下 識(shí)別 */}
    @-moz-document url-prefix(){.demo{background-color:#4eff00;/*僅 Firefox 識(shí)別 */}}
    * +html .demo{background-color:#a200ff;}/* 僅IE7 識(shí)別 */
    /* 一般情況下 我們區(qū)分IE7 只用 +background-color 配合 _background-color 就行了 如果必須寫(xiě) .demo, x:-moz-any-link, x:default 這樣的代碼區(qū)分 Firefox3.5及以下 則謹(jǐn)記此寫(xiě)法對(duì)IE7也有效,故在其中要再重寫(xiě)一次 +background-color 或者使用 * +html .demo{background-color:blue;} 方法僅對(duì) IE7 有效??墒褂?@-moz-document url-prefix(){}方法獨(dú)立區(qū)分所有 firefox */
    .demo, x:-moz-any-link, x:default{display:block;/*IE7 firefox3.5及以下 識(shí)別 */+display:none/*再區(qū)分一次IE7*/}
    @-moz-document url-prefix(){.demo{display:block;/*僅 firefox 識(shí)別 */}}
    @media screen and (-webkit-min-device-pixel-ratio:0){.demo{display:block;}}{} /* safari(Chrome) 有效 */
    @media all and (min-width: 0px){.demo{display:none\0;} /* 僅 Opera 有效 */ }{}
    總結(jié):
    css hack 并不是標(biāo)準(zhǔn)的css,所以應(yīng)該盡量少使用hack。