CSS 滤器是一个编程技术,指根据浏览器的版本、功能来隐藏或显示CSS 标记语言。各浏览器对层叠样式表行为的解释以及W3C标准 的支持不同。有时 CSS 滤镜也用来在多个渲染效果不同的浏览器中取得一致的表现。
前缀 滤镜
此滤镜使用浏览器前缀样式代码,而这些代码会被其它浏览器忽略。所以 -moz-color:red; 定义将在所有 Gecko 浏览器中显示红色,而其它浏览器则为默认颜色。
p {
color: #000; / 段落在忽略下面所有规则的浏览器中显示为黑色 /
-moz-color: #F00; / 段落在 Gecko 浏览器中显示为红色 /
-webkit-color: #00F; / 段落在 Webkit 浏览器中显示为蓝色 /
-khtml-color: #0F0; / 段落在 KHTML 浏览器中显示为绿色 /
-xv-color: #FF0; / 段落在 Presto 浏览器中显示为黄色 /
}
特定浏览器的样式只能定义在忽略它的浏览器的样式定义之后,或者使用!important标记和无前缀无!important的样式同时使用。这样有前缀的样式会覆盖无前缀的样式,达到特定浏览器想要的效果。
反斜线注释
这个 hack 利用了 Internet Explorer for Mac 的一个和注释解析相关的错误。一段以 \*/ 结束的注释在 IE Mac 下不能被正常关闭,由此哪些需要被 IE Mac 忽略的样式可以置于此注释中。样式之后需要另一段注释代码来关闭 IE Mac 下的注释。
/ IE Mac 下忽略下一条样式 \/
selector { ...styles... }
/ IE Mac 下停止忽略 /
盒模型 hack
称为 "盒模型 hack" 是因为它经常被用来处理 IE盒模型缺陷,这个方法对 Internet Explorer 使用了一个与其它浏览器不同的属性集。IE 在版本6 已经修正了这个盒模型错误,通过在文档中引入一个 文件类型描述『HTML 规范中必需的』。
#elem {
width: [IE 宽度];
voice-family: "\"}\"";
voice-family: inherit;
width: [其它浏览器宽度];
}
html>body #elem {
width: [其它浏览器宽度];
}
第一段 voice-family 语句设为字符串 "}" ,但是 IE 一个解析错误会阻断它为一个单 反斜线 跟着一个闭合 括号,作为样式指令的结尾。选择 voice-family 是因为它不会影响屏幕 样式表 上的表现。第二个使用了html>body hack 的规则是为了像 Opera 5 那样的也有这个解析错误但没有盒模型错误(同时,支持子选择器)的浏览器。
下划线 hack
Internet Explorer 版本 6 以下承认有此前缀的属性(会丢掉此前缀)。所有其它浏览器都会忽略这样的无效属性。因此,有一个 下划线 或 连字符 前缀的属性是仅仅应用到 Internet Explorer 6 以及以下版本。
#elem {
width: [W3C 模型宽度];
_width: [BorderBox 模型];
}
此 hack 使用了无效的 CSS 完全兼容的浏览器会忽略 * html 选择器,而 IE4-6 则正常处理它。这样就提供了一个对这些浏览器适用而其它浏览器会忽略的规则。例如,下面的规则指定了 Internet Explorer 4-6 的文字大小,而不会影响其它浏览器。
- html p {font-size: 5em; }
此 hack 使用了完全有效的 CSS。
星号 加号 hack
尽管 Internet Explorer 7 不再认识经典的星号 HTML hack ,它却引入了一个相似的新的选择器 hack:
*:first-child+html p { font-size: 5em; }
或…
*+html p { font-size: 5em; }
这段代码将会应用到 Internet Explorer 7 ,而不会应用到其它任意浏览器中。注意此 hack 只在 IE7 标准模式下起作用;它在诡异模式下不起作用。此 hack 也支持 Internet Explorer 8 的兼容性视图(IE7 标准模式),但不支持 IE8 标准模式。和星号 HTML hack 一样,此 hack 使用了有效的 CSS。
Internet Explorer 9 添加了 CSS3 伪类支持,包括反选伪类。
.yourSelector {
color: black;
} / 给 IE 的值 /
html:not([dummy]) .yourSelector {
color: red;
} / Safari, Opera, Firefox, and IE9+ 的值 /
反选伪类接受任意选择器:类型选择器,通用选择器,属性选择器,类选择器,ID 选择器,或者伪类选择器。(不包括伪元素和反选伪类自身)。
设置反选伪类后,所有不匹配的元素都会应用相应样式。
一个变异 hack ,使用 :root 伪类,也不会被 Internet Explorer 8 以及以下版本解析。
body:empty hack
CSS3 引入了 :empty 伪类,支持选择没有内容的元素。不过, Gecko 1.8.1 以及以下版本( Firefox 2.0.x 及以下使用)处理 body:empty 不正确,有内容时(通常都会有内容)也被选中。这就可以给 Firefox 2.0.x 及以下版本指定不同的样式规则,而不同于其它使用同样引擎的浏览器。 动态属性通常和其它 hack 一起使用以填补一些 Internet Explorer 老版本不支持的属性。
div {
min-height: 300px;
/ 在 IE6 中模拟 min-height /
_height: expression(document.body.clientHeight
条件注释
条件注释是微软 Internet Explorer 对 HTML 代码中解析的条件语句。
测试
批评
使用 hacks 隐藏代码经常导致页面在浏览器更新后不正常显示。很多被用来向 IE 6 及以下版本隐藏 CSS 的 hacks 都在 IE 7中失效了,因为 IE 7 支持更多的 CSS 标准。 微软 Internet Explorer 开发团队已经要求人们使用条件注释来代替 hacks。
参见
- 瀏覽器引擎CSS支援比較
- 条件注释
參考來源
外部链接
- [http://webarchive.loc.gov/all/20101122215458/http://centricle.com/ref/css/filters/ CSS Filters] – A fairly complete table of CSS hacks which show and hide rules from specific browsers.
- [https://web.archive.org/web/20090218214852/http://www.communis.co.uk/dithered/css_filters/css_only/index.html CSS Filters – CSS-only Filters Summary] – More CSS filters.
- [https://web.archive.org/web/20110719054958/http://www.lipfert-malik.de/webdesign/tutorial/bsp/css-weiche-filter.html Filters and Cross-Over] – CSS filters. Parsing errors marked red.
- [http://rafael.adm.br/css_browser_selector - CSS Browser Selector] - Allows to combine browser specific CSS in single stylesheet (using JavaScript).
- [https://web.archive.org/web/20110720143842/http://www.positioniseverything.net/articles/cc-plus.html - #IEroot] - Targeting IE with a single stylesheet containing all CSS (without using JavaScript, but using conditional comments to assign browser-specific tag to arbitrary content root [div])
评论 (0)