什么是hasLayout? 下列元素默认 hasLayout=true : <table> <td> <body> <img> <hr> <input> <select> <textarea> <button> <iframe> <embed> <object> <applet> <marquee> 很多情况下,我们把 hasLayout的状态改成true 就可以解决很大部分ie下显示的bug。 min-height: (任何值)max-height: (任何值除了none)min-width: (任何值)max-width: (任何值除了none)overflow: (任何值除了visible)overflow-x: (任何值除了visible)overflow-y: (任何值除了visible)5position: fixed 因元素hasLayout而导致的问题其实一般都很容易发现:往往是内容出现错位甚至完全不可见。举一个典型例子,当一个元素内含浮动或绝对定位的内容时,它通常会表现出奇怪和错误的行为,看下面的代码: <div id="nofloatbox"> CSS代码如下: #nofloatbox {border: 1px solid #FF0000;background: #CCC;} #floatbox {float: left;width: 100px;height: 100px;border: 1px solid #0000FF; background: #00FF00;} 可见无浮动的div并没有被里面的浮动元素的高度撑开,其高度并不会自动计算。我们下面再给这个无浮动的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;} 保存刷新ie浏览器窗口,如下图:
<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> 这回的效果如下图所示: 要注意的是,hasLayout是微软专有的东西,对firefox等比较遵守标准的浏览器就无效了,因此不可太过依赖。貌似现在的IE8就已经不用特意去触发hasLayout就可以得到和firefox一致的效果,不知ie8是否已经弃用这个属性了? 其实依据合理的语义化,恰当的文档流,正确的标准化所生产出来的页面,在各个公司出品的标准渲染的浏览器下,一般并不会存在太多兼容性的问题的。 一般如果是因为layout而引起的显示不符期望效果的话,在ff下会表现正常,而在ie下会出现错误。这个时候可以尝试触发父容器及其中的子容器 的 haslayout属性,通常可以通过加上zoom: 1;来调试。直到找到了产生问题的元素,再进行针对性的修正。最好的办法是对这个元素设置尺寸属性。但是,有时不便指定尺寸属性的情况下,就只能寻找替代 方案了。对于ie7 ,最好的办法是设置最小高度属性为0;这个技术是无害的,因为0本来就是这个属性的初始值。而且没有必要对其他浏览器隐藏这个属性。而对于ie6和更早版 本中触发一个元素hasLayout的方法是在overflow属性是visible的情况下设置这个元素的高度属性为1%,然后对其他浏览器隐藏这个设 置。这种技术就是著名的Holly hack。 |
|