hasLayout 是IE特有的一个属性。很多的ie下的css bug都与其息息相关。在ie中,一个元素要么自己对自身的内容进行计算大小和组织,要么依赖于父元素来计算尺寸和组织内容。当一个元素的 hasLayout属性值为true时,它负责对自己和可能的子孙元素进行尺寸计算和定位。虽然这意味着这个元素需要花更多的代价来维护自身和里面的内 容,而不是依赖于祖先元素来完成这些工作。

下列元素默认 hasLayout=true :

<table> <td> <body> <img> <hr> <input> <select> <textarea> <button> <iframe> <embed> <object> <applet> <marquee>

很多情况下,我们把 hasLayout的状态改成true 就可以解决很大部分ie下显示的bug。
hasLayout属性不能直接设定,你只能通过设定一些特定的css属性来触发并改变 hasLayout 状态。下面列出可以触发hasLayout的一些CSS属性值。
-------------------------------------
display
启动haslayout的值:inline-block
取消hasLayout的值:其他值
--------------------------------------
width/height
启动hasLayout的值:除了auto以外的值
取消hasLayout的值:auto
---------------------------------------
position
启动hasLayout的值:absolute
取消hasLayout的值:static
----------------------------------------
float
启动hasLayout的值:left或right
取消hasLayout的值:none
---------------------------------------
zoom
启动hasLayout的值:有值
取消hasLayout的值:narmal或者空值
(zoom是微软IE专有属性,可以触发hasLayout但不会影响页面的显示效果。zoom: 1常用来除错,不过 ie 5 对这个属性不支持。)
----------------------------------------
writing-mode: tb-rl
这也是微软专有的属性。

ie7还有一些额外的属性可以触发该属性(不完全列表):

min-height: (任何值)max-height: (任何值除了none)min-width: (任何值)max-width: (任何值除了none)overflow: (任何值除了visible)overflow-x: (任何值除了visible)overflow-y: (任何值除了visible)5position: fixed

因元素hasLayout而导致的问题其实一般都很容易发现:往往是内容出现错位甚至完全不可见。举一个典型例子,当一个元素内含浮动或绝对定位的内容时,它通常会表现出奇怪和错误的行为,看下面的代码:

<div id="nofloatbox">
<div id="floatbox"></div>
</div>

CSS代码如下:

#nofloatbox {border: 1px solid #FF0000;background: #CCC;} #floatbox {float: left;width: 100px;height: 100px;border: 1px solid #0000FF; background: #00FF00;}

ie显示结果如下图:

可见无浮动的div并没有被里面的浮动元素的高度撑开,其高度并不会自动计算。我们下面再给这个无浮动的div加上个zoom:1;来触发其hasLayout属性试试,css代码如下:

#nofloatbox { border: 1px solid #FF0000;background: #CCC;zoom:1;} #floatbox {float: left; width: 100px;height: 100px;border: 1px solid #0000FF;background: #00FF00;}

保存刷新ie浏览器窗口,如下图:

可见这次外围容器的高度被撑起来了。 同样,设定上文所述的其他会触发hasLayout的css属性都会得到这个结果。通常firefox等标准的遵守浏览器可以加上overflow: hidden;来解决,而IE则不行,需要触发其hasLayout属性才可以。

hasLayout对于内联元素也可以有效果,当内联元素的hasLayout为true的时候,可以给这个内联元素设定高度和宽度并得到期望的效果。如下例:
代码:

<p>今天的<span style="width: 100px; height: 50px; background: #DDD;">天气</span>真好</p>

效果如下图所示:

下面给span加上zoom: 1;来触发hasLayout:

<p>今天的<span style="width: 100px; height: 50px; background: #DDD; zoom: 1;">天气</span>真好</p>

这回的效果如下图所示:

要注意的是,hasLayout是微软专有的东西,对firefox等比较遵守标准的浏览器就无效了,因此不可太过依赖。貌似现在的IE8就已经不用特意去触发hasLayout就可以得到和firefox一致的效果,不知ie8是否已经弃用这个属性了?

其实依据合理的语义化,恰当的文档流,正确的标准化所生产出来的页面,在各个公司出品的标准渲染的浏览器下,一般并不会存在太多兼容性的问题的。

一般如果是因为layout而引起的显示不符期望效果的话,在ff下会表现正常,而在ie下会出现错误。这个时候可以尝试触发父容器及其中的子容器 的 haslayout属性,通常可以通过加上zoom: 1;来调试。直到找到了产生问题的元素,再进行针对性的修正。最好的办法是对这个元素设置尺寸属性。但是,有时不便指定尺寸属性的情况下,就只能寻找替代 方案了。对于ie7 ,最好的办法是设置最小高度属性为0;这个技术是无害的,因为0本来就是这个属性的初始值。而且没有必要对其他浏览器隐藏这个属性。而对于ie6和更早版 本中触发一个元素hasLayout的方法是在overflow属性是visible的情况下设置这个元素的高度属性为1%,然后对其他浏览器隐藏这个设 置。这种技术就是著名的Holly hack。

