CSS之IE浏览器的hasLayout,IE低版本的bug根源
什么是hasLayout?
hasLayout是IE特有的一个属性。很多的ie下的css bug都与其息息相关。在ie中,一个元素要么自己对自身的内容进行计算大小和组织,要么依赖于父元素来计算尺寸和组织内容。当一个元素的hasLayout属性值为true时,它负责对自己和可能的子孙元素进行尺寸计算和定位。虽然这意味着这个元素需要花更多的代价来维护自身和里面的内容,而不是依赖于祖先元素来完成这些工作。
哪些元素默认有hasLayout属性
在IE浏览器中下列默认hasLayout=true的元素<table>
<td> <body> <img> <hr> <input>
<select> <textarea> <button> <iframe>
<embed> <object> <applet> <marquee>
很多情况下,我们把 hasLayout的状态改成true 就可以解决很大部分ie下显示的bug。
这儿所示的bug一般指的是IE7以及以下的浏览器。
如何设置haslayout?
下面列出可以触发hasLayout的一些CSS属性值。
position:
absolute(取消使用:static)float:
left or right(取消使用:none)display:
inline-block(取消使用:其它值)width:
除了auto以外的值(取消使用:auto)height:
除了auto以外的值(取消使用:auto)zoom:
有值(取消使用:normal或者空值)
ie7还有一些额外的属性可以触发该属性(不完全列表):
min-height: (网上查看说是任何值,但实践发现还是
除了none与auto)max-height: (任何值除了none与auto)
min-width: (网上查看说是任何值,但实践发现还是
除了none与auto)max-width: (任何值除了none与auto)
overflow: (任何值除了visible)
overflow-x: (任何值除了visible)
overflow-y: (任何值除了visible)
position: fixed
js测试一个元素是否有layout
<div id="menu" onclick="javascript:alert(menu.currentStyle.hasLayout)">这个是文本内容</div>
在IE浏览器中点击这个ID为menu的DOM元素,如果元素有layout,那么弹出来的结果是true,否则为false。
举例
1.当一个元素内含浮动或绝对定位的内容时,它通常会表现出奇怪和错误的行为,看下面的代码:
html:
<div id="nofloatbox">
<div id="floatbox"></div>
</div>
css:
#nofloatbox {
    border: 1px solid #FF0000;
    background: #CCC;
    zoom:;
}
#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:;
}
在IE7以及低版本浏览器得到的结果如图:

那么其它标准浏览器就相当于清除子元素的浮动就可以,在父元素中添加overflow:hidden就可以。
2.hasLayout对于内联元素也可以有效果,当内联元素的hasLayout为true的时候,可以给这个内联元素设定高度和宽度并得到期望的效果,(这儿是指IE7以及低版本浏览器)如下例:
<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>
在IE7浏览器中的效果如图所示:

注意:要注意的是,hasLayout是微软专有的东西,对
firefox,Chrome等比较遵守标准的浏览器就无效了,因此不可太过依赖。其实依据合理的语义化,恰当的文档流,正确的标准化所生产出来的页面,在各个公司出品的标准渲染的浏览器下,一般并不会存在太多兼容性的问题的。
CSS之IE浏览器的hasLayout,IE低版本的bug根源的更多相关文章
- CSS的W3C标准的盒子模型和低版本IE浏览器的盒子模型
		
CSS中盒子模型的组成由内容区(content).内边距(padding).边框(border).外边距(margin)组成.内边距可细分为 padding-top.padding-right.pad ...
 - IE浏览器中hasLayout的介绍
		
haslayout是Windows Internet Explorer渲染引擎的一个内部组成部分.在InternetExplorer中,一个元素要么对自身的内容进行计算大小和组织,要么依赖于父元素来计 ...
 - AngularJS开发指南7:AngularJS本地化,国际化,以及兼容IE低版本浏览器
		
AngularJS本地化,国际化 国际化,简写为i18n,指的是使产品快速适应不同语言和文化. 本地化,简称l10n,是指使产品在特定文化和语言市场中可用. 对开发者来说,国际化一个应用意味着将所有的 ...
 - 使用html5兼容低版本浏览器
		
