煮酒论英雄-CSS HACK 你不知道的那些事儿!

不少朋友搞不清楚CSS中有哪些HACK,怎么使用,我翻译+整理了一下贴在这里。这篇文章是关于CSS的hacking技术。不要和微软专有 的CSS属性“滤镜”混淆。css

在 理想世界里,正确的CSS应该在任何支持CSS的浏览器里工做良好。不幸的是,咱们并非生活在理想的世界里,浏览器们布满了BUG和不一 致。建立一个跨浏览器而且显示一致的页面,CSS开发者必须想尽办法。经过使用BUG和未实现的CSS,开发者就可以为不一样的浏览器应用不一样的规则。 HACK和FILTER是开发者强有力的武器。了解各类经常使用的HACKS以及它们如何工做,是件重要的事,但何时用和何时不用它们,也是件同等重 要的事情。html

CSS filter或者hack是一种代码,用来根据浏览器类型,版本号显示或隐藏CSS标签。浏览器们对CSS行为有不一样的解释,对W3C标准的支持程度也不 相同。CSS 过滤器常常用于在多个浏览器中实现一致的布局外观,由于某些浏览器没法渲染。HACK(黑客)这样的称呼多少有点消极,实质上属于我的对CSS代码非官方 的修改,误导人们觉得还有更好的方法达到目的,但其实咱们没有,有的人喜欢用patch(补丁)来称呼它,这样人们就能知道这本是浏览器形成的错误。express

反斜线符号浏览器

这种hack利用了一个在Mac平台上的IE的bug。以\*/结束的注释在IE Mac上是不正确关闭的,因此那些须要被忽略的语句能够放在这种注释后面。布局

/* 在IE Mac上忽略下面的语句 \*/this

selector { ...styles... }spa

/* 忽略结束 */firefox

盒模型hack翻译

(适用于IE6如下版本)htm

叫它“盒模型hack”是由于它常常被用于解决IE的盒模型错误,这个hack能够为IE和其它浏览器设置不一样的属性。(在版本6时,IE已经 修正了这个盒模型错误。)

#elem {

width: [IE 中的宽度];

voice-family: "\"}\"";

voice-family:inherit;

width: [其它浏览器中的宽度];

}

html>body #elem {

width:[其它浏览器中的宽度];

}

第 一个,把voice-family设置为字符串"}",可是IE的解析bug会把它看成一个反斜线加右括号。选择voice-family是 由于它不会影响到页面样式。第二个规则,使用了html>body hack,是为Opera7.0之前浏览器,它也有这样的解析错误,但幸亏它支持子选择器,因此有这样较简单的方法。

下划线hack

(适用于IE6及其如下版本)

IE 6 及如下的版本能够识别带有下划线前缀的属性,而其它的浏览器会忽略它。所以,一个属性前面加上下划线或者连字符,就成为了IE6及如下版本浏览器的专有属 性。

#elem {

width: [W3C Model Width];

_width: [BorderBox Model];

}

这个hack使用了无效的CSS,利用了一个浏览器的bug,可是咱们有有效的CSS语句能够完成这样的事情,因此这个HACK不推荐使用。

星号hack

(适用于IE7如下版本)

除了下划线和连字符,版本7及如下的IE能够识别以非字母字符为前缀的属性,而其它浏览器会忽略。

#elem {

width: [W3C Model Width];

*width: [BorderBox Model];

}

这个HACK不推荐使用,缘由同上面的下划线HACK同样。

星号 HTML hack

(适用于IE4-6)

HTML 元素是W3C标准DOM (Document Object Model)的根元素,可是IE 4至6的版本中还有一个神秘的父元素。彻底兼容的浏览器会忽略这个* html选择器,但IE4-6却会对它正常处理。这样就能够为这些版本的浏览器指定特别的规则。好比,这个规则能够特别指定IE4-6中的文字大小,但对 其它浏览器不起做用。

* html p {font-size: 5em; }

这个HACK使用了彻底有效的CSS。

星号加号HACK

(适用于IE7)

虽然IE7再也不识别之前的* html hack,但它使用了一个类似的新的hack。

*:first-child+html p { font-size: 5em; }

或者:

*+html p { font-size: 5em; }

此代码只适用于IE7,不适用于其它任何浏览器。注意这个HACK只在IE7标准模型里工做正常,在怪异模式下不能用。这个hack也被IE8 的兼容模式(至关于IE7的标准模式)所支持。和星号HTML hack同样,它也使用了有效的CSS。

子选择器hack

(适用于IE6及如下版本)

IE6和早期的版本不支持“子选择器”(>),利用这个咱们能够为其它浏览器指定特别的规则。举例来讲,这个规则可让段落文字在 firefox 变成蓝色,但在IE7以前的版本里却不能。

html > body p { color: blue; }

虽然IE7增长了对子选择器的支持,但人们发现了新的hack能够把IE7也排除。当一个空的注释紧跟在子选择器的后面重复的时候,IE7会不 识别后面的规则,就和较早版本的浏览器同样。

html >/**/ body p { color: blue; }

否认伪类HACK

(可区分IE和非IE)

IE的全部版本都不支持CSS3 : not() 伪类。有一种变异的HACK使用 : root 伪类,此伪类也一样不被IE识别。

