要想更好的理解 css, 尤其是 IE 下对 css 的渲染,haslayout 是一个非常有必要彻底弄清楚的概念。大多 IE
下的显示错误,就是源于 haslayout

什么是 haslayout ?

  haslayout 是Windows Internet Explorer渲染引擎的一个内部组成部分。在Internet Explorer中,一个元素要么自己对自身的内容进行计算大小和组织,要么依赖于父元素来计算尺寸和组织内容。为了调节这两个不同的概念,渲染引擎采用了 hasLayout 的属性,属性值可以为true或false。当一个元素的 hasLayout 属性值为true时,我们说这个元素有一个布局(layout)

  当一个元素有一个布局时,它负责对自己和可能的子孙元素进行尺寸计算和定位。简单来说,这意味着这个元素需要花更多的代价来维护自身和里面的内容,而不是依赖于祖先元素来完成这些工作。因此,一些元素默认会有一个布局。当我们说一个元素“拥有layout”或“得到layout”,或者说一个元素“has layout” 的时候,我们的意思是指它的微软专有属性 hasLayout 被设为了 true 。一个“layout元素”可以是一个默认就拥有 layout 的元素或者是一个通过设置某些 CSS 属性得到 layout 的元素。通过 IE Developer Toolbar 可以查看 IE 下 HTML 元素是否拥有haslayout,在 IE Developer Toolbar 下,拥有 haslayout 的元素,通常显示为“haslayout = -1”。

特别注意的是,hasLayout 在 IE 8 及之后的 IE 版本中已经被抛弃,所以在实际开发中只需针对 IE 8 以下的浏览器为某些元素触发 hasLayout 。

(因为没有注意带IE8后已经抛弃了,本人测试前期一直没有出现想要的结果)

一个元素触发 hasLayout 会影响一个元素的尺寸和定位,这样会消耗更多的系统资源,因此 IE 设计者默认只为一部分的元素触发 hasLayout (即默认有部分元素会触发 hasLayout ,这与 BFC 基本完全由开发者通过特定 CSS 触发并不一样),这部分元素如下:

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

如何激发 haslayout?

大部分的 IE 显示错误,都可以通过激发元素的 haslayout 属性来修正。可以通过设置 css 尺寸属性(width/height)等来激发元素的 haslayout,使其“拥有布局”。如下所示,通过设置以下 css 属性即可。

* display: inline-block
* height: (任何值除了auto)
* float: (left 或 right)
* position: absolute
* width: (任何值除了auto)
* writing-mode: tb-rl
* zoom: (除 normal 外任意值)

Internet Explorer 7 还有一些额外的属性(不完全列表):

* min-height: (任意值)
* max-height: (除 none 外任意值)
* min-width: (任意值)
* max-width: (除 none 外任意值)
* overflow: (除 visible 外任意值)
* overflow-x: (除 visible 外任意值)
* overflow-y: (除 visible 外任意值)
* position: fixed

其中 overflow-x 和 overflow-y 是 css3 盒模型中的属性,目前还未被浏览器广泛支持。

对于内联元素(默认即为内联的元素,如 span,或 display:inline; 的元素),

  • width 和 height 只在 IE5.x 下和 IE6 或更新版本的 quirks 模式下触发 hasLayout 。而对于 IE6,如果浏览器运行于标准兼容模式下,内联元素会忽略 width 或 height 属性,所以设置 width 或 height 不能在此种情况下令该元素具有 layout。
  • zoom 总是可以触发 hasLayout,但是在 IE5.0 中不支持。建议使用 zoom: 1 来触发元素的 hasLayout

具有“layout” 的元素如果同时 display: inline ,那么它的行为就和标准中所说的 inline-block 很类似了:在段落中和普通文字一样在水平方向和连续排列,受 vertical-align 影响,并且大小可以根据内容自适应调整。这也可以解释为什么单单在 IE/Win 中内联元素可以包含块级元素而少出问题,因为在别的浏览器中 display: inline 就是内联,不像 IE/Win 一旦内联元素拥有 layout 还会变成 inline-block。

haslayout 问题的调试与解决

当网页在 IE 中有异常表现时,可以尝试激发 haslayout 来看看是不是问题所在。常用的方法是给某元素 css 设定 zoom:1 。使用 zoom:1 是因为大多数情况下,它能在不影响现有环境的条件下激发元素的 haslayout。而一旦问题消失,那基本上就可以判断是 haslayout 的原因。然后就可以通过设定相应的 css 属性来对这个问题进行修正了。建议首先要考虑的是设定元素的 width/height 属性,其次再考虑其他属性。

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

对 IE7 来说,最好的方法时设置元素的最小高度为 0 (min-height:0;)。

haslayout 问题引起的常见 bug

IE6 及更低版本的双空白边浮动 bug

bug 修复: display:inline;

IE5-6/win 的 3 像素偏移 bug

bug 修复: _height:1%;

IE6 的躲躲猫(peek-a-boo) bug

bug 修复: _height:1%;

hasLayout 与很多 IE 下的显示 bugs 都有关,实际上很多莫名奇妙的 bugs 都因 hasLayout 而起,因此只要适当的触发元素的 hasLayout ,很多 IE bugs 往往就能解决。

