您的位置:首页 > Web前端 > CSS

css hack 学习总结

2017-09-07 22:15 369 查看

css hack

CSS hack由于不同厂商的浏览器,比如Internet Explorer,Safari,Mozilla Firefox,Chrome等,或者是

同一厂商的浏览器的不同版本,如IE6和IE7,对CSS的解析认识不完全一样,因此会导致生成的页面效果

不一样,得不到我们所需要的页面效果。 这个时候我们就需要针对不同的浏览器去写不同的CSS,让它

能够同时兼容不同的浏览器,能在不同的浏览器中也能得到我们想要的页面效果。

简单的说,CSS hack的目的就是使你的CSS代码兼容不同的浏览器。当然,我们也可以反过来利用CSS 

hack为不同版本的浏览器定制编写不同的CSS效果。

外文名 CSS hack 例    如 Internet Explorer 6 对    象浏览器 性    质 编程 原    理 CSS中的

优先级的关系

目录

1 原理

2 常用的CSS hack方式

3 实际应用

▪ IE6 hack

▪ IE7 hack

原理

由于不同的浏览器对CSS的支持及解析结果不一样,还由于CSS中的优先级的关系。我们就可以根据这个

来针对不同的浏览器来写不同的CSS。

CSS Hack大致有3种表现形式,CSS类内部Hack、选择器Hack以及HTML头部引用(if IE)Hack,CSS Hack主

要针对类内部Hack:比如 IE6能识别下划线"_"和星号" * ",IE7能识别星号" * ",但不能识别下划

线"_",而firefox两个都不能认识。等等

选择器Hack:比如 IE6能识别*html .class{},IE7能识别*+html .class{}或者*:first-child+html 

.class{}。等等

HTML头部引用(if IE)Hack:针对所有IE:<!--[if IE]><!--您的代码--><![endif]-->,针对IE6及以下

版本:<!--[if lt IE 7]><!--您的代码--><![endif]-->,这类Hack不仅对CSS生效,对写在判断语句里

面的所有代码都会生效。

书写顺序,一般是将识别能力强的浏览器的CSS写在后面。下面如何写里面说得更详细些。

常用的CSS hack方式

(1)方式一 条件注释法

只在IE下生效

<!--[if IE]>

这段文字只在IE浏览器显示

<![endif]-->

只在IE6下生效

<!--[if IE 6]>

这段文字只在IE6浏览器显示

<![endif]-->

只在IE6以上版本生效

<!--[if gte IE 6]>

这段文字只在IE6以上(包括)版本IE浏览器显示

<![endif]-->

只在IE8上不生效

<!--[if ! IE 8]>

这段文字在非IE8浏览器显示

<![endif]-->

非IE浏览器生效

<!--[if !IE]>

这段文字只在非IE浏览器显示

<![endif]-->

(2)方式二 类内属性前缀法

属性前缀法是在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

(3)CSS hack方式三:选择器前缀法

选择器前缀法是针对一些页面表现不一致或者需要特殊对待的浏览器,在CSS选择器前加上一些只有某些

特定浏览器才能识别的前缀进行hack。

目前最常见的是

*html *前缀只对IE6生效*+html *+前缀只对IE7生效@media screen\9{...}只对IE6/7生效@media 

\0screen {body { background: red; }}只对IE8有效@media \0screen\,screen\9{body { background: 

blue; }}只对IE6/7/8有效@media screen\0 {body { background: green; }} 只对IE8/9/10有效@media 

screen and (min-width:0\0) {body { background: gray; }} 只对IE9/10有效@media screen and (-

ms-high-contrast: active), (-ms-high-contrast: none) {body { background: orange; }} 只对

IE10有效等等

实际应用

比如要分辨IE6和firefox两种浏览器,可以这样写:

div{

background:green;/*forfirefox*/

*background:red;/*forIE6*/(bothIE6&&IE7)

}

我在IE6中看到是红色的,在firefox中看到是绿色的。

解释一下:

上面的css在firefox中,它是认识不了后面的那个带星号的东西是什么的,于是将它过滤掉,不予理睬

,解析得到的结果是:div{background:green},于是理所当然这个div的背景是绿色的。

在IE6中呢,它两个background都能识别出来,它解析得到的结果是:div

{background:green;*background:red;},于是根据优先级别,处在后面的red的优先级高,于是当然这个

div的背景颜色就是红色的了。

CSS hack:区分IE6,IE7,firefox

区别不同浏览器,CSS hack写法:

区别IE6与FF:

1

background:orange;*background:blue;

区别IE6与IE7:

1

background:green!important;background:blue;

区别IE7与FF:

1

background:orange;*background:green;

区别FF,IE7,IE6:

1

2

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

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

注:IE都能识别*;标准浏览器(如FF)不能识别*;

IE6能识别*;不能识别 !important;

IE7能识别*,能识别!important;

