文章目录
  1. 1. 用法
  2. 2. IE中的zoom:1
  3. 3. IE中的hasLayout

之前blog介绍了CSS中的清除浮动,其中有方法是使用zoom属性,设置zoom:1来触发IE的hasLayout属性。下面我们就介绍一下zoom属性及其相关用法。

用法

zoom: { number(数字) | percentage(百分比) | normal } ;

zoom可以设置或检索对象的缩放比例,其实说白了就是可以对所设置zoom值的元素进行缩放。zoom属性的值并不会继承,但它会影响到它的子元素,子元素会随着父元素一起放大或缩小。

zoom是CSS3中属性,IE及最新的webkit内核浏览器(chrome/safari)都是支持该属性的,但是FF和Opera暂时都还不支持。

webkit可以使用zoom:reset(IE不支持这个值)重设掉浏览器中正常的缩放行为——如果某个元素被声明了zoom:reset,页面上的其它元素在用户放大页面的时候都会跟着放大。

FF、Opera不支持这个缩放的属性,如果要实现缩放效果,可以使用CSS3中的scale实现。

IE中的zoom:1

Zoom属性刚开始是IE浏览器的专有属性,Firefox、opera以及较早版本的webkit核心的浏览器并不支持。

前段开发中兼容IE6、IE7、IE8浏览器,经常会遇到一些问题,可以使用zoom:1来解决,有如下作用:

触发IE浏览器的haslayout,解决ie下的浮动,margin重叠等一些问题。具体实现可以参看之前的blog。

IE中的hasLayout

上面提到了IE的hasLayout,大家肯定很好奇这是什么,我们下面就简单的介绍一下。

hasLayout是IE特有的一个属性。haslayout在ie8的标准模式下已经被废弃了,但是在ie7的兼容版本以及以下的版本是仍然存在的。

很多的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)5

position: fixed

。。。

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

文章目录
  1. 1. 用法
  2. 2. IE中的zoom:1
  3. 3. IE中的hasLayout