深入分析IE浏览器hasLayout

1. 简介

原文出自:IE hasLayout

我平时写CSS相对较少,但是一些CSS的陷阱还是有所听说。今天在查阅一些CSS资料的时候,无意间遇到了这个haslayout的问题,于是就顺手整理了下。

注意:hasLayout这个属性,在IE8标准模式以及IE8以上版本的IE浏览器中,已经不生效。但在IE7兼容模式下,这个hasLayout属性依然发挥作用。

2. 为什么会有hasLayout?

旧版的IE浏览器中,比如IE5,IE6等,使用一个相当古老的HTML排版引擎(原文指出这个排版引擎是Mosaic,我上维基百科看了下,我想应该是真的。如果HTML的历史稍微有一些印象的话,应该会知道,在HTML成为标准之前,Mosaic是非常牛叉的一款浏览器)。

旧时代的WEB基本都是使用table进行布局的,这个时候一般是不会有内容overflow的问题产生。之后,微软在其IE浏览器中使用的Trident排版引擎引入了对CSS的支持。但是CSS改变了游戏规则,因为CSS允许HTML元素的内容超过元素的宽高,这种情况有可能发生在了float或者元素内容超出容器定义的宽高,也就是overflow。

3. hasLayout从何而来?

微软的工程师使用了一种比较奇葩的方式解决上面提到的问题——hasLayout属性诞生了。所有的HTML元素都有一个hasLayout属性,并且可以设置成true或者false。

如果hasLayout属性为true,那么这个元素就要花更多代价去渲染自己,它必须负责为自己和可能的子孙元素进行尺寸计算和定位。

如果hasLayout属性为false,那么这个元素就要依靠某个祖先元素来渲染它。

NOTE: 虽然是这么说的,但是有机会我还是应该去找几个DEMO看看,不然还是对这个问题不是很清楚。
hasLayout不是标准的CSS属性,这是微软的一个拓展属性,并且是只读属性——你无法通过CSS样式表,例如hasLayout: true;,或者是Javascript,el.currentStyle.hasLayout = true;去设置。一个元素是否hasLayout,关键就是hasLayout属性值是否是true。

4. 默认情况下,哪些HTML元素有hasLayout属性?

<html>, <body>
<table>, <tr>, <th>, <td>
<iframe>, <embed> (non-standard element), <object>, <applet>
<img>
<hr>
<input>, <button>, <select>, <textarea>, <fieldset>, <legend>
<marquee> (最好别用这个元素,非标准元素)
这些元素可能不够全面,可能还有一些其他元素没有在上面的列表中,那么,如何去测试元素的hasLayout属性值?

假设我们有这么一个div#menu元素:

<div id="menu">  ...  </div>
我们可以通过以下代码去获取hasLayout属性的值:

var $menu = document.getElementById( 'menu' );  console.log( $menu.currentStyle.hasLayout );

5. 通过CSS属性设置hasLayout的值

要让元素的hasLayout属性值为true,相对设置成false而言,是件容易的事情。以下的CSS属性/值,可以设置元素的hasLayout属性值为true:

position: absolute
float: left | right
display: inline-block
width: 非auto的任意值
height: 非auto的任意值
zoom: 非normal的任意值
writing-mode: tb-rl

在IE7,还有以下这些CSS属性/值生效:

overflow: hidden | scroll | auto
overflow-x: hidden | scroll | auto
overflow-y: hidden | scroll | auto
min-width: 非auto的任意值
max-width: 非auto的任意值
min-height: 非auto的任意值
max-height: 非auto的任意值

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%;
E6 的躲躲猫(peek-a-boo) bug

bug 修复: _height:1%;

时间: 2024-08-28 08:20:19

深入分析IE浏览器hasLayout的相关文章

Web标准:文档类型和网页浏览器

原文: http://www.alistapart.com/articles/beyonddoctype 作者:Aaron Gustafson .Com  译者:zhaozy in 3user.com .Com 转载请注明作者和译者信息,谢谢! 进步总是要有代价的. 对网页浏览器来说, 由于开发者像是宣传真理一样的拍着胸部担保着一些编辑器和浏览器(特别是Internet Explorer), 用户们为此花费很多的成本. 而当这个浏览器推出了一个新版本, 然后又修正了之前版本的一些错误和对规范的误

CSS教程:彻底了解haslayout

要想更好的理解 css, 尤其是 IE 下对 css 的渲染,haslayout 是一个非常有必要彻底弄清除的概念.大多IE下的显示错误,就是源于 haslayout. 什么是 haslayout ? haslayout 是Windows Internet Explorer渲染引擎的一个内部组成部分.在InternetExplorer中,一个元素要么自己对自身的内容进行计算大小和组织,要么依赖于父元素来计算尺寸和组织内容.为了调节这两个不同的概念,渲染引擎采用了 hasLayout 的属性,属性

