不同于标准属性,也不像某些浏览器的私有 CSS 属性,layout 无法通过某一个 CSS 声明直接设定 。也就是说没有“layout属性”这么一个东西,元素要么本身自动拥有 layout,要么借助一些 CSS 声明悄悄地获得 layout。
下列元素应该是默认具有 layout 的:
<html>, <body> <table>, <tr>, <th>, <td> <img> <hr> <input>, <button>, <select>, <textarea>, <fieldset>, <legend> <iframe>, <embed>, <object>, <applet> <marquee> 下列 CSS 属性和取值将会让一个元素获得 layout:
position: absolute
float: left|right
display: inline-block
width: 除 “auto” 外的任意值
height: 除 “auto” 外的任意值
zoom: 除 “normal” 外的任意值 (MSDN)
zoom: 1 可以临时用做调试。
writing-mode: tb-rl (MSDN)
在 IE7 中,overflow 也变成了一个 layout 触发器:
overflow: hidden|scroll|auto
overflow-x|-y: hidden|scroll|auto
另外 IE7 的荧幕上又新添了几个 haslayout 的演员,如果只从 hasLayout 这个方面考虑,min/max 和 width/height 的表现类似,position 的 fixed 和 absolute 也是一模一样。
position: fixed
min-width: 任意值
max-width: 除 “none” 之外的任意值
min-height: 任意值
max-height: 除 “none” 之外的任意值
以上结论借助 IE Developer Toobar 以及预先测试得出。
对于内联元素(可以是默认即为内联的比如 span 元素,也可以是 display: inline 的元素)
width 和 height 只在 IE5.x 下和 IE6 或更新版本的 quirks 模式下触发 hasLayout 。而对于 IE6,如果浏览器运行于标准兼容模式下,内联元素会忽略 width 或 height 属性,所以设置 width 或 height 不能在此种情况下令该元素具有 layout。 zoom 总是可以触发 hasLayout,但是在 IE5.0 中不支持。 具有“layout” 的元素如果同时也 display: inline ,那么它的行为就和标准中所说的 inline-block 很类似了:在段落中和普通文字一样在水平方向和连续排列,受 vertical-align 影响,并且大小可以根据内容自适应调整。这也可以解释为什么单单在 IE/Win 中内联元素可以包含块级元素而少出问题,因为在别的浏览器中 display: inline 就是内联,不像 IE/Win 一旦内联元素拥有 layout 还会变成 inline-block。
在另一条规则中重设以下属性为默认值将重置(或撤销)hasLayout,如果没有其他属性再添加 hasLayout 的话:
width, height (设为 “auto”) max-width, max-height (设为 “none”)(在 IE 7 中) position (设为 “static”) float (设为 “none”) overflow (设为 “visible”) (在 IE 7 中) zoom (设为 “normal”) writing-mode (从 “tb-rl” 设为 “lr-t) 大家在重置这些属性时要小心。 考虑一下某个菜单系统:在 a:hover 时改变了 hasLayout 的状态,不管是否是故意的,都可能导致渲染出现意外的状况(或者导致 IE 6 程序不稳定,比如在和 position: relative 同时使用时动态取消 hasLayout)。
display 属性的不同:当用“inline-block”设置了 haslayout = true 时,就算在一条独立的规则中覆盖这个属性为“block”或“inline”,haslayout 这个标志位也不会被重置为 false。相比于 zoom 属性——同样也是一种设置 hasLayout 的比较“单纯的”方式——而言,inline-block/block 组合的方式就要看起来像复杂的 hack,而且通常也没有什么优越性。
把 mid-width, mid-height 设为它们的默认值“0”仍然会赋予 hasLayout,但是 IE 7 却可以接受一个不合法的属性“auto”来重置 hasLayout。
我们这里称 hasLayout 为“脚本属性”是为了和我们熟知的 CSS 属性相区别。
没有办法直接设置或重置一个元素的脚本属性 haslayout。
hasLayout-property 可以用来检测一个元素是否拥有 layout:举个例子,如果它的 id 是“eid”,那么只要在 IE5.5+ 的地址栏里输入 javascript: alert(eid.currentStyle.hasLayout) 即可检测它的状态。
IE的 Developer Toolbar 可以实时检查一个元素的当前样式;如果 hasLayout 是 true ,那么它的值显示为 “-1”。 我们可以通过实时修改一个元素的属性将“zoom(css)”设置为“1”来触发 hasLayout 以便调试。
另外一个需要注意的是“layout”会影响脚本编程。如果一个元素没有“layout”,那么clientWidth/clientHeight 总是返回0。这会让一些脚本新手感到困惑,而且这和 Mozilla 浏览器的处理方式也不一样。不过我们可以利用这一点在 IE5.0 中检测“layout”:如果 clientWidth 是零那么这个元素就没有 layout。