`

触发hasLayout

    博客分类:
  • css
阅读更多

触发hasLayout

 
 
china_lx1

认识hasLayout——IE浏览器css bug的一大罪恶根源 转

什么是hasLayout?hasLayout是IE特有的一个属性。很多的ie下的css bug都与其息息相关。在ie中,一个元素要么自己对自身的内容进行计算大小和组织,要么依赖于父元素来计算尺寸和组织内容。当一个元素的hasLayout属性值为true时,它负责对自己和可能的子孙元素进行尺寸计算和定位。虽然这意味着这个元素需要花更多的代价来维护自身和里面的内容,而不是依赖于祖先元素来完成这些工作。 
下列元素默认 hasLayout=true 
<table> <td> <body> <img> <hr> <input> <select> <textarea> <button> <iframe> <embed> <object> <applet> <marquee> 
很多情况下,我们把 hasLayout的状态改成true 就可以解决很大部分ie下显示的bug。 
hasLayout属性不能直接设定,你只能通过设定一些特定的css属性来触发并改变 hasLayout 状态。下面列出可以触发hasLayout的一些CSS属性值。 
------------------------------------- 
display 
启动haslayout的值:inline-block 
取消hasLayout的值:其他值 
-------------------------------------- 
width/height 
启动hasLayout的值:除了auto以外的值 
取消hasLayout的值:auto 
--------------------------------------- 
position 
启动hasLayout的值:absolute 
取消hasLayout的值:static 
---------------------------------------- 
float 
启动hasLayout的值:left或right 
取消hasLayout的值:none 
--------------------------------------- 
zoom 
启动hasLayout的值:有值 
取消hasLayout的值:narmal或者空值 
(zoom是微软IE专有属性,可以触发hasLayout但不会影响页面的显示效果。zoom: 1常用来除错,不过 ie 5 对这个属性不支持。) 
---------------------------------------- 
writing-mode: tb-rl 
这也是微软专有的属性。 
ie7还有一些额外的属性可以触发该属性(不完全列表): 
min-height: (任何值) 
max-height: (任何值除了none) 
min-width: (任何值) 
max-width: (任何值除了none) 
overflow: (任何值除了visible) 
overflow-x: (任何值除了visible) 
overflow-y: (任何值除了visible)5 
position: fixed 
因元素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; 
}

ie显示结果如下图: 
 



可见无浮动的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浏览器窗口,如下图: 

 

可见这次外围容器的高度被撑起来了。 
同样,设定上文所述的其他会触发hasLayout的css属性都会得到这个结果。 
通常firefox等标准的遵守浏览器可以加上overflow: hidden;来解决,而IE则不行,需要触发其hasLayout属性才可以。 
hasLayout对于内联元素也可以有效果,当内联元素的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>

这回的效果如下图所示:

 

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

 

 

参考:http://msdn.microsoft.com/en-us/library/bb250481%28VS.85%29.aspx

分享到:
评论

相关推荐

    css中zoom:1属性的定义和作用

    今天被问起CSS中有个zoom属性是干什么用的,虽然我知道这个属性是用来清除浮动,来触发haslayout的。但具体的定义还不是很了解,就百度了一点关于zoom属性的资料,然后总结了一下。 CSS zoom属性 zoom:设置或检索...

    Span元素的width属性无效果原因及解决方案

    先运行下程序看下: ...IE5.x 下和 IE6 或更新版本的 quirks 模式下触发 hasLayout 。而对于 IE6,如果浏览器运行于标准兼容模式下,内联元素会忽略 width 或 height 属性,所以设置 width 或 height 不能在此

    关于html元素的 width属性无效果的解决方法

    1.关于元素的 width属性无效果 先运行下程序看下: ...height 只在 IE5.x 下和 IE6 或更新版本的 quirks 模式下触发 hasLayout 。而对于 IE6,如果浏览器运行于标准兼容模式下,内联元素会忽略 width 或

    兼容性的 inline-block 属性

    而现在对于 inline-block 属性运用的需求也越来越多,可惜依旧只有 Firefox3 beta、IE8 beta、Opera、Safari 支持 inline-block 属性(注:原来只有 Opera、Safari 支持),但 IE6、IE7 可以通过触发 hasLayout 来...

    IE 元素默认高度研究

    序号 HTML IE&lt;=7 CSS样式 表现: 实际高度 (px) 说明 1 &lt;div&gt;&lt;/div&gt; ...触发haslayout 3 &lt;div&gt;&lt;/div&gt; height:1px; 0 4 &lt;div&gt;&lt;/div&gt; overflow:hidden; 15 触发haslayout  

    inline-block 前世今生1

    同时我们知道 IE6、7 中 display:inline-block 是可以触发 hasLayout 的,触发了 hasLayout的元素表现出来的特征就是一

    hasLayOut与css属性的关系介绍

    hasLayOut想必大家并不陌生,当设定某一元素的css属性,能够触发该元素的layOut布局,感兴趣的朋友可以了解下

    在IE6,7中遇到未知的问题无法解决时可以尝试触发其layout

    在IE6,7中如果发现某个异常不知道如何解决的时候可以尝试着触发其haslayout: 鄙人不才,今天也遇到了一个bug尝试了很多方法,最终在整个父类加上一个height:1%,然后顺利解决。 复制代码代码如下: height:1% ...

    CSS实现两栏布局,左边固定,右边自适应的4种方法

    由于设置 overflow:hidden 并不会触发 IE6-浏览器的 haslayout 属性,所以需要设置 zoom:1 来兼容 IE6-浏览器。具体代码如下: &lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8...

    浅析两列自适应布局的3种思路

    前面已经介绍过单列定宽单列自适应的两列布局,而两列自适应布局是指一列由内容撑开,另一列撑满剩余宽度的布局方式。...由于设置overflow:hidden并不会触发IE6-浏览器的haslayout属性,所以需要设置zoom:

    CSS中不为人知Zoom属性的使用介绍(IE私有属性)

    除此之外,它还有其他一些小作用,比如触发ie的hasLayout属性,清除浮动、清除margin的重叠等。 Zoom的使用方法: zoom : normal | number normal : 默认值。使用对象的实际尺寸 number : 百分数 | 无符号...

    详解CSS中zoom属性或overflow:auto属性清除浮动的作用

    除此之外,它还有其他一些作用,比如触发ie的hasLayout属性,清除浮动、清除margin的重叠等。 因为Zoom属性是IE浏览器的专有属性,所以他清除浮动作用只适用于IE浏览器,而Firefox、google等浏览器则需要使用...

    使用zoom解决IE6 margin无效BUG

    IE6 margin无效的bug, 解决方法有很多。 其中有个解决办法之一。 看代码: 复制代码代码如下: &lt;div xss=removed&gt;some contents&lt;/div&gt; 在一些情况下IE6会无效,解决办法是下面的方式。...触发IE浏览器的haslayout

    IE浏览器专有css属性之zoom详解

    Zoom属性是IE浏览器的专有属性,Firefox等浏览器不支持。它可以设置或检索对象的缩放比例。除此之外,它还有其他一些小作用,比如触发ie的hasLayout属性,清除浮动、清除margin的重叠等

Global site tag (gtag.js) - Google Analytics