技術(shù)頻道導(dǎo)航
HTML/CSS
.NET技術(shù)
IIS技術(shù)
PHP技術(shù)
Js/JQuery
Photoshop
Fireworks
服務(wù)器技術(shù)
操作系統(tǒng)
網(wǎng)站運(yùn)營

贊助商

分類目錄

贊助商

最新文章

搜索

IE11 hack css的符號原來是“#”號

作者:admin    時間:2015-9-21 14:49:37    瀏覽:

今天用IE11使用卡卡網(wǎng)的網(wǎng)站速度診斷工具時,發(fā)現(xiàn)選項(xiàng)的排版是錯位的,我大吃一驚,因?yàn)樵摴ぞ呱暇€有半年多時間了,開發(fā)時是經(jīng)過了多瀏覽器兼容性測試的,當(dāng)時測試的瀏覽器有IE8、IE9、Chrome、360、Firefox,之所以沒有IE11,是因?yàn)檎J(rèn)為只要通過IE9就可以通過IE11了,但實(shí)際上現(xiàn)在發(fā)現(xiàn)是不行的。

IE11排版錯位

圖一:IE11排版錯位

我于是立即查看源代碼,并調(diào)整寬度,但是我怎么調(diào)整,上圖的排版都沒有變化,很明顯是調(diào)整的寬度沒有生效。

調(diào)整寬度無效

圖二:調(diào)整寬度無效

如上圖中,我修改的寬度是“width”的數(shù)據(jù),“#width”是為了hack IE7以下的版本,所以沒有修改這個。

我于是“查看元素”(在IE11瀏覽器里,在某個地方點(diǎn)擊右鍵,然后點(diǎn)擊“查看元素”,即可查看該位置的html代碼),看看這幾個選項(xiàng)的css是怎樣的。

查看元素html代碼

圖三:查看元素html代碼

我大吃一驚,這些寬度竟然是圖二中“#width”的寬度。原來,IE11讀的是“#width”的數(shù)據(jù)而不是“width”的數(shù)據(jù),我hack IE7和IE6的代碼竟然也hack了IE11。

好吧,我把hack IE7和IE6的CSS去掉(現(xiàn)在用這兩瀏覽器的用戶可以忽視了),使用統(tǒng)一的代碼。

去掉hack IE7和IE6的CSS

圖四:去掉hack IE7和IE6的CSS

在瀏覽網(wǎng)頁,嘿嘿,整齊的排版終于出現(xiàn)了。

整齊的排版

圖五:整齊的排版

再“查看元素”的html代碼,如圖:

查看元素的html代碼

圖六:查看元素的html代碼

這個正是圖四的css,問題終于得以解決,“#”號原來也會hack IE11 !

知識擴(kuò)展

IE6\7\8\9\10瀏覽器的CSS hack大全介紹

1、常見的特殊符號的應(yīng)用:

IE6:

_selector{property:value;}
selector{property:value;property:value !important;} /* IE6 不支持同一選擇符中的 !important */

IE7:

+selector{property:value;}

IE8:

selector{property:value\0;}

IE6 & IE7:

*selector{property:value;}

IE6 & IE7 & IE8:

selector{property:value\9;}

總結(jié)起來,如下:

其中,S表示Standards Mode即標(biāo)準(zhǔn)模式,Q表示Quirks Mode,即兼容模式。

(了解更多Quirks模式、Strict(Standars)模式?)

hack 示例 IE6(S) IE6(Q) IE7(S) IE7(Q) IE8(S) IE8(Q)
* *color Yes Yes Yes Yes No Yes
+ +color Yes Yes Yes Yes No Yes
- -color Yes Yes No No No No
_ _color Yes Yes No Yes No Yes
# #color Yes Yes Yes Yes No Yes
\0 color\0 No No No No Yes No
\9 color\9 Yes Yes Yes Yes Yes Yes
!important color:blue !important;
color:green;
No No Yes No Yes No

2、條件注釋判斷瀏覽器<!--[if !IE]><!--[if IE]><!--[if lt IE 6]><!--[if gte IE 6]>