因为html5 新出的一些语义化的标签,在低版本浏览器下不能识别,举个例子,比如你写了一个 header 标签中,写了一段文本,在低版本浏览器下,肯定是能看到的,但是,那是他是不认识 header标签 ...
 - 如何让低版本的IE浏览器(IE6/IE7/IE8)支持HTML5 header等新标签
		
html5提供的一些新标签(article,aside,dialog,footer,header,section,footer,nav,figure,menu)使用起来非常的方便,但是低版本的IE浏览 ...
 - 低版本浏览器支持HTML5标签的方法
		
最近刷了一道面试题,是关于低版本浏览器支持HTM5标签的写法,在网上找了一些,都行之有效,但是缺少整体总结,所以在这里总结一下,方便其他人过来阅读. IE低版本需要支持HTML5标签: 方法1.传统引 ...
 - 如何让低版本IE浏览器支持HTML5标签并为其设置样式
		
现代的浏览器都支持HTML5,HTML5定义了 8 个新的 HTML 语义元素.所有这些元素都是 块级 元素. 为了能让旧版本的浏览器正确显示这些元素,你可以设置 CSS 的 display 属性值为 ...
 - position:fixed 兼容浏览器低版本
		
项目中遇到的坑,写篇博客做个笔记纪念下,position: fixed一般来说都兼容各个浏览器,但是要兼容浏览低版本问题,就得用-webkit-transform: translateZ(0);这段代 ...
 - HTML5中的语义标签兼容IE8以及更低版本的浏览器
		
看某教程,说让HTML5的这些语义标签能够兼容低版本的浏览器,原文是“你可以设置css的display属性为block”.很好理解,就设置css样式为block嘛,那就直接设置咯: header, s ...
 
随机推荐
- C++ Opencv 自写函数实现膨胀腐蚀处理
			
一.膨胀腐蚀学习笔记 二.代码及结果分享 #include <opencv2/opencv.hpp> #include <iostream> using namespace s ...
 - Day3:html和css
			
Day3:html和css 多类名选择器 样式的显示效果是跟html元素中的类名先后顺序无关,而是跟css样式的书写上下顺序有关. <!DOCTYPE html> <html lan ...
 - 第46节:Java当中的常量池
			
Java当中的常量池 在Java虚拟机jvm中,内存分布为:虚拟机堆,程序计数器,本地方法栈,虚拟机栈,方法区. 程序计数器是jvm执行程序的流水线,是用来存放一些指令的,本地方法栈是jvm操作系统方 ...
 - 【MySQL】percona-toolkit工具包
			
[说明] percona-toolkit工具包同percona-xtrabackup一样都是用Perl写的工具包,percona-toolkit工具包是一组高级的管理mysql的工具包集,可以用来执行 ...
 - Oracle开窗函数笔记及应用场景
			
介绍Oracle的开窗函数之前先介绍一下分析函数,因为开窗函数也属于分析函数 分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行. 上面是 ...
 - vim常用命令行备忘总结
			
一 窗口切换 1 :sp 水平切换当前窗口 2 :vsp 垂直切换当前窗口 3 :clo 关闭活动窗口 4 : on 只保留活动窗口 5 : ctrl + w 在窗口间循环切换 ctrl + ...
 - Scala - 快速学习06 - 面向对象
			
1- 类 1.1- 简介:类.方法及对象 类是用来创建对象的蓝图. Scala文件中包含的多个类之间,都是彼此可见的,不需要声明为public. 创建对象 定义好类以后,就可以使用new关键字来创建对 ...
 - java中调用三方接口post传参时map和jsonobject的区别转换
			
post方法名及参数为:(具体方法可参考https://www.cnblogs.com/mufengforward/p/10510337.html) public static String doPo ...
 - vue 项目实战 (生命周期钩子)
			
开篇先来一张图 下图是官方展示的生命周期图 Vue实例的生命周期钩子函数(8个) 1. beforeCreate 刚 new了一个组件,无法访问到数据和真实的do ...
 - Zabbix系列之五——监控TCP端口
			
监控端口的几个主要Keys: net.tcp.listen[port] Checks if this port is in LISTEN state. 0 - it is not, 1 - it is ...