IE haslayout的理解与bug修复
要想更好的理解 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修复相关推荐
- 被尘封的故事技能点bug_新月纪元稳定版下载-新月纪元bug修复版1.0 修复版
新月纪元是一款二次元像素风格动作射击roguelike类游戏.玩家将成为主角开启自己的冒险之旅.多种游戏模式,海量的游戏关卡等你来战,还有强大的副本boss可以挑战,给你绝佳的游戏乐趣! 新月纪元bu ...
- background 渐变_今日重点:April安卓渐变黑。| 明日日程:BUG修复。
[April/ 渐变黑]安卓版已适配完成,1比1还原iOS版,并在iOS版的基础上新增了更多快捷功能,请及时更新. 左下角123上滑,打开帮助页. ● <April>安卓版 | 渐变黑. ...
- ninjala还是显示服务器维护,Ninjala更新2.0版本 调整了武器平衡以及BUG修复
<Ninjala>更新2.0版本,泡泡糖忍战今日更新了最新的版本2.0,分别调整了大部分游戏的平衡性以及武器平衡,还修复了BUG错误 机制调整: -整合全球服务器,匹配已不受服务器限制 - ...
- hasLayout引发的CSS Bug表 及处理办法【zoom:1】
文章一 : 解决IE兼容问题是比较头疼的问题,无论你是新入门的菜鸟还是久经考验的职业行家,兼容问题,特别是IE,IE6会让你非常头疼.很多时候,div CSS在IE下的解析十分奇怪,一个比较经典的bu ...
- 7月10日王者荣耀服务器维护,王者荣耀7月10日更新:部分已知BUG修复
王者荣耀于2020年7月10日6:10-7:10对全服进行不停机更新,本次更新大小安卓约121MB,iOS约22MB,建议您在wifi环境下进行更新操作,本次更新内容如下: BUG修复与优化 1.调整 ...
- TensorFlow 1.8.0正式发布,Bug修复和改进内容都在这里了
译者 | 王柯凝 编辑 | Just 出品 | AI科技大本营(公众号ID:rgznai100) [导语]TensorFlow 1.8.0 近日正式发布,新版本主要有以下改进内容,AI科技大本营对其编 ...
- TensorFlow1.8.0正式发布,Bug修复和改进内容都在这里了
译者 | 王柯凝 编辑 | Just 出品 | AI科技大本营(公众号ID:rgznai100) [导语]TensorFlow 1.8.0 近日正式发布,新版本主要有以下改进内容,AI科技大本营对其编 ...
- TensorFlow 1.7.0正式发布,Bug修复和改进内容都在这里了
编译 | AI科技大本营(公众号ID:rgznai100) 参与 | 张建军 TensorFlow 1.7.0 近日正式发布,新版本主要有以下改进内容,AI科技大本营对其进行了编译. 主要特征和改进 ...
- 一分钟详解initUndistortRectifyMap函数bug修复方法
本文首发于微信公众号「3D视觉工坊」--一分钟详解initUndistortRectifyMap函数bug修复方法 在上一篇文章OpenCV中initUndistortRectifyMap函数存在bu ...
最新文章
- 【TAMU】最新《时间序列分析》课程笔记
- CoolHash数据库引擎压测对比报告
- 用户测评 | EDAS Serverless 上手体验
- JAVA操作HDFS API(hadoop)
- python三大特征六大原则_面向对象程序设计(Object Oriented Programming)的三大特性,六大原则...
- C++ 学习之旅(3)——头文件Header
- Adobe和苹果相互推诿 不支持Flash谁之过?
- 阿里99大促 | 模型识别背后的样本生成
- 空中交警:借你一双“慧眼”,让你看透这飞机的“黑色十分钟”
- http协议,postget请求
- Unity 贴图Meta文件的探究
- VUCA时代下,创业团队如何提升整体效率?
- infoq_InfoQ与Azul Systems Gil Tene谈论Zing,Zulu和新版本
- canvas教程7-炫彩小球
- rtmp 发送h264包,主要是sps,pps,i帧和非i帧
- gt 630 linux驱动下载,Ubuntu 13.04 双显卡安装NVIDIA GT 630M驱动
- java资产管理系统开源_Java固定资产管理系统源代码
- 袁萌浅谈C919大飞机(二)
- windows10在哪修改内网网段或者固定IP
- 《奇点来临》——Linked-In上“奇点临近”论坛的观点
热门文章
- jq塞入不同状态html的写法 switch (defaults.type)
- 理解Node.js(译文)
- 常用的android弹出对话框
- 检查PHP文件头BOM
- JS的for循环小例子
- iPhone开发过程中调试多次Release问题 message sent to deallocated
- Myeclipse2013下载,安装,破解,介绍(CSDN首发)
- SharePoint 2010 同步用户Services 一直Starting 终极解决方案
- linux indent格式化代码
- SQL_server_2000安装过程指导