Firefox浏览器兼容性检测工具:Compatibility Detector

文章描述:Firefox下的浏览器兼容性检测工具--Compatibility Detector. 这里给大家推荐一个Firefox下的浏览器兼容性检测工具--Compatibility Detector.这个工具对于新手来说是非常不错的一个东东,下面我就简单说下它的优点. 作为一个前端开发者来说,最痛苦的事情之一就是要兼容现在各种五花八门的浏览器,而在实际的调试中这个调试过程又是让人劳心劳力.而Compatibility Detector能把目前很多已知的兼容性问题很easy的展现在我们面前.

IE浏览器下PNG相关功能

  本文给大家汇总了一下png在IE浏览器下出现的各种问题的解决方法,十分的实用,有需要的小伙伴可以参考下. 目前互联网对于网页效果要求越来越高,不可避免的用到PNG图片,PNG分为几种格 式,PNG8 PNG24 PNG32,其中最常用的,也是显示效果和大小比较适中的则是PNG24,支持半透明,透明,颜色也非常丰富,但由于咱们国人使用IE系列或以IE为内核系列的浏览器占大多数,并且由于 WINDOWS XP在国内市场份额比较大,并且XP上好多人还在用IE6 IE7 IE8等浏览器,而这些浏览器

CSS教程了解haslayout

要想更好的理解 css, 尤其是 IE 下对 css 的渲染,haslayout 是一个非常有必要彻底弄清除的概念.大多IE下的显示错误,就是源于 haslayout. 什么是 haslayout ? haslayout 是Windows Internet Explorer渲染引擎的一个内部组成部分.在InternetExplorer中,一个元素要么自己对自身的内容进行计算大小和组织,要么依赖于父元素来计算尺寸和组织内容.为了调节这两个不同的概念,渲染引擎采用了 hasLayout 的属性,属性

深入分析JSON编码格式提交表单数据

  这篇文章主要介绍了深入分析JSON编码格式提交表单数据的相关资料,需要的朋友可以参考下 以JSON编码格式提交表单数据是HTML5对WEB发展进化的又一大贡献,以前我们的HTML表单数据是通过key-value方式传输的服务器端,这种形式的传输对数据组织缺乏管理,形式十分原始.而新出现的JSON格式提交表单数据方法,将表单里的所有数据转化的具有一定规范的JSON格式,然后传输的服务器端.服务器端接收到的数据是直接可以使用的合格JSON代码. 如何声明以JSON格式提交表单 大家应该对如何用表

javascript框架设计之浏览器的嗅探和特征侦测

浏览器的嗅探现在已经不推荐了,但在某些场合还是需要的.比如一些统计脚本.在标准浏览器里,提供了document.implementation.hasfeature,可惜有bug,不准确,目前,w3c又推出了CSS.supports方法,显示出大家对这块的关注. 1.判定浏览器. 主流的浏览器有ie firefox opera chorme safari 早期这些框架都是通过navigator.userAgent进行判定,目前国外的浏览器几乎都是可以判定的. 关于浏览器的判断脚本,jQuery已经

IE浏览器性能分析工具

  DynaTrace AJAX是一个运行在IE浏览器下的免费页面性能分析工具,它可以支持主流的IE6.IE7.IE8浏览器.这款工具正是DynaTrace为进入前端性能分析领域而发布的.您可以利用它来分析页面渲染时间.DOM方法执行时间,甚至可以看到JS代码的解析时间.连JQuery的创始者 John Resig 也鼎力推荐了一把. John Resig对其评价到:"我一般不随便写关于性能分析工具的东西,坦率地说,我感觉它们绝大部分都比较烂,根本不能提供任何有价值的信息和分析结果.不过 dyn

ie浏览器自动关闭怎么办

  故障分析: 检查发现,网络连接正常,每次打开IE窗口,几秒或者十几秒即被关闭,后来干脆没有任何错误提示了.打开文件夹窗口,随意操作,也被不定时关闭,似乎是 WINDOWS核心程序出了问题,或者是恶意脚本(程序)作怪.重新开机,进入安全模式,没有此怪现象,排除了系统文件被破坏的可能.难道中了木马或者恶意代码?检查发现已经关闭了IE下载功能,用对付木马和恶意网站的方法扫荡一翻,没有发现异常,使用论坛网友介绍的一招'清除COOKIES'也没好转. 深入分析: 换不同的帐号登录系统,故障依然,监视系