IE浏览器bug罪魁祸首--hasLayout

IE浏览器一直都是前端程序员最头疼的,IE的表现与其他浏览器不同的原因之一就是,显示引擎使用一个称为布局(layout)的内部概念。

认识hasLayout--haslayout是Windows Internet Explorer渲染引擎的一个内部组成部分。在Internet Explorer中,使用布局概念来控制元素的尺寸和定位。在理想情况下,所有元素都控制自己的尺寸和定位。但是,这在IE中会导致很大的性能问题。因此,IE开发团队决定只将布局应用于实际需要它的那些元素,这样就可以充分地减少性能开销。

拥有布局(have layout)的元素负责本身及其子元素的尺寸和定位。如果一个元素没有布局,那么它的尺寸和位置由最近的拥有布局的祖先元素控制。IE显示引擎利用布局概念减少它的处理开销。一个元素要么自己对自身的内容进行计算大小和组织,要么依赖于父元素来计算尺寸和组织内容。

当一个元素的 hasLayout属性值为true时,我们说这个元素有一个布局(layout),当一个元素有一个布局时,它负责对自己和可能的子孙元素进行尺寸计算和定位。

默认拥有hasLayout属性

<html>, <body>

<table>, <tr>, <th>, <td>

<img>

<hr>

<input>, <button>, <select>, <textarea>, <fieldset>, <legend>

<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

( 对 IE6 及更早版本来说很常用,该方法被称为霍莉破解(Holly hack),即设定这个元素的高度为 1% (height:1%;)。但是要注意,当这个元素的 overflow 属性被设置为 visible 时,这个方法就失效了。)

---------------------------------------

position

启动hasLayout的值:absolute

取消hasLayout的值:static

----------------------------------------

float

启动hasLayout的值:left或right

取消hasLayout的值:none

---------------------------------------

zoom

启动hasLayout的值:有值

取消hasLayout的值:narmal或者空值

(zoom是微软IE专有属性,可以触发hasLayout但不会影响页面的显示效果。zoom: 1常用来除错,不过 ie 5 对这个属性不支持。)

ie7还有一些额外的属性可以触发该属性(不完全列表):

min-height: (任何值)

max-height: (任何值除了none)

min-width: (任何值)

max-width: (任何值除了none)

overflow: (任何值除了visible)

overflow-x: (任何值除了visible)

overflow-y: (任何值除了visible)

position: fixed

* 元素hasLayout而导致的问题其实一般都很容易发现:往往是内容出现错位甚至完全不可见。

时间: 2024-10-06 20:11:51

IE浏览器bug罪魁祸首--hasLayout的相关文章

浏览器bug和修复

与许多编程语言相比,CSS是一种相当容易学习的语言,它的语法简单明了,而且由于它的表现本质,开发人员并不需要处理复杂的逻辑.但是在不同的浏览器上测试代码才是真正困难的开始,你的设计在一种浏览器上表现的良好,但是在另外一个浏览器上就会变得“支离破碎”. “CSS难以掌握”的误解并非来自于语言本身,而是由于为了让站点在所有主流浏览器上工作正常需要采取很多的措施.关于bug的信息很难找到,缺乏文档记录,因此bug常常被误解.许多人把招数看做魔法子弹,认为它们就像神秘的咒语一样,当应用在代码中时,就会神

关于margin的浏览器BUG

常见的浏览器下margin出现的bug 林林总总写了那么多,最后总结一些浏览器中常见的margin Bug吧,以后遇到margin下的布局问题可以查看这里找到解决的方案,如果你还发现其他关于浏览器下margin的Bug你可以发表留言,核对采纳后我会及时添加进去,感谢你的分享: IE6中双边距Bug: 发生场合:当给父元素内第一个浮动元素设置margin-left(元素float:left)或margin-right(元素float:right)时margin加倍. 解决方法:是给浮动元素加上di

浏览器bug和修复2

