代码改变世界

编写hack的技巧

2012-05-15 09:40  田志良  阅读(433)  评论(0编辑  收藏  举报

与其把样式表和与浏览器相关的hack(使CSS能在兼容性较差的浏览器中发挥作用)混在一起,不如把这些workaround放在与浏览器相关的样式表中,即把CSS与hack分离。虽然这种“hack隔离”严格地讲不是必须的,但这样做的好处是能保持CSS的整洁,请看图1-19。

在这个模型中,有一个到样式表的链接——这里没有什么不寻常之处。但是第一个样式表仅仅起到网关的作用,通过它引入其他样式表,这些样式表通过@import规则引入。这是第一个引入的样式表,它包含站点的表现,是一个无hack的干净样式表。之后就可以简单引入与浏览器有关的样式表,这些样式表包含必要的hack以保证站点在所有目标浏览器上显示的一致性。

说明:

当然还有管理hack的其他方法。Web设计人员Mark Pilgrim介绍了他是如何在Web服务器上用用户代理检测来传送与浏览器有关的hack的(http://diveintomark.org/archives/2003/01/16/the_one_ive_never_tried)。这种方法被称为服务器端的内容协商。虽然这种方法需要Apache Web Server的相关知识并要求能对Apache Web Server及其mod_rewrite组件进行配置,但确实是非常好的方法。所以在技术水平比这里提供的解决方案要求还高时,这种服务器端的解决方案是一个非常好的选择。

在CSS文件网关的第一行将调用核心的样式表:

这里没有什么令人惊异的地方。一个简单的@import规则就导入了core.css,这个文件已在许多对CSS有很好支持的浏览器上经过了充分测试。现在只要用@import包含其他文件,就没什么可以阻止所有浏览器对它们进行解析的了。要做的是如何使这些CSS文件可选,使只有存在问题的用户代理消化这些规则。如果可能,还应该使“好”的浏览器意识不到这些hack。您会问,如何才能做到这一点?对了,解铃还需系铃人。我们可以用CSS hack编写一些更智能的hack。

首先,我们来处理IE 5.x/Win。该浏览器实现的CSS box模型是声名狼籍的,它所实现的box模型一定会使您的布局出现一些问题。因此,与其在核心样式表中添加workaround,不如利用Mid Pass Filter(MPF),这是一个非常精妙的技术。

MPF由CSS先驱和Web开发人员Tantek ?elik开发,它把一个样式表传递给IE 5.x/Win,并且只传给这种浏览器。所有其他用户代理将忽略这条规则,因为它们不会遇到与IE 5.x/Win一样的解析错误。

虽然IE 5.x/Mac对CSS的支持远比Windows平台的IE要好,但并不是没有错误。这种浏览器的开发截止于2003年中期,我们要自己处理偶发的布局问题。令人欣喜的是,有另一个筛选器可以处理这些问题,即IE 5/Mac Band Pass Filter.

IE 5/Mac Band Pass Filter也是由Tantek ?elik开发并由页面设计人员Doug Bowman推广,您已经猜到,这种筛选器只把CSS导入到IE5/Mac。其效果仍然与MPF相同。其他浏览器将忽略专为这种浏览器的怪问题而设计的样式表。

说明:

有关其他CSS筛选器和hack管理技术的介绍,请参考Molly Holzschlag的文章Integrated Web Design: Strategies for Long-Term CSS Hack Management(http://www.informit.com/articles/article.asp?p=170511)。这部分内容主要来自Molly的这篇优秀论文,在此未提及论文中的其他筛选器。

您可能会问自己,为什么这些解析错误是管理其他hack的最好办法?老实说,我只能泛泛地谈一下。把与浏览器有关的hack独立出来放在一个CSS文件中,以及保持核心样式表的相对纯洁,可以获得两个切实的好处。首先,这些workaround比较容易被其他人定位、维护和修改。第二,可以解决hack荒废的问题。如果您现在不需要支持某个浏览器,只需在核心样式表中删除几行就行了。

转发:http://book.51cto.com/art/200908/145979.htm