介绍hasLayout的文章

很多时候,CSS在IE下的解析十分奇怪,明明在FF中显示得非常正确,但到了IE下却出现了问题,有的时候,这些问题甚至表现得非常诡异,例如一个比较经典的bug就是设置border的时候,有时候border会断开,刷新页面或者滚动滚动条的时候,断掉的部分又会连接起来。

这些诡异的问题往往大部分和IE下一个神秘的属性相关——hasLayout。hasLayout是IE浏览器专有的一个属性,用于CSS的解析引擎。有时候在IE下一些复杂的CSS设置解析起来会出现bug,其原因可能与hasLayout没有被自动触发有关,我们通过一些技巧,手动触发hasLayout属性就可以解决Bug了。这也算是针对IE下疑难杂症的特殊偏方了,很多时候,触发了hasLayout就可以药到病除了。

hasLayout的触发方法有很多种,例如设置width,height值,设置position为relative等。但如果设置了width,height,或position都会在触发hasLayout的同时带来一些副作用的。早期的一些工程师推荐使用“height:1%”来触发hasLayout,那时还没有出现IE7,而height属性在IE6下其实是按照"min-height"来解析的,所以只要对IE6进行hack,"* html{height:1%}"就可以触发hasLayout,同时又不带来副作用了。后来出现的IE7仍然存在很多hasLayout的问题,但IE7已经能够正确识别height属性了,“height:1%”的方法已经不再适用了。

于是,一个更好的解决方法开始流行,它使用了一个生僻的CSS属性zoom来触发hasLayout——"zoom:1"。使用"zoom:1"可以触发hasLayout,并且不会像height等属性一样引入副作用,更妙的是,我们可以不用CSS hack了。但"zoom:1"并不是一定可以触发hasLayout的。在极少数特殊的情况下,例如非常复杂的CSS设置,特别是使用DHTML的时候,使用"zoom:1"有时候也会无效,这时,我们可能需要借助更强大的"position:relative"来帮助触发hasLayout。总之,”zoom“是最常用,最安全,成本最少的触发hasLayout的方式,一般情况下,使用它就完全可以触发hasLayout了。如果遇到特殊情况,"zoom:1"无效的情况下,我们可以通过设置"position:relative"来触发hasLayout,尽管它会带来一点副作用。

值得强调的是,hasLayout的设计初衷是用于辅助块级元素的盒模型解析的,它是用于块级元素的。如果用于行内元素,会引发一些特殊的效果,就会让行内元素拥有一些块级元素的特性。

如:display:inline-block;它是行内的块级元素,它拥有块级元素的特点,可以设置长宽,可以设置margin和padding值,但它却不是独占一行的,它的宽度并不占满父元素,而是和行内元素一样,可以和其他行内元素排在同一行里。它集块级元素和行内元素的特点于一身,是个非常有用的display类型。

但是IE6和IE7是不支持display:inline-block;的。

<style type="text/css">
p
{color:red;width:100px;background:#ccc;height:30px;display:inline-block;}
</style>

adbcdefg<p>13243</p>
正常情况下,p内的13243会独占一行,显示在adbcdefg下的。如果对p设置display:inline-block;它会显示在adbcdefg后面,长度设置保留。而在IE6及IE7下还不支持,考虑到兼容性,我们必须舍弃这种用法。

如前所述,如果我们对行内元素触发hasLayout,就可以模拟display:inline-block的效果。

但它也存在一定的问题:

1)它只能对行内元素实现display:inline-block;如果是块级元素就不行。所以,这就限制了我们能使用的标签只能是行内元素的标签。

2)这个方法中还用到了针对IE的hack,* vertical-align,这也是不好的,能不用hack就尽量不要使用hack,所以这个方法并不值得推荐。可是实际项目中各种需求和情况都有可能发生,所以,如果需要用到display:inline-block,可以通过这种方法实现。

参考:

1.http://www.satzansatz.de/cssd/onhavinglayout.html

2.http://www.alixixi.com/web/a/2008070745527.shtml

3.《编写高质量代码》

大家如有更详尽的资料,请评论

posted @ 2011-04-20 19:24  郭培  阅读(329)  评论(0编辑  收藏  举报