如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
彻底弄清楚haslayout概念要想更好的理解css,尤其是IE下对css的渲染,haslayout是一个非常有必要彻底弄清除的概念。大多IE下的显示错误,就是源于haslayout。什么是haslayout?haslayout是WindowsInternetExplorer渲染引擎的一个内部组成部分。在InternetExplorer中,一个元素要么自己对自身的内容进行计算大小和组织,要么依赖于父元素来计算尺寸和组织内容。为了调节这两个不同的概念,渲染引擎采用了hasLayout的属性,属性值可以为true或false。当一个元素的hasLayout属性值为true时,我们说这个元素有一个布局(layout)当一个元素有一个布局时,它负责对自己和可能的子孙元素进行尺寸计算和定位。简单来说,这意味着这个元素需要花更多的代价来维护自身和里面的内容,而不是依赖于祖先元素来完成这些工作。因此,一些元素默认会有一个布局。当我们说一个元素“拥有layout”或“得到layout”,或者说一个元素“haslayout”的时候,我们的意思是指它的微软专有属性hasLayout被设为了true。一个“layout元素”可以是一个默认就拥有layout的元素或者是一个通过设置某些CSS属性得到layout的元素。如果某个HTML元素拥有haslayout属性,那么这个元素的haslayout的值一定只有true,haslayout为只读属性一旦被触发,就不可逆转。通过IEDeveloperToolbar可以查看IE下HTML元素是否拥有haslayout,在IEDeveloperToolbar下,拥有haslayout的元素,通常显示为“haslayout=-1”。负责组织自身内容的元素将默认有一个布局,主要包括以下元素(不完全列表):*bodyandhtml*table,tr,th,td*img*hr*input,button,file,select,textarea,fieldset*marquee*frameset,frame,iframe*objects,applets,embed对于并非所有的元素都默认有布局,微软给出的主要原因是“性能和简洁”。如果所有的元素都默认有布局,会对性能和内存使用上产生有害的影响。如何激发haslayout?大部分的IE显示错误,都可以通过激发元素的haslayout属性来修正。可以通过设置css尺寸属性(width/height)等来激发元素的haslayout,使其“拥有布局”。如下所示,通过设置以下css属性即可。*display:inline-block*height:(任何值除了auto)*float:(left或right)*position:absolute*width:(任何值除了auto)*writing-mode:tb-rl*zoom:(除normal外任意值)InternetExplorer7还有一些额外的属性(不完全列表):*min-height:(任意值)*max-height:(除none外任意值)*min-width:(任意值)*max-width:(除none外任意值)*overflow:(除visible外任意值)*overflow-x:(除visible外任意值)*overflow-y:(除visible外任意值)*position:fixed其中overflow-x和overflow-y是css3盒模型中的属性,目前还未被浏览器广泛支持。对于内联元素(默认即为内联的元素,如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问题的调试与解决当网页在IE中有异常表现时,可以尝试激发haslayout来看看是不是问题所在。常用的方法是给某元素css设定zoom:1。