蓝戒博客

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

IE下hasLayout知多少?

2015年4月3日 5136点热度 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 中对话未来。

最新 热点 随机
最新 热点 随机
前端开发 TanStack 化:从“框架思维”到“能力组合”的工程演进 Docker 进阶(七):容器化体系设计总结与生产落地经验复盘 Docker 进阶(六):生产环境中的 Docker 安全、监控与日志体系 Docker 进阶(五):Docker + CI/CD —— 从代码提交到自动部署 Docker 进阶(四):使用 Docker Swarm 与 Kubernetes 实现容器编排 Docker 进阶(三):深入理解镜像层(Layer)与缓存机制
Workbox:可直接用于生产环境的 Service Worker 利器快速构建项目文档网站:主流文档站点工具选型与对比DiceBear:30+ 风格、完全可定制的开源头像生成解决方案ES2015 → ES2025:JavaScript 十年演进全景回顾与核心 API 总结ECMAScript 2025(ES16)深度解析20 个现代 JavaScript API 深度盘点
浏览器消息通知库:iNotify.js css中常用中文字体的Unicode编码 微前端实现方案分享:主流框架对比分析 前端PWA技术实现,突破用户体验枷锁 markdown-exit:现代化的 Markdown 解析工具 HTML5中input的placeholder颜色设置及兼容性解决方案
最近评论
渔夫 发布于 3 个月前(11月05日) 学到了,感谢博主分享
沙拉小王子 发布于 8 年前(11月30日) 适合vue入门者学习,赞一个
沙拉小王子 发布于 8 年前(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