实战haslayout(实战篇)!

<div id="nofloatbox"> 
        <div id="floatbox">
        </div> 
</div>

CSS代码如下: 

#nofloatbox { 
border: 1px solid #FF0000; 
background: #CCC; 
}   
#floatbox { 
float: left; 
width: 100px; 
height: 100px; 
border: 1px solid #0000FF; 
background: #00FF00; 
}

下面给这个无浮动的div加上个zoom:1;来触发其hasLayout属性试试,css代码如下:

#nofloatbox { 
border: 1px solid #FF0000; 
background: #CCC; 
zoom:1; 
}   
#floatbox { 
float: left; 
width: 100px; 
height: 100px; 
border: 1px solid #0000FF; 
background: #00FF00; 
}

前后效果图对比:

                                            

可见这次外围容器的高度被撑起来了。以上是针对只承认zoom属性的IE6、7来测试。
同样,设定上文所述的其他也会触发hasLayout的css属性,从而得到这个结果。通常firefox等标准的遵守浏览器可以加上overflow:hidden;来解决,而IE则不行。

二、当内联元素的hasLayout为true的时候,就可以给这个内联元素设定高度和宽度并得到期望的效果。

<p>
    今天的
   <span style="width: 100px; height: 50px; background: #DDD;">
            天气
   </span>
    真好
</p> 

效果如图,可见给行内元素增加宽高等于对牛弹琴!         

下面给span加上zoom: 1;来触发hasLayout:

<p>
    今天的
   <span style="width: 100px; height: 50px; background: #DDD; zoom: 1;">
            天气
   </span>
    真好
</p>

效果如图,

其实依据合理的语义化,恰当的文档流,正确的标准化所生产出来的页面,在各个公司出品的标准渲染的浏览器下,一般并不会存在太多兼容性的问题的。一般如果是因为layout而引起的显示不符期望效果的话,在ff下会表现正常,而在ie下会出现错误。这个时候可以尝试触发父容器及其中的子容器的haslayout属性,通常可以通过加上zoom:1;来调试。直到找到了产生问题的元素,再进行针对性的修正。最好的办法是对这个元素设置尺寸属性。但是,有时不便指定尺寸属性的情况下,就只能寻找替代方案了。对于ie7,最好的办法是设置最小高度属性为0;这个技术是无害的,因为0本来就是这个属性的初始值。而且没有必要对其他浏览器隐藏这个属性。而对于ie6和更早版本中触发一个元素hasLayout的方法是在overflow属性是visible的情况下设置这个元素的高度属性为1%,然后对其他浏览器隐藏这个设置。这种技术就是著名的Holly-hack。

posted @ 2013-03-15 13:47  涅磐归来  阅读(177)  评论(0编辑  收藏  举报