转载于:https://www.cnblogs.com/rhinemetal/archive/2012/06/28/2568442.html

什么是hasLayout相关推荐

  1. 理解haslayout

    定义: haslayout是IE7-浏览器的特有属性.hasLayout是一种只读属性,有两种状态:true或false. 当其为true时,代表该元素有自己的布局,否则代表该元素的布局继承于父元素. ...

  2. 关于Block Formatting Context--BFC和IE的hasLayout

    转文请标明 --- 出处:穆乙 http://www.cnblogs.com/pigtail/ 一.BFC是什么? BFC(Block Formatting Context)直译为"块级格式 ...

  3. haslayout详解

    定义 haslayout是IE7-浏览器的特有属性.hasLayout是一种只读属性,有两种状态:true或false.当其为true时,代表该元素有自己的布局,否则代表该元素的布局继承于父元素. [ ...

  4. IE haslayout的理解与bug修复

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

  5. bfc和haslayout

    1 BFC是什么 Block Formatting Context (块格式化上下文)是W3C CSS 2.1 规范中的一个概念,在CSS3中被修改为flow root.格式化则表明了在这个环境中,元 ...

  6. php斯芬克斯,斯芬克斯之迷——ie私有属性haslayout的困扰

    就象神话中的斯芬克斯一样,ie的私有属性haslayout是个神秘且让人困惑的难缠东西,她只游荡于ie(这片沙漠)之下. 她无法使用css声明直接创建.即便是对于ie,她也不能说是一个实实在在存在的属 ...

  7. hasLayout属性

    在IE中,当一个元素的hasLayout属性被触发后(不可逆转),就会拥有一个布局,可以进行更多的样式更改操作. 包含该属性的元素有 body html/table tr th td/img/hr/i ...

  8. [css] 说说你对hasLayout的理解,触发hasLayout的方式有哪些?

    [css] 说说你对hasLayout的理解,触发hasLayout的方式有哪些? hasLayout可理解为是IE7以及更旧版本的BFC. 跟BFC一样,hasLayout不能直接通过属性进行设置, ...

  9. [css] 请问触发hasLayout的后果是什么?

    [css] 请问触发hasLayout的后果是什么? 继承父元素的布局. 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 主目录 与歌谣一起通关前端面 ...

  10. hasLayout和filter滤镜的细节

    filter:alpha(opacity=60); IE(<9)透明滤镜失效. 如果我们设置宽度后filter就会有效果,而这个没有设置宽度hasLayout 属性值是0 熟悉haslayout ...

最新文章

  1. __FUNCTION__, __LINE__ 有助于debug的宏定义
  2. 位数不足前面补0mysql语句_MySQL查询添加0到少于9位数字?
  3. cass块参照怎么改颜色,【干货】新版本CASS符号颜色自定义详解
  4. html以图像中心定位,在HTML图像上水平和垂直居中文本(绝对定位)
  5. 中文BERT上分新技巧,多粒度信息来帮忙
  6. 数字城市杭州执法管理平台测试计划【软件测试与工程】
  7. 百度Apollo发布智能驾驶商业化解决方案
  8. pku 2387 Til the Cows Come Home
  9. VUE引入阿里icon
  10. SublimeText 3 高亮 MATLAB语法
  11. 机器学习:学习的分类
  12. linux 查看上一级目录,du 使用详解 查看一级目录大小
  13. 项目Beta冲刺(3/7)(追光的人)(2019.5.25)
  14. python 百度云不限速_百度云不限速插件内置十几种网盘搜索!
  15. 1147 简单评委打分
  16. Codec Engine 概要
  17. 【雨滴降落的速度是每秒10米】
  18. Flink程序启动报错could not be determined automatically
  19. 图像处理——低频、高频和噪声、细节、边缘
  20. 如果把减肥作为一个项目,应该如何制定计划

热门文章

  1. Openpyxl:读取/写入Excel文件的Python模块
  2. C语言基础教程之可变的参数
  3. Java基础之字符串详细比较
  4. Thread类和Runnable接口如何运用?
  5. 方向导数、梯度与梯度下降
  6. TensorFlow入门(2)矩阵基础
  7. 一个沉重的问题:软件开发到底还有价值吗?
  8. MikroTik RouterOS使用U盘安装提示FATAL ERROR: no CD-ROM found Press ENTER to reboot的问题解决...
  9. ansible之cron模块
  10. JVM 类加载机制详解