原文地址:http://blog.sina.com.cn/s/blog_6c2f334c01018rc4.html

转载于:https://www.cnblogs.com/waisonlong/p/5569499.html

IE haslayout的理解与bug修复相关推荐

  1. 被尘封的故事技能点bug_新月纪元稳定版下载-新月纪元bug修复版1.0 修复版

    新月纪元是一款二次元像素风格动作射击roguelike类游戏.玩家将成为主角开启自己的冒险之旅.多种游戏模式,海量的游戏关卡等你来战,还有强大的副本boss可以挑战,给你绝佳的游戏乐趣! 新月纪元bu ...

  2. background 渐变_今日重点:April安卓渐变黑。| 明日日程:BUG修复。

    [April/ 渐变黑]安卓版已适配完成,1比1还原iOS版,并在iOS版的基础上新增了更多快捷功能,请及时更新. 左下角123上滑,打开帮助页.  ● <April>安卓版 | 渐变黑. ...

  3. ninjala还是显示服务器维护,Ninjala更新2.0版本 调整了武器平衡以及BUG修复

    <Ninjala>更新2.0版本,泡泡糖忍战今日更新了最新的版本2.0,分别调整了大部分游戏的平衡性以及武器平衡,还修复了BUG错误 机制调整: -整合全球服务器,匹配已不受服务器限制 - ...

  4. hasLayout引发的CSS Bug表 及处理办法【zoom:1】

    文章一 : 解决IE兼容问题是比较头疼的问题,无论你是新入门的菜鸟还是久经考验的职业行家,兼容问题,特别是IE,IE6会让你非常头疼.很多时候,div CSS在IE下的解析十分奇怪,一个比较经典的bu ...

  5. 7月10日王者荣耀服务器维护,王者荣耀7月10日更新:部分已知BUG修复

    王者荣耀于2020年7月10日6:10-7:10对全服进行不停机更新,本次更新大小安卓约121MB,iOS约22MB,建议您在wifi环境下进行更新操作,本次更新内容如下: BUG修复与优化 1.调整 ...

  6. TensorFlow 1.8.0正式发布,Bug修复和改进内容都在这里了

    译者 | 王柯凝 编辑 | Just 出品 | AI科技大本营(公众号ID:rgznai100) [导语]TensorFlow 1.8.0 近日正式发布,新版本主要有以下改进内容,AI科技大本营对其编 ...

  7. TensorFlow1.8.0正式发布,Bug修复和改进内容都在这里了

    译者 | 王柯凝 编辑 | Just 出品 | AI科技大本营(公众号ID:rgznai100) [导语]TensorFlow 1.8.0 近日正式发布,新版本主要有以下改进内容,AI科技大本营对其编 ...

  8. TensorFlow 1.7.0正式发布,Bug修复和改进内容都在这里了

    编译 | AI科技大本营(公众号ID:rgznai100) 参与 | 张建军 TensorFlow 1.7.0 近日正式发布,新版本主要有以下改进内容,AI科技大本营对其进行了编译. 主要特征和改进 ...

  9. 一分钟详解initUndistortRectifyMap函数bug修复方法

    本文首发于微信公众号「3D视觉工坊」--一分钟详解initUndistortRectifyMap函数bug修复方法 在上一篇文章OpenCV中initUndistortRectifyMap函数存在bu ...

最新文章

  1. 【TAMU】最新《时间序列分析》课程笔记
  2. CoolHash数据库引擎压测对比报告
  3. 用户测评 | EDAS Serverless 上手体验
  4. JAVA操作HDFS API(hadoop)
  5. python三大特征六大原则_面向对象程序设计(Object Oriented Programming)的三大特性,六大原则...
  6. C++ 学习之旅(3)——头文件Header
  7. Adobe和苹果相互推诿 不支持Flash谁之过?
  8. 阿里99大促 | 模型识别背后的样本生成
  9. 空中交警:借你一双“慧眼”,让你看透这飞机的“黑色十分钟”
  10. http协议,postget请求
  11. Unity 贴图Meta文件的探究
  12. VUCA时代下,创业团队如何提升整体效率?
  13. infoq_InfoQ与Azul Systems Gil Tene谈论Zing,Zulu和新版本
  14. canvas教程7-炫彩小球
  15. rtmp 发送h264包,主要是sps,pps,i帧和非i帧
  16. gt 630 linux驱动下载,Ubuntu 13.04 双显卡安装NVIDIA GT 630M驱动
  17. java资产管理系统开源_Java固定资产管理系统源代码
  18. 袁萌浅谈C919大飞机(二)
  19. windows10在哪修改内网网段或者固定IP
  20. 《奇点来临》——Linked-In上“奇点临近”论坛的观点

热门文章

  1. jq塞入不同状态html的写法 switch (defaults.type)
  2. 理解Node.js(译文)
  3. 常用的android弹出对话框
  4. 检查PHP文件头BOM
  5. JS的for循环小例子
  6. iPhone开发过程中调试多次Release问题 message sent to deallocated
  7. Myeclipse2013下载,安装,破解,介绍(CSDN首发)
  8. SharePoint 2010 同步用户Services 一直Starting 终极解决方案
  9. linux indent格式化代码
  10. SQL_server_2000安装过程指导