FF不能识别*,但能识别!important;

   IE6
IE7 FireFox

* √ √
×

!important

× √ √

浏览器优先级别:FF<IE7<IE6,CSS hack书写顺序一般为FF IE7 IE6

以: " #demo {width:100px;} "为例;

#demo {width:100px;} /*被FIREFOX,IE6,IE7执行.*/

* html #demo {width:120px;} /*会被IE6执行,之前的定义会被后来的覆盖,所以#demo的宽度在IE6就为

120px; */

*+html #demo {width:130px;} /*会被IE7执行*/

所以最后,#demo的宽度在三个浏览器的解释为: FIREFOX:100px; ie6:120px; ie7:130px;

IE8 最新css hack:

"\9" 例:"border:1px \9;".这里的"\9"可以区别所有IE和FireFox.(只针对IE9 Hack)

"\0" IE8识别,IE6、IE7不能.

"*" IE6、IE7可以识别.IE8、FireFox不能.

"_" IE6可以识别"_",IE7、IE8、FireFox不能.

IE6 hack

1

_background-color:#CDCDCD;/*ie6*/

IE7 hack

*background-color:#dddd00; /* ie 7*/IE8 hack

background-color:red \0; /* ie 8/9*/IE9 hack

background-color:blue \9\0;火狐,傲游,浏览器通用

background-color:red!important;

注意写hack的顺序,其中:

background-color:red\0;IE8和IE9都支持;

background-color:blue\9\0; 仅IE9支持;

另外,background-color:eeeeee\9;的HACK支持IE6-IE8,但是IE8不能识别“*”和“_”的CSS HACK。

可综合上述规律灵活应用。

IE9 和 IE8 以及其他版本的区别说明

background-color:blue; 各个浏览器都认识,这里给firefox用;

background-color:red\9;\9所有的ie浏览器可识别;

background-color:yellow\0; \0 是留给ie8的,最新版opera也认识,后面自有hack写了给opera认的,

所以,\0我们就认为是给ie8留的;

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

_background-color:orange; _专门留给神奇的ie6;

:root #test { background-color:purple\9; } :root是给ie9的,网上流传了个版本是 :root #test { 

background- color:purple\0;},这个,新版opera也认识,所以经笔者反复验证最终ie9特有的

为:root 选择符 {属性\9;}

