蓝戒博客

  • 首页
  • 研发说
  • 架构论
  • 效能录
  • AI谈
  • 随笔集
智构苍穹
融合 AI、架构与工程实践,沉淀方法论,构建可持续的技术价值。
  1. 首页
  2. 研发说
  3. 正文

IE下hasLayout知多少?

2015年4月3日 5264点热度 0人点赞 0条评论
haslayout

haslayout

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

haslayout是怎么来的?

为了解决这个问题,微软的天才coder决定去修理他们的这个古老的引擎,因此haslayout这个属性就诞生了。每个元素都有haslayout这个属性去设置true或者false,如果它设置成了true,它就不得不去渲染它自己,因此元素不得不扩展去包含它的流出的内容。例如浮动或者很长很长的没有截断的单词,如果haslayout没有被设置成true,那么元素得依靠某个祖先元素来渲染它。这就是很多的ie bugs诞生的地方。

haslayout触发机制

特别注意的是,hasLayout在IE 8及之后的IE版本中已经被抛弃,所以在实际开发中只需针对IE 8以下的浏览器为某些元素触发hasLayout。一个元素触发hasLayout会影响一个元素的尺寸和定位,这样会消耗更多的系统资源,因此IE设计者默认只为一部分的元素触发hasLayout (即默认有部分元素会触发hasLayout),这部分元素如下:

[codesyntax lang="php"]

body and html
table, tr, th, td
img
hr
input, button, file, select, textarea, fieldset
marquee
frameset, frame, iframe
objects, applets, embed

[/codesyntax]

 

如何触发 hasLayout

除了IE默认会触发hasLayout的元素外,Web开发者还可以使用特定的CSS触发元素的hasLayout。通过为元素设置以下任一CSS,可以触发hasLayout(即把元素的hasLayout属性设置为true)。

[codesyntax lang="php"]

float:(left或right)
position:absolute
display:inline-block
width:(除auto外任何值)
height:(除auto外任何值)
zoom:(除normal外任意数值,包括设置为效果等同于normal的1也有效)

[/codesyntax]

另外,一些CSS在IE7下亦能触发hasLayout。

[codesyntax lang="php"]

min-width:(包含0在内的任意值)
max-width:(除none外任意值)
min-height:(包含0在内的任意值)
max-height:(除none外任意值)
overflow:除了visible以外的值(hidden,auto,scroll)
position:fixed

[/codesyntax]

很多IE6造成的诡异BUG都是hasLayout捣的鬼,很是可恶。如果IE有些很难解释的问题,第一件要做的事情就是让该元素在IE6/7下触发一次hasLayout,最常用的就是*zoom:1;的方式。怎样在IE6下触发hasLayout让块状元素实现display:inline-block的效果呢?请看下面示例代码:

div{display:inline-block;_display:inline;*zoom:1;}

总结:其实依据合理的语义化,恰当的文档流,正确的标准化所生产出来的页面,在各个公司出品的标准渲染的浏览器下,一般并不会存在太多兼容性的问题的。

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

标签: 网页兼容
最后更新:2025年9月13日

cywcd

我始终相信,技术不仅是解决问题的工具,更是推动思维进化和创造价值的方式。从研发到架构,追求极致效能;在随笔中沉淀思考,于 AI 中对话未来。

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

cywcd

我始终相信,技术不仅是解决问题的工具,更是推动思维进化和创造价值的方式。从研发到架构,追求极致效能;在随笔中沉淀思考,于 AI 中对话未来。

最新 热点 随机
最新 热点 随机
Gemma 4发布4天即遭"完全越狱",开源AI的安全与自由之争 一个文件让AI写代码不再"翻车":45K星的Karpathy指南火了 3秒克隆你的声音,30国语言自由切换!这款2B开源语音模型,正在重新定义AI配音 claude-mem:给 Claude Code 补上一块最关键的“长期记忆” 🔥 狂揽 51.5k Star!这款名为 GSD 的神器,专治 AI 写代码"越写幻觉越严重" Token 节省的神器 RTK:降 90%,适用 Claude Code、Codex、Cursor 等
Dan Koe:不想打工?用这套方法把兴趣变成收入开源AI 搜索代理 MiroThinker 1.7:当大家还在卷参数,它已经开始卷“查证能力”了停止无效努力:Dan Koe 深度长文,极致专注力,一套让你进入心流的终极方法论2026 AI 智能体革命:LangGraph 如何让你一个人活成一支队伍?AI 智能体爆发:从会生成到会行动,2026 年普通人如何抓住 AaaS 变现红利AI专用浏览器来了:比Chrome快10倍,Agent时代的基础设施正在重构
Javascript中Window对象的属性、方法、事件一览 Bun:下一代 JavaScript 一体化工具链全面解析 AngularJs的ng-route路由详解 99%的人都误解了“口才好”:真正的表达力,只靠这 3 个框架 别再把 Goose 当成“又一个 AI Agent”:它真正厉害的地方,很多人都没看懂 intro.js网站页面使用分步引导插件
最近评论
渔夫 发布于 5 个月前(11月05日) 学到了,感谢博主分享
沙拉小王子 发布于 9 年前(11月30日) 适合vue入门者学习,赞一个
沙拉小王子 发布于 9 年前(11月30日) 适合vue入门者学习,赞一个
cywcd 发布于 9 年前(04月27日) 请参考一下这篇文章http://www.jianshu.com/p/fa4460e75cd8
cywcd 发布于 9 年前(04月27日) 请参考一下这篇文章http://www.jianshu.com/p/fa4460e75cd8

COPYRIGHT © 2025 蓝戒博客_智构苍穹-专注于大前端领域技术生态. ALL RIGHTS RESERVED.

京ICP备12026697号-2