hasLayout IE浏览器bug的来源

HTML5学堂:IE6浏览器曾经“坑”了一代又一代的前端工程师,了解浏览器兼容问题的同时,抱着“理科思维”的我们,必然会去思考为何IE6会这么“坑”,所以,我们来说说IE6浏览器bug的根源-haslayout。

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而导致的问题其实一般都很容易发现:往往是内容出现错位甚至完全不可见。 如:当一个元素内含浮动或绝对定位的内容时,它通常会表现出奇怪和错误的行为

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

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不支持。)

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

min-height: (任何值)

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

min-width: (任何值)

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

overflow: (任何值除了visible)

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

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

原文发布于微信公众号 - HTML5学堂(h5course-com)

原文发表时间:2015-12-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏hightopo

基于 HTML5 的 WebGL 3D 版俄罗斯方块

1263
来自专栏武军超python专栏

2018年9月3日初识HTML超文本标记语言

javascript原名livescript,简称(js),因为当时公司和sun公司合作,为了营销考虑,让它看起来更像当时 特别火热的java,所以更名为ja...

721
来自专栏腾讯NEXT学位

药药切克闹!用酷炫的vue~制作酷炫的menu~

3685
来自专栏walterlv - 吕毅的博客

Windows 10 应用创建模糊背景窗口的三种方法

发布于 2018-07-16 11:44 更新于 2018-08...

673
来自专栏进步博客

CSS表格布局实践

如何实现上图所示效果:左右两列的列宽由列内最宽单元格的宽度决定,进度条列占据剩余空间。(兼容到IE8就好了)

1043
来自专栏LIN_ZONE

css 中 zoom和transform:scale的区别(转载)

还在几年前,zoom还只是IE浏览器自己私有的玩具,但是,现在,除了FireFox浏览器,其他,尤其Chrome和移动端浏览器已经很好支持zoom属性了:

613
来自专栏Java帮帮-微信公众号-技术文章全总结

Web-第一天 HTML【悟空教程】

一天的学习需要使用众多独立没有关联的标签,为了大家更好的吸收,现给出标签总览,以“重要程度”排序。例如:“表格标签”为今天最重要的标签。

1005
来自专栏用户2442861的专栏

CSS浮动 (比较详细、生动、经典)

首先要知道,div是块级元素,在页面中独占一行,自上而下排列,也就是传说中的流。如下图:

582
来自专栏小筱月

分享:纯 css 瀑布流 和 js 瀑布流

通过 Multi-columns 相关的属性 column-count、column-gap 配合 break-inside 来实现瀑布流布局。

1212
来自专栏逸鹏说道

JQ动态生成的元素,原事件绑定失效

1012

扫码关注云+社区