@media all and (min-width:0px){ #test {background-color:black\0;} } 这个是老是跟ie抢着认\0

的神奇的opera,必须加个\0,不然firefox,chrome,safari也都认识。。。

@media screen and (-webkit-min-device-pixel-ratio:0){ #test {background-color:gray;} }最后

这个是浏览器新贵chrome和safari的。

选择符级Hack

CSS内部选择符级Hack

语法

<hack> selector{ sRules }

说明

选择不同的浏览器及版本

尽可能减少对CSS Hack的使用。Hack有风险,使用需谨慎

通常如未作特别说明,本文档所有的代码和示例的默认运行环境都为标准模式。

一些CSS Hack由于浏览器存在交叉认识,所以需要通过层层覆盖的方式来实现对不同浏览器进行Hack的



简单列举几个:

* 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 */

内部属性Hack

CSS内部属性级Hack

语法:selector{<hack>?property:value<hack>?;}

取值:

_: 选择IE6及以下。连接线(中划线)(-)亦可使用,为了避免与某些带中划线的属性混淆,所以使

用下划线(_)更为合适。

*:选择IE7及以下。诸如:(+)与(#)之类的均可使用,不过业界对(*)的认知度更高。

\9:选择IE6+。

\0:选择IE8+和Opera。

[;property:value;]; 选择webkit核心浏览器(Chrome,Safari)。IE7及以下也能识别。中括号内外的3

个分号必须保留,第一个分号前可以是任意规则或任意多个规则。 [;color:#f00;]; 与 

[color:#f00;color:#f00;]; 与 [margin:0;padding:0;color:#f00;]; 是等价的。生效的始终是中括号

内的最后一条规则,所以通常选用第一种写法最为简洁。

说明:一些CSS Hack由于浏览器存在交叉认识,所以需要通过层层覆盖的方式来实现对不同浏览器进行

Hack的。如下面这个例子:如想同一段文字在IE6,7,8,chrome,safari,显示为不同颜色,可这样写

[1]  :

.test{

color:#000; /* 正常写法普遍支持 */

color:#00F\9; /* 所有IE浏览器(ie6+)支持 */

/*但是IE8不能识别“ * ”和“ _ ” */

[color:#000;color:#0F0; /* SF,CH支持 */

color:#00F\0; /* IE8支持*/

*color:#FF0; /* IE7支持 */

_color:#F00; /* IE6支持 */

}

注意了:[1]  不管是什么方法,书写的顺序都是firefox的写在前面,IE7的写在中间,IE6的写在最后

面。

补充:IE6能识别 *,但不能识别 !important,IE7能识别 *,也能识别!important;FF不能识别 *,但能

识别!important;下划线”_“,IE6支持下划线,IE7和firefox均不支持下划线[1]  。

参考资料

========

CSS各个浏览器Hack的写法

http://www.cnblogs.com/xujanus/p/5653964.html

Hack是针对不同的浏览器去写不同的CSS样式,从而让各浏览器能达到一致的渲染效果,那么针对不同的

浏览器写不同的CSS CODE的过程,就叫CSS HACK,同时也叫写CSS Hack。然后将Hack放在浏览器特定的

CSS文件中,让其符合条件的浏览器解析这些代码,就如前面所说的条件样式,我们将CSS Hack代码放入

条件样式文件中,符合条件的浏览器就解析,不符合的将不解析,从面达到您所需要的页面渲染效果。

总的一句话来说使用CSS Hack将会使用你的CSS代码部分失去作用,然后借助条件样式,使用其原CSS代

码在一些浏览器解析,而CSS Hack代码在符合条件要求的浏览器中替代原CSS那部分代码。常见的就是在

IE6下使用,不具体说,我想大家都有碰到过了。下面我们就一起来看看所有浏览器都具有什么Hack,换

句话说,各种浏览器都能识别哪些CSS的写法。

下面是我收集有关于各浏览器下Hack的写法

1、Firefox

@-moz-document url-prefix() { .selector { property: value; } }

上面是仅仅被Firefox浏览器识别的写法,具体如:

@-moz-document url-prefix() { .demo { color:lime; } }

支持Firefox的还有几种写法:

/* 支持所有firefox版本 */ #selector[id=selector] { property: value; } 或者: @-moz-document 

url-prefix() { .selector { property: value; } } /* 支持所有Gecko内核的浏览器 (包括Firefox) 

*/ *>.selector { property: value; }

2、Webkit枘核浏览器(chrome and safari)

@media screen and (-webkit-min-device-pixel-ratio:0) { Selector { property: value; } }

上面写法主要是针对Webkit内核的浏览器,如Google Chrome 和 Safari浏览器:

@media screen and (-webkit-min-device-pixel-ratio:0) { .demo { color: #f36; } }

3、Opera浏览器

html:first-child>body Selector {property:value;} 或者: @media all and (min-width:0) { 

Selector {property: value;} } 或者: @media all and (-webkit-min-device-pixel-ratio:10000), 

not all and (-webkit-min-device-pixel-ratio:0) { head~body Selector { property: value; } }

上面则是Opera浏览器的Hack写法:

@media all and (-webkit-min-device-pixel-ratio:10000), not all and (-webkit-min-device-

pixel-ratio:0) { head~body .demo { background: green; } }

4、IE9浏览器

:root Selector {property: value9;}

上面是IE9的写法,具体应用如下:

:root .demo {color: #ff09;}

5、IE9以及IE9以下版本

Selector {property:value9;}

这种写法只有IE9以及IE9以下版本能识别,这里需要注意此处“9”只能是“9”不能是别的,比如说“8

”,不然会失去效果的,如:

.demo {background: lime9;}

6、IE8浏览器

Selector {property: value/;} 或者: @media �screen{ Selector {property: value;} }

上面写法只有IE能识别,如:

.color {color: #fff/;} 或者: @media �screen{ .color {color: #fff;} }

7、IE8以及IE8以上的版本

Selector {property: value�;}

这种写法只有IE8以及IE8以上版本支持,如

.demo {color: #ff0�;}

8、IE7浏览器

*+html Selector{property:value;} 或 *:first-child+html Selector {property:value;}

上面两种是IE7浏览器下才能识别,如:

*+html .demo {background: green;} 或者: *:first-child+html .demo {background: green;}

9、IE7及IE7以下版本浏览器

Selector {*property: value;}

上面的写法在IE7以及其以下版本都可以识别,如:

.demo {*background: red;}

10、IE6浏览器

Selector {_property/**/:/**/value;} 或者: Selector {_property: value;} 或者: *html 

Selector {property: value;}

具体应用如下:

.demo {_width/**/:/**/100px;} 或者: .demo {_width: 100px;} 或者: *html .demo {width: 

100px;}

上面具体介绍了各种版本浏览器下如何识别各种的Hack写法,包括了IE6-9以及现代版本的浏览器写法。

综合上面的所述,我们针对不同浏览器的Hack写法主要分为两种从CSS选择器和CSS属性上来区别不同的

Hack写法。下面我们分别来看这两种的不同写法:

CSS选择器的Hack写法

下面我们主要来看CSS选择器和CSS属性选择器在不同浏览器的支持情况。下面先来看CSS选择器支持情况



CSS选择器的Hack写法

1、IE6以及IE6以下版本浏览器

* html .demo {color: green;}

2、仅仅IE7浏览器

*:first-child+html .demo {color: green;}

3、除IE6之外的所有浏览器(IE7-9, Firefox,Safari,Opera)

html>body .demo {color: green;}

4、IE8-9,Firefox,Safari,Opear

html>/**/body .demo {color: green;}

5、IE9+

:root .demo {color: red;}

6、Firefox浏览器

@-moz-document url-prefix() { .demo { color: red; } }

6、Webkit内核浏览器(Safari和Google Chrome)

@media screen and (-webkit-min-device-pixel-ratio:0) { .demo { color: red; } }

7、Opera浏览器

@media all and (-webkit-min-device-pixel-ratio:10000), not all and (-webkit-min-device-

pixel-ratio:0) { head~body .demo { color: red; } }

8、iPhone / mobile webkit

@media screen and (max-device-width: 480px) { .demo { color: red } }

CSS属性Hack写法

1、IE6浏览器

.demo {_color: red;}

2、IE6-7浏览器识别

.demo {*color: red;}

3、所有浏览器除IE6浏览外

.demo {color/**/:red;}

4、IE6-9浏览器

.demo {color: red9;}

5、IE7-8浏览器

.demo {color/***/:red9;}

上面罗列的都是各种浏览器下的有关于CSS的Hack的写法,基中有针对于现代浏览器Safari,Google 

Chrome和Firefox的写法,而且也有针对于我们前端人员最讨厌的IE6-9的各版本浏览器的Hack的写法,

而且这些Hack我们又分为CSS选择器的Hack写法和CSS属性的Hack写法。然而具体何种适用,大家可以要

据自己的需求来定,下面列出我个人的两种写法:

一、经济实惠型定法:

这种写法注重单独的CSS的Hack写法。不同的浏览器使用不同的Hack写法,其实也只是以IE的Hack写法比

较多(因为我们写Hack也主要是针对IE的浏览器)特别是IE6下的浏览器。单独为各种浏览器写Hack的好

处是:针对各种浏览顺的Hack写法省力易记。因为其他的浏览器主要是针对现代浏览器,相对来说是比

较少的。针对于这种Hack的使用,我推荐使用下面的方法:

.demo { color: red;/*所有现代浏览器*/ color: green9;/*所有IE浏览器*/ color: lime�;/*IE8-9浏

览器*/ *color: red;/*IE6-7浏览器*/ +color: blue;/*IE7浏览器*/ _color: orange;/*IE6浏览器*/ 

} @media all and (min-width:0px){ color: #000;/*Webkit和Opera浏览器*/ } @media screen and 

(-webkit-min-device-pixel-ratio:0) { color: #f36;/*Webkit内核浏览器*/ } @media all and (-

wekit-min-device-pixel-ratio:10000), not all and (-webkit-min-device-pixel-ratio:0) { 

head~body .demo {color: #369;} /*Opera*/ } @-moz-document url-prefix(){ .demo

{color:#ccc;}/* all firefox */ }

二、完美主义写法

这种方法是追求完美主义的写法,主要是配合我们上一节所说的IE条件注释,全部采用选择器Hack的写

法。这种写法分两步:

1、创建条件样式表,并在HTML中body里添加相应的class类名:

<!–[if IE6]–><<!–[if IE7]–><!–[if IE8]–><!–[if IE9]–><!–[if !IE]–>

2、接着创建对应的样式

.demo {color: blue;}/*现代浏览器*/ .non-ie .demo {color: red;}/*除IE外浏览器*/ .ie9 .demo 

{color: yellow;}/*IE9浏览器*/ .ie8 .demo{color: green;}/*IE8浏览器*/ .ie7 .demo {color: 

orange;}/*IE7浏览器*/ .ie6 .demo {color: lime;}/*IE6浏览器*/ @media all and (min-width: 

0px){ .demo {color:black;} /* webkit and opera */ } @media screen and (-webkit-min-device-

pixel-ratio:0){ .demo{color:#369;}/* webkit */ } @media all and (-webkit-min-device-pixel-

ratio:10000), not all and (-webkit-min-device-pixel-ratio:0) { head~body .demo

{color:#cf6;}/* opera */ } @-moz-document url-prefix(){ .demo{color:#963;}/* firefox * / }

上面就是目前各种浏览器下,相关CSS的Hack的写法,下面我们具体来看一个实例:

HTML Markup

test color

CSS Code

.demo { color: red;/*所有现代浏览器*/ color: green9;/*所有IE浏览器*/ color: lime�;/*IE8-9浏

览器*/ *color: red;/*IE6-7浏览器*/ +color: blue;/*IE7浏览器*/ _color: orange;/*IE6浏览器*/ 

} :root .demo {color: #9639;} @-moz-document url-prefix(){ .demo{color:#897;}/* all firefox 

*/ } @media screen and (-webkit-min-device-pixel-ratio:0) { .demo { color: #000; 

}/*webkit*/ } @media all and (-webkit-min-device-pixel-ratio:10000), not all and (-webkit-

min-device-pixel-ratio:0) { head~body .demo { color: red; }/*opera*/ }

========

史上最全的CSS hack方式一览

http://blog.csdn.net/freshlover/article/details/12132801

做前端多年,虽然不是经常需要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+已经不再支持条件注释): <!--[if IE]

>IE浏览器显示的内容 <![endif]-->,针对IE6及以下版本: <!--[if lt IE 6]>只在IE6-显示的内容 

<![endif]-->。这类Hack不仅对CSS生效,对写在判断语句里面的所有代码都会生效。

  

CSS hack书写顺序,一般是将适用范围广、被识别能力强的CSS定义在前面。

CSS hack方式一:条件注释法

 

这种方式是IE浏览器专有的Hack方式,微软官方推荐使用的hack方式。举例如下

只在IE下生效
<!--[if IE]>
这段文字只在IE浏览器显示
<![endif]-->

只在IE6下生效
<!--[if IE 6]>
这段文字只在IE6浏览器显示
<![endif]-->

只在IE6以上版本生效
<!--[if gte IE 6]>
这段文字只在IE6以上(包括)版本IE浏览器显示
<![endif]-->

只在IE8上不生效
<!--[if ! IE 8]>
这段文字在非IE8浏览器显示
<![endif]-->

非IE浏览器生效
<!--[if !IE]>
这段文字只在非IE浏览器显示
<![endif]-->

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如下

[css] view plain copy

<script type="text/javascript">  

    //alert(document.compatMode);  

</script>  

<style type="text/css">  

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

    color: #F00;/* 对Windows IE9/Firefox 7+/Opera 10+/所有Chrome/Safari的CSS hack ,选择器

也适用几乎全部Mobile/Linux/Mac browser*/  

}  

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

    width:100px;  

    height:100px;  

}  

.hack{  

/*demo1 */  

/*demo1 注意顺序,否则IE6/7下可能无法正确显示,导致结果显示为白色背景*/  

    background-color:red; /* All browsers */  

    background-color:blue !important;/* All browsers but IE6 */  

    *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; /* Only works in IE6 */  

    *+background-color:pink; /*  WARNING: Only works in IE7 ? Is it right? */  

}  

  

/*可以通过javascript检测IE10,然后给IE10的<html>标签加上class=”ie10″ 这个类 */  

.ie10 #hack{  

    color:red; /* Only works in IE10 */  

}  

  

/*demo2*/  

.iehack{  

/*该demo实例是用于区分标准模式下ie6~ie9和Firefox/Chrome的hack,注意顺序 

IE6显示为:绿色, 

IE7显示为:黑色, 

IE8显示为:红色, 

IE9显示为:蓝色, 

Firefox/Chrome显示为:橘色, 

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

*/  

    background-color:orange;  /* all - for Firefox/Chrome */  

    background-color:red\0;  /* ie 8/9/10/Opera - for ie8/ie10/Opera */  

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

    *background-color:black;  /* ie 6/7 - for ie7 */  

    _background-color:green;  /* ie 6 - for ie6 */  

}  

  

/*demo3 

实例是用于区分标准模式下ie6~ie9和Firefox/Chrome的hack,注意顺序 

IE6显示为:红色, 

IE7显示为:蓝色, 

IE8显示为:绿色, 

IE9显示为:粉色, 

Firefox/Chrome显示为:橘色, 

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

 

*/  

.element {  

    background-color:orange;    /* all IE/FF/CH/OP*/  

}  

.element {  

    *background-color: blue;    /* IE6+7, doesn't work in IE8/9 as IE7 */  

}  

.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;      /*all ie*/  

    background-color:yellow\0;    /*for IE8/IE9/10 最新版opera也认识*/  

    +background-color:pink;        /*for ie6/7*/  

    _background-color:orange;       /*for ie6*/  

}  

  

@media screen and (min-width:0){   

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

}   

@media screen and (min-width:0) {   

    .hacktest { background-color:purple\9; }/*  for IE9/IE10  PS:国外有些习惯常写作\0,根本

没考虑Opera也认识\0的实际 */  

}  

@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {   

   .hacktest { background-color:green; } /* for IE10+ 此写法可以适配到高对比度和默认模式,

故可覆盖所有ie10的模式 */  

}  

@media screen and (-webkit-min-device-pixel-ratio:0){ .hacktest {background-color:gray;} }  

/*for Chrome/Safari*/  

  

/* #963棕色 :root is for IE9/IE10, 优先级高于@media, 慎用!如果二者合用,必要时在@media样式

加入 !important 才能区分IE9和IE10 */  

/* 

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

*/  

</style>  

demo1是测试不同IE浏览器下hack 的显示效果

IE6显示为:粉色,

IE7显示为:粉色,

IE8显示为:蓝色,

IE9显示为:蓝色,

Firefox/Chrome/Opera显示为:蓝色,

若去掉其中的!important属性定义,则IE6/7仍然是粉色,IE8是紫色,IE9/10为橙色,Firefox/Chrome

变为红色,Opera是紫色。是不是有些奇怪:除了IE6以外,其他所有的表现都符合我们的期待。那为何

IE6表现的颜色不是_background-color:green;的绿色而是*+background-color:pink的粉色呢?其实是

最后一句所谓的IE7私有hack惹的祸?不是说*+是IE7的专有hack吗???错,你可能太粗心了!我们常

说的IE7专有*+hack的格式是*+html selector,而不是上面的直接在属性上加*+前缀。如果是为IE7定制

特殊样式,应该这样使用:

*+html #ie7test { /* IE7 only*/
color:green;

}

经过测试,我发现属性前缀*+background-color:pink;只有IE6和IE7认识。而*+html selector只有IE7

认识。所以我们在使用时候一定要特别注意。

demo2实例是用于区分标准模式下ie6~ie9和Firefox/Chrome的hack,注意顺序

IE6显示为:绿色,

IE7显示为:黑色,

IE8显示为:红色,

IE9显示为:蓝色,

Firefox/Chrome显示为:橘色,

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

demo3实例也是用于区分标准模式下ie6~ie9和Firefox/Chrome的hack,注意顺序

IE6显示为:红色,

IE7显示为:蓝色,

IE8显示为:绿色,

IE9显示为:粉色,

Firefox/Chrome显示为:橘色,

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

demo4实例是用于区分标准模式下ie6~ie10和Opera/Firefox/Chrome的hack,本例特别要注意顺序

IE6显示为:橘色,

IE7显示为:粉色,

IE8显示为:黄色,

IE9显示为:紫色,

IE10显示为:绿色,

Firefox显示为:蓝色,

Opera显示为:黑色,

Safari/Chrome显示为:灰色,

CSS hack方式三:选择器前缀法

选择器前缀法是针对一些页面表现不一致或者需要特殊对待的浏览器,在CSS选择器前加上一些只有某些

特定浏览器才能识别的前缀进行hack。

目前最常见的是

*html *前缀只对IE6生效

*+html *+前缀只对IE7生效

@media screen\9{...}只对IE6/7生效

@media \0screen {body { background: red; }}只对IE8有效

@media \0screen\,screen\9{body { background: blue; }}只对IE6/7/8有效

@media screen\0 {body { background: green; }} 只对IE8/9/10有效

@media screen and (min-width:0\0) {body { background: gray; }} 只对IE9/10有效

@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {body { 

background: orange; }} 只对IE10有效

等等

结合CSS3的一些选择器,如html:first-child,body:nth-of-type(1),衍生出更多的hack方式,具体的

可以参考下表:

CSS3选择器结合JavaScript的Hack

我们用IE10进行举例:

由于IE10用户代理字符串(UserAgent)为:Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; 

Trident/6.0),所以我们可以使用javascript将此属性添加到文档标签中,再运用CSS3基本选择器匹配



JavaScript代码:

var htmlObj = document.documentElement;
htmlObj.setAttribute('data-useragent',navigator.userAgent);
htmlObj.setAttribute('data-platform', navigator.platform );

CSS3匹配代码:

html[data-useragent*='MSIE 10.0'] #id {
color: #F00;

}

CSS hack利弊

一般情况下,我们尽量避免使用CSS hack,但是有些情况为了顾及用户体验实现向下兼容,不得已才使

用hack。比如由于IE8及以下版本不支持CSS3,而我们的项目页面使用了大量CSS3新属性在

IE9/Firefox/Chrome下正常渲染,这种情况下如果不使用css3pie或htc或条件注释等方法时,可能就得让

IE8-的专属hack出马了。使用hack虽然对页面表现的一致性有好处,但过多的滥用会造成html文档混乱

不堪,增加管理和维护的负担。相信只要大家一起努力,少用、慎用hack,未来一定会促使浏览器厂商

的标准越来越趋于统一,顺利过渡到标准浏览器的主流时代。抛弃那些陈旧的IE hack,必将减轻我们编

码的复杂度,少做无用功。

最后补上一张引自国外某大牛总结的CSS hack表,这时一张6年前的旧知识汇总表了,放在这里仅供需要

时候方便参考。

 

说明:本文测试环境为IE6~IE10,Chrome 29.0.1547.66 m,Firefox 20.0.1 ,Opera 12.02等。一边工

作,一边总结,总结了几天写下整理好,今天把它分享出来,文中难免有纰漏,如大侠发现请及时告知



========

常用CSS Hack

http://www.css88.com/book/css/hack/index.htm

条件Hack属性级Hack选择符级Hack

* 这里只列举一些使用比率较高的常用CSS Hack,且不考虑IE6以下的版本。若对其它更多Hack有兴趣,

可Google或Baidu。

* CSS Hack一般都是利用各浏览器的支持CSS的能力和BUG来进行的。所以对浏览器的选择大致可以分为

能力选择和怪癖选择(BUG)。能力通常是指浏览器对CSS特性的支持程度,而怪癖是指浏览器特有的一些

BUG。

* 友情提示:尽量找到通用方法而减少对CSS Hack的使用,大规模使用CSS Hack会带来维护成本的提高

以及浏览器版本变化而带来类似Hack失效等系列问题。

========

CSS Hack是什么意思?

css hack有什么用?
https://www.w3cschool.cn/css3/question-10231625.html
一、什么是CSS Hack?

CSS hack谷歌翻译给出的解释是“CSS黑客”。

CSS Hack谷歌翻译

百度翻译给出的解释是“浏览器兼容;浏览器兼容性问题”

CSS Hack百度翻译

那么在HTML中CSS hack究竟是什么意思呢?

CSS hack是通过在CSS样式中加入一些特殊的符号,让不同的浏览器识别不同的符号(什么样的浏览器识

别什么样的符号是有标准的,CSS hack就是让你记住这个标准),以达到应用不同的CSS样式的目的,比

如.kwstu{width:300px;_width:200px;},一般浏览器会先给元素使用width:300px;的样式,紧接着后面

还有个_width:200px;由于下划线_width只有IE6可以识别,所以此样式在IE6中实际设置对象的宽度为

200px,后面的把前面的给覆盖了,而其他浏览器不识别_width不会执行_width:200px;这句样式,所以

在其他浏览器中设置对象的宽度就是300px;

以下是引自百度百科的定义

CSS hack由于不同厂商的浏览器,比如Internet Explorer,Safari,Mozilla Firefox,Chrome等,或者是

同一厂商的浏览器的不同版本,如IE6和IE7,对CSS的解析认识不完全一样,因此会导致生成的页面效果

不一样,得不到我们所需要的页面效果。 这个时候我们就需要针对不同的浏览器去写不同的CSS,让它

能够同时兼容不同的浏览器,能在不同的浏览器中也能得到我们想要的页面效果。

简单的说,CSS hack的目的就是使你的CSS代码兼容不同的浏览器。当然,我们也可以反过来利用CSS 

hack为不同版本的浏览器定制编写不同的CSS效果。

注意: 我们通常主要考虑的浏览器有IE6、IE7、IE8、谷歌浏览器(chrome)、火狐(Mozilla Firefox

)即可,至于我们常用的傲游、QQ的TT浏览器是用你计算机中装的系统自带浏览器的内核,所以只需要

兼容以上浏览器即可兼容TT傲游浏览器。

CSS Hack常见的有三种形式:

CSS属性Hack、CSS选择符Hack以及IE条件注释Hack, Hack主要针对IE浏览器。

1、属性级Hack:比如IE6能识别下划线“_”和星号“*”,IE7能识别星号“*”,但不能识别下划线”_ 

”,而firefox两个都不能认识。

2、选择符级Hack:比如IE6能识别*html .class{},IE7能识别*+html .class{}或者*:first-child

+html .class{}。

CSS<wbr>Hack技术介绍及常用的Hack技巧集锦

3、IE条件注释Hack:IE条件注释是微软IE5开始就提供的一种非标准逻辑语句。比如针对所有IE:

<!-[if IE]><!-您的代码-><![endif]>,针对IE6及以下版本:<!-[if it IE 

7]><!-您的代码-><![endif]->,这类Hack不仅对CSS生效,对写在判断语句里面的所有

代码都会生效。

PS:条件注释只有在IE浏览器下才能执行,这个代码在非IE浏览下被当做注释视而不见。可以通过IE条

件注释载入不同的CSS、JS、HTML和服务器代码等。

二、CSS hack的实际应用

CSS hack用来解决有些css属性在不同浏览器中显示的效果不一样的问题,如margin属性在ie6中显示的

距离会比其他浏览器中显示的距离宽2倍,也就是说margin-left:20px;在ie6中距左侧对象的实际显示距

离是40px,而在非ie6中显示的距左侧对象的距离是设置的值20px;所以要想设置一个对象距离左侧对象

的距离在所有浏览器中都显示是20px的宽度的样式应为:.kwstu{margin-left:20px;_margin-

left:20px;}。比如要分辨IE6和firefox两种浏览器,可以这样写:

div{

background:green;/*forfirefox*/

*background:red;/*forIE6*/(bothIE6&&IE7)

}

我在IE6中看到是红色的,在firefox中看到是绿色的。

解释一下:上面的css在firefox中,它是认识不了后面的那个带星号的东西是什么的,于是将它过滤掉

,不予理睬,解析得到的结果是:div{background:green} ,于是理所当然这个div的背景是绿色的。在

IE6中呢,它两个background都能识别出来,它解析得到的结果是:div

{background:green;*background:red;} ,于是根据优先级别,处在后面的red的优先级高,于是当然这

个div的背景颜色就是红色的了。CSS hack:区分IE6,IE7,firefox区别不同浏览器,CSS hack写法:

区别IE6与FF:

background:orange;*background:blue;

区别IE6与IE7:

background:green!important;background:blue;

区别IE7与FF:

background:orange;*background:green;

区别FF,IE7,IE6:

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

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

注:IE都能识别*;标准浏览器(如FF)不能识别*;IE6能识别*;不能识别 !important ;IE7能识别*,能

识别!important;FF不能识别*,但能识别!important;

浏览器优先级别:

FF<IE7<IE6,CSS hack

书写顺序一般为FF IE7 IE6

以: " #demo {width:100px;} "为例:

#demo {width:100px;} /*被FIREFOX,IE6,IE7执行.*/

* html #demo {width:120px;} /*会被IE6执行,之前的定义会被后来的覆盖,所以#demo的宽度在IE6就为

120px; */

*+html #demo {width:130px;} /*会被IE7执行*/

所以最后,#demo的宽度在三个浏览器的解释为: FIREFOX:100px; ie6:120px; ie7:130px;

IE8 最新css hack:

"9" 例:"border:1px 9;".这里的"9"可以区别所有IE和FireFox.(只针对IE9 Hack)

"0" IE8识别,IE6、IE7不能.

"*" IE6、IE7可以识别.IE8、FireFox不能.

"_" IE6可以识别"_",IE7、IE8、FireFox不能.

IE6 hack

_background-color:#CDCDCD;/*ie6*/

IE7 hack

*background-color:#dddd00; /* ie 7*/IE8 hack

background-color:red 0; /* ie 8/9*/IE9 hack

background-color:blue 90;火狐,傲游,浏览器通用

background-color:red!important;

注意写hack的顺序,其中:

background-color:red0;IE8和IE9都支持;

background-color:blue90; 仅IE9支持;

另外,background-color:eeeeee9;的HACK支持IE6-IE8,但是IE8不能识别“*”和“_”的CSS HACK。

可综合上述规律灵活应用。

IE9 和 IE8 以及其他版本的区别说明

background-color:blue; 各个浏览器都认识,这里给firefox用;

background-color:red9;9所有的ie浏览器可识别;

background-color:yellow0; 0 是留给ie8的,最新版opera也认识,后面自有hack写了给opera认的,所

以,0我们就认为是给ie8留的;

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

_background-color:orange; _专门留给神奇的ie6;

:root #test { background-color:purple9; } :root是给ie9的,网上流传了个版本是 :root #test { 

background- color:purple0;},这个,新版opera也认识,所以经笔者反复验证最终ie9特有的为:root 

选择符 {属性9;}

@media all and (min-width:0px){ #test {background-color:black0;} } 这个是老是跟ie抢着认0的

神奇的opera,必须加个0,不然firefox,chrome,safari也都认识。。。

@media screen and (-webkit-min-device-pixel-ratio:0){ #test {background-color:gray;} }最后

这个是浏览器新贵chrome和safari的。

选择符级HackCSS内部选择符级Hack语法

<hack> selector{ sRules }

说明选择不同的浏览器及版本尽可能减少对CSS Hack的使用。Hack有风险,使用需谨慎通常如未作特别

说明,本文档所有的代码和示例的默认运行环境都为标准模式。一些CSS Hack由于浏览器存在交叉认识

,所以需要通过层层覆盖的方式来实现对不同浏览器进行Hack的。简单列举几个:

* 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 */

内部属性HackCSS内部属性级Hack语法:

selector{<hack>?property:value<hack>?;}

取值:

注意: 不管是什么方法,书写的顺序都是firefox的写在前面,IE7的写在中间,IE6的写在最后面。补

充:IE6能识别* ,但不能识别 !important,IE7能识别 *,也能识别!important;FF不能识别 *,但能识

别!important;下划线” _ “,IE6支持下划线,IE7和firefox均不支持下划线。

三、为什么不推荐不推荐使用CSS hack来解决兼容性问题

CSS hack是因为现有浏览器对标准的解析不同,为了兼容各浏览器,所采用的一种补救方法。CSS hack

是一种类似作弊的手段,以欺骗浏览器的方式达到兼容的目的,是用浏览器的兼容性差异来解决浏览器

的兼容性问题。因此,在设计之初,写CSS hack需要遵循以下三条原则:

有效: 能够通过 Web 标准的验证

只针对太古老的/不再开发的/已被抛弃的浏览器, 而不是目前的主流浏览器

代码要丑陋。让人记住这是一个不得已而为之的 Hack, 时刻记住要想办法去掉它。现在很多hacks已经

抛弃了最初的原则,而滥用hack会导致浏览器更新之后产生更多的兼容性问题。因此,并不推荐使用CSS 

hack来解决兼容性问题。

========
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  css css hack