http://www.keephelp.com/css/divcss-ie7-ie6-firefox-1/
在理想的环境中,编写正确的CSS会在支持CSS的每个浏览器中正常工作。不幸的是,我们并不是生活在理想的世界中,浏览器有不少的Bug和不一致的地方。为了创建能够在各种浏览器上显示相同样式的页面,CSS开发人员需要发挥创造性。通过利用Bug(hack)和未实现的CSS,开发人员能够选择性地对不同浏览器应用不同地规则。“招数Hack”和“过滤器”是CSS开发人员地强大工具。但是,正因为功能强大,使用时应该谨慎。了解各种常用招数Hack以及他们地工作原理确实很重要。但是,了解在什么时候应用他们以及什么时候不应该使用也同样重要。
在后面讲陆续讲这样的一些东西。
- 招数和过滤器之间的差异。
- 好的过滤器和差的过滤器以及如何复责任地使用他们。
- IE地有条件注释。
- 星号Html过滤器和星号、加号Html过滤器。
- 注释反斜线过滤器和Holly招数。
- 反斜线过滤器和修改后地简化框模型招数(MSBMH)。
- !important 和下划线过滤器。
- 子过滤器和属性过滤器
多浏览器兼容是一件苦力活,其实没有什么难度,针对不同地浏览器利用上面讲地方法,适当地写上不同浏览器支持地样式,这样多浏览器在一块就和谐了。 甚至在不同的操作系统也可以和谐共处。比如MAC和PC。要相信自己能够战胜这样的困难,多浏览器兼容需要不停的调试,需要耐心,我以前曾写过一个没有利 用任何Bug(Hack、!important)的CSS,也可以完美支持所有的浏览器,虽然一个页面的CSS需要几天来调试,但是这件苦力活并不是不可能完成的。其实还是一句老话,世上无难事,只怕有心人。
一、Hack实施策略
应该使用怎样的策略保证一个网站的CSS简单明了,而且又能适应众多浏览器呢?如果经过充分的思考,认识到只能应用某种Hack或过滤器,那么需要以明智且受控制的方式应用它。如果CSS短小而且简单,并且只需要应用很少几个Hack,那么将这些Hack放在主CSS文件中可能是安全的。但是,Hack往往相当复杂,使代码更加难懂。如果CSS文件很长,或者需要使用的招数比较多,那么最好将它们放在它们自己的样式表中。这不但使代码容易阅读,而且如果Hack在新的浏览器中造成了什么问题,那么可以准确的知道它的位置。与此相似,如果决定取消对某种浏览器的支持,那么只需要删除适当的CSS文件,就可以删除相关联的Hack。或者用程序判断浏览器信息,然后链接相应的CSS文件。或者可以用条件注释。
为了帮助你正确的选择过滤器或者Hack,推荐这个站点(http://centricle.com/ref/css/filters/)。这个站点提供了表格来描述那些过滤器在那些浏览器中是有效的,非常详尽。
常用Hack浏览器匹配图:
二、条件注释
有条件注释是一种专门的(因为是非标准的)、对常规(X)Html注释的Microsoft扩展。顾名思义,有条件注释使你能够根据条件(比如浏览 器版本)显示代码块。因为使非标准的,但是有条件注释对于其他所有浏览器作为常规注释出现,因此本质上是无害的。有条件注释在Windows 上的IE5中首次出现,并且得到了Windows浏览器的所有后续版本的支持。
要想将一个特定的样式表交给IE5、IE6、IE7或更高的版本,那么可以在(X)Html文档的开头放置一下代码:
<!--[if IE]
<style type="text/css">
@import ("ie.css");
</style>
-->
Windows上的IE5和更高版本会接收样式表ie.css,而其他所有浏览器只会看到一些被注释掉的文本。可以使用有条件注释指定一种特定的浏览器,比如IE6.0
<!-- [if IE 6]
<style type="text/css">
@import ("ie60.css");
</style>
-->
还可以指定一组浏览器,比如IE5.5和更高的版本:
<!-- [if gte IE 5.5000]
<style type="text/css">
@import ("ie55up.css");
</style>
-->
或者IE7
<!-- [if It IE 7]
<style type="text/css">
@import ("ie70.css");
</style>
-->
这种办法极其有效,而且非常容易记住。主要的确定是这些注释需要放在HTML中,而不是放在CSS中。如果某一阶段你希望停止支持某种浏览器,就需 要从每个页面中删除注释,当然这只是针对静态页面的站点了,如果你是动态网站的话,把CSS作为可动态调用的一部分,这样修改起来也很方便的。如果你觉得 还不好,那我们下一篇再看另外一个过滤器Tantek Celik。
Tantek Celik 基于浏览器解析错误创建了一系列过滤器(http://tantek.com/css/examples/),允许使用@import规则将样式表提供给选择的浏览器。因为他们是CSS规则,所有这些过滤器可以放在一个CSS文件中,这样就可以再一个地方集中的控制过滤的文件。将招数Hack隔离到浏览器特定的CSS文件中,可以大大简化对招数Hack的管理。如果决定停止对某一浏览器(比如IE 5.0)的支持,那么只需要删除相关的样式表,而不需要再大量页面代码中进行搜索和修改。
注意: /**/ 是CSS中的注释格式。其实下面所说的所有过滤方法都是 /**/注释 和 \ 转义的混合效果。
要想将CSS文件传递给 Windows 上的IE5.5 和IE5,可以使用 Tantek 的中统过滤器:
@media tty {
i{content:”\”;/*” “*/}} @import ‘ie5x.css’; /*”;}
}
这个过滤器看起来像一堆无意义的规则,而且对于许多浏览器确实如此。只能理解CSS 1的 浏览器不认识@media 规则,因此完全忽略它。能力更强的浏览器会看到@media 规则中的一个声明,其目标是寻找<i>元素。由于第二个引号前面有一个转义字符,Content 属性的值被认为是一个无意义的字符串。基本上,现代浏览器会看到下面这样的规则:
@media tty {
i { content:”Blah, blah blah”;}
}
转义字符是一个保留字符(通常是反斜线),它使解析器忽略后面的保留字符。所以所以,如果希望使用 CSS content 属性自动生成一个引号,那么必须对它进行转义,否则它就会结束前引号:
blockquote:before {content: “\”"}
tty 媒体类型指的终端和电传打印机。新运的使,当前没有设备支持这种媒体类型,所以符合标准的浏览器实际上会忽略整个规则。
但是,IE5.x/Windows 不理解转移字符的,所以会提前结束内容声明。后面的字符会结束<i> 和@media规则,这导致应用@import 规则。所有多于的字符都被注释掉,因此再 IE 5.x/Win 看来整个规则像下面这样:
@media tty {
i { content:”blah” ;
/* blah */
}
}
@import ‘ie5x.css’
/* blah */
这非常复杂,但是幸运的是,你不需要知道这些过滤器是则怎么工作的,只需要知道怎么使用他们就可以了。
为了向IE 5.x/Win 的特定版本提供CSS文件,创建了中通过滤器的两个变体,他们利用了这些特定浏览器中各种Bug。这些过滤器称为IE 5/Windows 带通过滤器:
@media tty {
i {content:”\”;/*” “*/}}; @import ‘ie50win.css’; {;}/*”;}
}/* */
和IE 5.5/Windows 带通过滤器}
@media tty{
i {content:”\”;/*” */}}@m; @import ‘ie55win.css’; /*;}
}
另一种可能希望明确指定的浏览器是Mac 上的IE 5.2。为此,可以使用Tantek的IE5/Mac带通过滤器,它利用了另一个转义Bug,这一次是在注释中:
/*\*//*/
@import “ie5mac.css”;
/**/
IE 5/Mac 错误地对第二个星号进行转义,导致应用@import 规则。因此, IE5/mac 会看到下面这样的规则:
/* blah */
@import “ie5mac.css”;
/**/
而其他所有浏览器都会正确的忽略转义的元素,因为它放在一个注释中,@import 规则被注释掉了。其他所有浏览器都会看到下面这样的规则(实际上就是没有规则)
/* blah *//*
blah
*/
与其他带通过滤器一样,不需要理解这个过滤器的工作原理,直接使用即可。这些过滤器的出色之处在于,他们巧妙的利用了老式浏览器中的Bug。因此,应该可以放心的使用他们,他们应该不会在新式的浏览器中造成问题。
PS:也许你过两天也发现了你独特的过滤器哦~~ :)
最安全的过滤器依赖于未实现的CSS,而不是浏览器Bug。因为这些过滤器使用有效的CSS选择器来应用有效的声明,所以严格地说,他们根本不是过滤器。他们仅仅是某些浏览器所不能理解的有效CSS规则。这些过滤器中的第一个称为子选择器招数。Windows上的IE6和更低版本的IE不支持子选择器,所以可以使用它对这些浏览器隐藏规则。为了让这种过滤器起到作用,必须确保在子选择器前后没有空格。
在这个示例中,使用子选择器招数(Hack)对IE 5-6/Win 隐藏透明的北京PNG图象。
html>body {
background-image:(bg.png)
}
IE7 预期会支持子选择器,还会支持PNG透明度。通过以这种方式使用子选择器,就允许IE的新版本看到透明背景,而不需要修改代码,因而提供了向前兼容性。等于ie5,i56视而不见,而IE7可以用得恰当好处,这里并不是多浏览器兼容,而是向前兼容。
属性选择器招数(Hack)
另一种过滤器规则的有趣方法是使用属性选择器。许多当前的浏览器(比如 Safari–Mac苹果上的 和Firefox IE7)支持使用属性选择器,但是IE6并不支持它。因此,可以使用属性选择器在比较高级的浏览器中对类和ID应用样式。在这个示例中,使用属性选择器在 符合标准的浏览器中将背景PNG应用于内容div:
div[id="content"] {
background=url(bg.png);
}
你可以用这些让不同浏览器显示出不同的效果,当然也可以使用它在多浏览器里显示同样的效果。
对于CSS当中让IE7、IE6、Firefox兼容最著名且最有用的CSS过滤器之一是星号 * Html HACK。这个过滤器非常容易记住,它可以制定IE6和更低版本。正如你知道的,Html 元素被认为是网页上的第一个元素,即根元素。但是,IE 的所有当前版本有一个匿名的根元素,它包围着Html 元素。那么这个匿名的元素或者说隐藏的元素到底是什么元素呢?其实它就是鼎鼎大名的* 号,所以我们可以用星号来指定的规则应用于那些被星号包围的 HTML。
IE6以及更老的IE5.5
* html {
font-size:small;
}
在任何非ie的浏览器因为没有这个规则(Html元素被*号包围),所以其他的浏览器就会当作看不见,所以当你指定这个规则的时候,你可以放心的应 用在IE6以及前一版本的IE5.5要展示效果中。IE 7 并没有完全去掉这个 Hack。而是用这样的办法来让过滤,那就是用 *+
IE7
*+html {
font-size:small
}
这样的表达,就是说除了IE7能认识这个font-size:small以外,其他的浏览器都不会看到这一条的,可以说这是IE7的专属Hack。
这样的方式可以写在同一个CSS文件,并且同时都会针对不同的浏览器产生独特的效果。所以在设计页面或者样式的时候,你不妨用FireFox 来做第一浏览器,对照Firefox样式写好后,再把页面放到IE7下看看,进行适当的调整,再放到IE6下面看看,进行适当的调整。基本上按 照<div><ul><li></li></ul></ul>的顺序嵌套的 话,IE6根IE7的规则是差不多的。调好了IE6的样式就等于调好了IE7的样式,反之亦然。再者,用Firefox来写样式还是更符合W3C一些,因 为IE6和IE7要考虑到以前的兼容性,不得不在规范上做些让步,达到兼容的目的。虽然大家都很憎恶为什么多一个Firefox,但是这是没办法的:(。 你要掌控它而不是被它掌控了^_^。
基本上用星号搭配搞定IE6,IE7,Firefox以后,像Opera之类的浏览器也会正常显示的。就不用单独考虑他们的兼容问题了。
作者:xddxz