.yourSelector {

color: black;

} /* IE中的值 */

html:not([dummy]) .yourSelector {

color: red;

} /* Safari, Opera and Firefox中的值 */

这种否认选择器接受任何类型做为参数,属性,通用,类或ID选择器,或者伪类。而后它会把后面的属性应用于全部不匹配此语法的元素上。

Body:empty hack

(适用于Firefox 2.0及如下版本)

:empty 伪类,在CSS3中介绍过的,用于选择不含任何内容的元素。然而,Geck0 1.8.1 和以后版本(应用在Firefox2.0.x 及以后的版本)错误地选择了body:empty 即便body元素包含有内容(通常状况都如此)。这样咱们能够向Firefox 2.0x及如下版本提供专用的CSS规则。

/* 让 p 元素在 Firefox 2.0.x 及如下的版本中不显示 */

body:empty p {

display:none;

}

此HACK使用有效的CSS.

!Important 怪僻

(适用于IE8如下版本)

IE8及如下版本有一些和!imporant有关的怪僻,它容许一个赋值优先级更高。IE7及更早版本接受任意字符串替代important, 而且会正常处理该值,而其它浏览器则会忽略。

/* 在IE8及如下版本下设文字为蓝色,其它浏览器中为黑色 */

body {

color: black;

color: blue !ie;

}

类似地,IE8及更早版本接受在!important声明后面的非字母符号,而其它浏览器会忽略它。

body {

color: black;

color: blue !important!;

}

IE6及如下版本有一个!important带来的问题,当在同一段代码块中同一元素的同一属性有了不一样的值,本应结果是第二个值被第一个取 代,但IE6及更低版本并不这么作。

/* 在IE6及更低版本中设文字为蓝色 */

body {

color: black !important;

color: blue;

}

全部这些HACK使用的是有效的CSS。

动态属性

在版本5至7,IE曾支持过一种语法适用于动态变化的CSS属性,有时被称为CSS表达式。动态属性一般混合其它HACK以补偿更早版IE中不 支持的属性。

div {

min-height: 300px;

/* 在IE6中模拟 min-height */

_height: expression(document.body.clientHeight < 300 ? "300px" : "auto");

}

有条件的注释

有条件的注释只在Windows平台的IE上被识别,并从IE5起开始支持,它甚至能够区分版本5.0,5.5和6.0。

代码:

下面是一些“有条件的注释”,能够显示你正在使用的IE版本。若是你看不到,那么你用的不是IE:

<p><!--[if IE]>

According to the conditional comment this is Internet Explorer<br />

<![endif]-->

<!--[if IE 5]>

According to the conditional comment this is Internet Explorer 5<br />

<![endif]-->

<!--[if IE 5.0]>

According to the conditional comment this is Internet Explorer 5.0<br />

<![endif]-->

<!--[if IE 5.5]>

According to the conditional comment this is Internet Explorer 5.5<br />

<![endif]-->

<!--[if IE 6]>

According to the conditional comment this is Internet Explorer 6<br />

<![endif]-->

<!--[if IE 7]>

According to the conditional comment this is Internet Explorer 7<br />

<![endif]-->

<!--[if gte IE 5]>

According to the conditional comment this is Internet Explorer 5 and up<br />

<![endif]-->

<!--[if lt IE 6]>

According to the conditional comment this is Internet Explorer lower than 6<br />

<![endif]-->

<!--[if lte IE 5.5]>

According to the conditional comment this is Internet Explorer lower or equal to 5.5<br />

<![endif]-->

<!--[if gt IE 6]>

According to the conditional comment this is Internet Explorer greater than 6<br />

<![endif]-->

</p>

注意它的语法:

- gt: 高于

- lte:低于或至关

说明:

1.它们的基本结构和HTML注释同样(<!-- -->)。所以其它全部浏览器会把它们看成正常的注释忽略掉。

2.Windows IE里的程序能够识别这个特殊的<!--[if IE]>语法,处理if并解析此注释中的内容,就看成是正常的网页内容同样。

3.既然“有条件的注释”使用了HTML注释的结构,它们就只能被包含在HTML文件里,而不是CSS文件里。你能够把整 个<link>标签放在“有条件的注释”里,指向一个指定的样式表。以下所示:

<link href="all_browsers.css" rel="stylesheet" type="text/css">

<!--[if IE]> <link href="ie_only.css" rel="stylesheet" type="text/css"> <![endif]-->

<!--[if lt IE 7]> <link href="ie_6_and_below.css" rel="stylesheet" type="text/css"> <![endif]-->

<!--[if !lt IE 7]><![IGNORE[--><![IGNORE[]]> <link href="recent.css" rel="stylesheet" type="text/css"> <!--<![endif]-->

<!--[if !IE]>--> <link href="not_ie.css" rel="stylesheet" type="text/css"> <!--<![endif]-->

IE8 hack

IE8不能识别“*”和“_”的css hack,因此咱们可使用"\9"来区分IE的各个版本。

color:#0000FF\9; ; /*ie6,ie7,ie8*/

*color:#FFFF00; /*ie7*/

_color:#FF0000; /*ie6*/

相关文章
相关标签/搜索