拥有布局 Window IE上的bug要比其他浏览器多,原因之一是,IE的显示引擎使用一个称为布局(layout)的内部概念.因为布局是专门针对显示引擎内部工作方式的概念,所以一般情况下不需要了解它,但是,布局问题是许多IE/Win显示bug的根源,所以理解这个概念以及它如何影响CSS是有帮助的. 什么是布局 Windows上的IE使用布局概念来控制元素的尺寸和定位.那些称为拥有布局(have layout)的元素负责本身及其子元素的尺寸和定位.如果一个元素没有拥有布局,那么它的尺寸和位置由最近

常见浏览器bug(针对IE6及更低版本)及其修复方法

常见bug及其修复方法有以下几种 1.双外边距浮动bug 双外边距浮动bug在IE6及更低版本中常见.所谓双外边距浮动bug是指使任何浮动元素上的外边距加倍.(见下图) 只要将元素的display属性设置成inline就行了.因为元素时浮动的,所以将display属性设置为inline实际上不会影响显示方式.但是,这似乎会阻止Windows上的IE6及更低版本将所有外边距加倍.所以每当对具有水平外边距的元素浮动时,都应该很自然的将display属性设置为inline,以备外边距将来被加大. 2.

360急速浏览器BUG,POST表单提交参数丢失

p{text-indent:2em;} --> 今天我在做支付宝充值的时候发现在360急速浏览器下面业务处理页面获取Request.Form参数为空,一开始我还以为是自己参数没有传递过去.然后就开始了1小时的deBUG 下面是页面流程 A→B→C A:用户信息填写页面,位于游戏大厅中 B:业务处理页面,用于判断和生成订单 C:支付宝支付页面 其他浏览器全部都没有问题,就是在360极速浏览器参数丢失了 由于是在B页面获取参数为空,于是我就开始在B页面各种尝试获取参数的方法,结果就是无用功,任何方式

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

什么是hasLayout?hasLayout是IE特有的一个属性.很多的ie下的css bug都与其息息相关.在ie中,一个元素要么自己对自身的内容进行计算大小和组织,要么依赖于父元素来计算尺寸和组织内容.当一个元素的hasLayout属性值为true时,它负责对自己和可能的子孙元素进行尺寸计算和定位.虽然这意味着这个元素需要花更多的代价来维护自身和里面的内容,而不是依赖于祖先元素来完成这些工作. 下列元素默认 hasLayout=true <table> <td> <bod

认识hasLayout——IE6.7浏览器css bug的一大罪恶根源

hasLayout是什么? hasLayout是IE6.7下特有的一个属性(IE8已淘汰)很多的ie下的css bug都与其息息相关.在ie中,一个元素要么自己对自身的内容进行计算大小和组织,要么依赖于父元素来计算尺寸和组织内容.当一个元素的hasLayout属性值为true时,它负责对自己和可能的子孙元素进行尺寸计算和定位.虽然这意味着这个元素需要花更多的代价来维护自身和里面的内容,而不是依赖于祖先元素来完成这些工作. 一个元素拥有layout”或“得到layout什么意思? 我们的意思是指它

那些年,我们被耍过的bug——haslayout

你被IE的bug耍过几次了? IE,这个令所有网站设计人员讨厌,但又不得不为它工作的浏览器.不论是6.7还是8,它们都有一个共同的渲染标准haslayout,所以haslayout 是一个非常有必要彻底弄清除的概念.大多 数IE下的显示错误,就是源于它. 什么是Layout呢? "Layout" 是IE特有的一个属性,并不是W3C标准,很多的ie下的css bug都与其息息相关.它决定了一个对象(就是一个标签div.li等)在内容中如何显示.与周围对象的位置关系.以及怎样响应程序或用户

[译] 如何调试CSS的跨浏览器样式bug

http://www.cnblogs.com/newyorker/archive/2013/01/22/2870682.html 原文 http://www.stubbornella.org/content/2012/05/02/cross-browser-debugging-css/ 作者为YAHOO前端工程师. 首先要做的是挑选一个好的浏览器.我的选择是Chrome,因为它拥有强大的调试工具.当我在Chrome上完成调试后,我会接着在Safari或者Firefox上调试. 如果在这些“好的”