<!--[if !IE]><!--> 除IE外都可識別 <!--<![endif]-->
<!--[if IE]> 所有的IE可識別 <![endif]-->
<!--[if IE 6]> 僅IE6可識別 <![endif]-->
<!--[if lt IE 6]> IE6以下版本可識別 <![endif]-->
<!--[if gte IE 6]> IE6以及IE6以上版本可識別 <![endif]-->
<!--[if IE 7]> 僅IE7可識別 <![endif]-->
<!--[if lt IE 7]> IE7以下版本可識別 <![endif]-->
<!--[if gte IE 7]> IE7以及IE7以上版本可識別 <![endif]-->
<!--[if IE 8]> 僅IE8可識別 <![endif]-->
<!--[if IE 9]> 僅IE9可識別 <![endif]-->

項(xiàng)目 范例 說明
! [if !IE] The NOT operator. This is placed immediately in front of the featureoperator, or subexpression to reverse the Boolean meaning of the expression.
NOT運(yùn)算符。這是擺立即在前面的功能操作員,或子表達(dá)式扭轉(zhuǎn)布爾表達(dá)式的意義。
lt [if lt IE 5.5] The less-than operator. Returns true if the first argument is less than the second argument.
小于運(yùn)算符。如果第一個參數(shù)小于第二個參數(shù),則返回true。
lte [if lte IE 6] The less-than or equal operator. Returns true if the first argument is less than or equal to the second argument.
小于或等于運(yùn)算。如果第一個參數(shù)是小于或等于第二個參數(shù),則返回true。
gt [if gt IE 5] The greater-than operator. Returns true if the first argument is greater than the second argument.
大于運(yùn)算符。如果第一個參數(shù)大于第二個參數(shù),則返回true。
gte [if gte IE 7] The greater-than or equal operator. Returns true if the first argument is greater than or equal to the second argument.
大于或等于運(yùn)算。如果第一個參數(shù)是大于或等于第二個參數(shù),則返回true。
( ) [if !(IE 7)] Subexpression operators. Used in conjunction with boolean operators to create more complex expressions.
子表達(dá)式運(yùn)營商。在與布爾運(yùn)算符用于創(chuàng)建更復(fù)雜的表達(dá)式。
& [if (gt IE 5)&(lt IE 7)] The AND operator. Returns true if all subexpressions evaluate to true
AND運(yùn)算符。如果所有的子表達(dá)式計算結(jié)果為true,返回true
| [if (IE 6)|(IE 7)] The OR operator. Returns true if any of the subexpressions evaluates to true.
OR運(yùn)算符。返回true,如果子表達(dá)式計算結(jié)果為true。

3、meta聲明

由于IE8 可能會將頁面按照 IE7 模式進(jìn)行渲染,針對 多版本IE的現(xiàn)狀,通常會采用設(shè)置 X-UA-Compatible HTTP 頭的方式將頁面在IE中采用統(tǒng)一的渲染模式。

<meta http-equiv="X-UA-Compatible" content="IE=4"> <!-- IE5 mode -->
<meta http-equiv="X-UA-Compatible" content="IE=7.5"> <!-- IE7 mode -->
<meta http-equiv="X-UA-Compatible" content="IE=100"> <!-- IE8 mode -->
<meta http-equiv="X-UA-Compatible" content="IE=a"> <!-- IE5 mode -->

<!-- This header mimics Internet Explorer 7 and uses
<!DOCTYPE> to determine how to display the Web page -->

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7">

注意: 前面的范例顯示單獨(dú)的內(nèi)容值。實(shí)際上IE只會執(zhí)行網(wǎng)頁中第一個X-UA-Compatible標(biāo)頭。

你也可以使用內(nèi)容屬性來指定復(fù)數(shù)的文件兼容性模式,這能幫助確保你的網(wǎng)頁在未來的瀏覽器版本都能一致的顯示。欲設(shè)定復(fù)數(shù)的文件模式,請設(shè)定內(nèi)容屬性以判別你想使用的模式。使用分號來分開各個模式。

如果一個特定版本的IE支持所要求的兼容性模式多于一種,將採用列于標(biāo)頭內(nèi)容屬性中最高的可用模式。你可以使用這個特性來排除特定的兼容性模式,雖然并不推薦這樣做。舉例來說,下列標(biāo)頭即會排除IE7 mode。

<meta http-equiv="X-UA-Compatible" content="IE=5; IE=8" />

4、其他(/*\**/注釋法)

網(wǎng)上也流傳著這樣一種ie hack方法

.color1{ color:#F00; color/*\**/:#00F /*\**/}/*IE6,IE7,IE8,FF,OP,SA識別*/

.color2{ color:#F00; color /*\**/:#00F /*\9**/}/*IE7,IE8,FF,OP,SA識別*/

.color3{ color:#F00; color/*\**/:#00F \9}/*IE6,IE7,IE8識別*/

.color4{ color:#F00; color /*\**/:#00F\9}/*IE7,IE8識別*//*“color”和“/*\**/”之間有個空格*/

分析下:

background-color:blue; /*各個瀏覽器都認(rèn)識,這里給firefox用;*/

background-color:red\9; /* \9所有的ie瀏覽器可識別; */

background-color:yellow\0;  /* \0 是留給ie8的,但筆者測試,發(fā)現(xiàn)最新版opera也認(rèn)識,汗。。。不過且慢,后面自有hack寫了給opera認(rèn)的,所以,\0我們就認(rèn)為是給ie8留的;*/

+background-color:pink; /* + ie7定了; */

_background-color:orange; /* _專門留給神奇的ie6;*/

:root #test { background-color:purple\9; } /* :root是給ie9的,網(wǎng)上流傳了個版本是 :root #test { background-color:purple\0;},呃。。。這個。。。,新版opera也認(rèn)識,所以經(jīng)筆者反 */
/* 復(fù)驗(yàn)證最終ie9特有的為:root 選擇符 {屬性\9;} */

@media all and (min-width:0px){ #test {background-color:black\0;} } /* 這個是老是跟ie搶著認(rèn)\0的神奇的opera,必須加個\0,不然firefox,chrome,safari也都認(rèn)識。。。 */

@media screen and (-webkit-min-device-pixel-ratio:0){ #test {background-color:gray;} }  /* 最后這個是瀏覽器新貴chrome和safari的。 */

好了就這么多了,特別注意以上順序是不可以改變的。css hack雖然可以解決個瀏覽器之間css顯示的差異問題,但是畢竟不符合W3C規(guī)范,我們平時寫css最好是按照標(biāo)準(zhǔn)來,這樣對我們以后維護(hù)也是大有好處的,實(shí)在不行再用。

區(qū)別不同瀏覽器的CSS hack寫法:

區(qū)別IE6與FF:

background:orange;*background:blue;

區(qū)別IE6與IE7:

background:green !important;background:blue;

區(qū)別IE7與FF:

background:orange; *background:green;

區(qū)別FF,IE7,IE6:

background:orange;*background:green !important;*background:blue;

注:IE都能識別*;標(biāo)準(zhǔn)瀏覽器(如FF)不能識別*;
IE6能識別*,但不能識別 !important,
IE7能識別*,也能識別!important;
FF不能識別*,但能識別!important;

  IE6 IE7 FF
* ×
!important ×

另外再補(bǔ)充一個,下劃線"_",
IE6支持下劃線,IE7和firefox均不支持下劃線。

  IE6 IE7 FF
* ×
!important ×
_ × ×

于是大家還可以這樣來區(qū)分IE6,IE7,firefox:

background:orange;*background:green;_background:blue;

注:不管是什么方法,書寫的順序都是firefox的寫在前面,IE7的寫在中間,IE6的寫在最后面。

您可能對以下文章也感興趣

標(biāo)簽: hack  
x
  • 站長推薦
/* 左側(cè)顯示文章內(nèi)容目錄 */