关于行元素可以设置宽高的那些事

CSS:haslayout知多少

我们都知道浏览器有bug,而IE的bug似乎比大多数浏览器都多。IE的表现与其他浏览器不同的原因之一就是,显示引擎使用一个称为布局(layout)的内部概念。

因为布局是专门针对显示引擎内部工作方式的概念,所以一般情况下不需要了解它。但是,布局问题是许多IE显示bug的根源,所以理解这个概念以及它如何影响CSS对修复bug是有帮助的。

一、什么是haslayout

haslayout是Windows Internet Explorer渲染引擎的一个内部组成部分。在Internet
Explorer中,使用布局概念来控制元素的尺寸和定位。在理想情况下,所有元素都控制自己的尺寸和定位。但是,这在IE中会导致很大的性能问题。因此,IE开发团队决定只将布局应用于实际需要它的那些元素,这样就可以充分地减少性能开销。

拥有布局(have
layout)的元素负责本身及其子元素的尺寸和定位。如果一个元素没有布局,那么它的尺寸和位置由最近的拥有布局的祖先元素控制。IE显示引擎利用布局概念减少它的处理开销。一个元素要么自己对自身的内容进行计算大小和组织,要么依赖于父元素来计算尺寸和组织内容。

为了调节这两个不同的概念,渲染引擎采用了hasLayout的属性,属性值可以为true或false。当一个元素的
hasLayout属性值为true时,我们说这个元素有一个布局(layout),当一个元素有一个布局时,它负责对自己和可能的子孙元素进行尺寸计算和定位。简单来说,这意味着这个元素需要花更多的代价来维护自身和里面的内容,而不是依赖于祖先元素来完成这些工作。因此,一些元素默认会有一个布局。当我们说一个元素“拥有layout”或“得到layout”,或者说一个元素“has
layout”的时候,我们的意思是指它的微软专有属性 hasLayout 被设为了true
。一个“layout元素”可以是一个默认就拥有layout的元素或者是一个通过设置某些CSS属性得到layout
的元素。如果某个HTML元素拥有haslayout属性,那么这个元素的
haslayout的值一定只有true,haslayout为只读属性一旦被触发,就不可逆转。通过IE Developer
Toolbar可以查看IE下HTML元素是否拥有haslayout,在IE Developer
Toolbar下,拥有haslayout的元素,通常显示为“haslayout = -1”。

二、默认拥有haslayout属性

<html>,
<body>

<table>,
<tr>,
<th>,
<td>

<img>

<hr>

<input>,
<button>,
<select>,
<textarea>,
<fieldset>,
<legend>

<iframe>,
<embed>,
<object>,
<applet>

<marquee>

 

三、触发haslayout属性

很多情况下,我们把 hasLayout的状态改成true
就可以解决很大部分ie下显示的bug。

hasLayout属性不能直接设定,你只能通过设定一些特定的css属性来触发并改变 hasLayout
状态。下面列出可以触发hasLayout的一些CSS属性值。

display

启动haslayout的值:inline-block

取消hasLayout的值:其他值

--------------------------------------

width/height

启动hasLayout的值:除了auto以外的值

取消hasLayout的值:auto

( 对 IE6 及更早版本来说很常用,该方法被称为霍莉破解(Holly
hack),即设定这个元素的高度为 1% (height:1%;)。但是要注意,当这个元素的 overflow 属性被设置为
visible 时,这个方法就失效了。)

---------------------------------------

position

启动hasLayout的值:absolute

取消hasLayout的值:static

----------------------------------------

float

启动hasLayout的值:left或right

取消hasLayout的值:none

---------------------------------------

zoom

启动hasLayout的值:有值

取消hasLayout的值:narmal或者空值

(又一个ie私有属性,不兼容标准。)

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

min-height: (任何值)

max-height: (任何值除了none)

min-width: (任何值)

max-width: (任何值除了none)

overflow: (任何值除了visible)

overflow-x: (任何值除了visible)

overflow-y: (任何值除了visible)

position: fixed

四、发现及使用

因元素hasLayout而导致的问题其实一般都很容易发现:往往是内容出现错位甚至完全不可见,比如含浮动或者绝对定位子元素的容器高度会塌陷,在ie6/ie7下我们为其添加zoom:1属性就触发了haslayout,从而修复高度塌陷的问题;再比如,我们经常会碰到ie6和ie7同时出现的bug,这个时候可以考虑是否源于
haslayout,可以添加一些可以触发haslayout的属性来解决。

时间: 2024-10-08 10:29:06

关于行元素可以设置宽高的那些事的相关文章

可替换元素—行级元素可以设置宽高?

上篇文章讲的是行级元素与块级元素,明明说了行级元素不可设置width,height属性,而为何img.input等行级元素可以设置宽.高??? 看官莫急,下面我会详细解答. 可替换元素 1. 替换元素就是浏览器根据元素的标签和属性,来决定元素的具体显示内容.例如浏览器会根据<img>标签的src属性的值来读取图片信息并显示出来,而 如果查看(X)HTML代码,则看不到图片的实际内容:又例如根据<input>标签的type属性来决定是显示输入框,还是单选按钮等. 2. 他们区别一般i

行内元素能设置宽高吗

除了行内非替换元素,table-rows,and row groups 其他元素都能设置宽 除了行内非替换元素,table-colums,colum-groups 其他元素都能设置高 行内元素包含行内替换元素(img等)和行内非替换元素(a span等) 行内替换元素是可以设置宽高的,行内非替换元素是不能设置宽高的. 当给行内元素设置 float:left; float:right; 或者 position:absolute; position:fixed; 行内非替换元素也是可以设置宽高的,究

为什么有些行内元素可以设置宽高

元素是文档结构的基础,在CSS中,每个元素生成了一个包含了元素内容的框(box,也译为“盒子”).但是不同的元素显示的方式会有所不同,例如<div>和<span>就不同,而<strong>和<p>也不一样.在文档类型定义(DTD)中对不同的元素规定了不同的类型,这也是DTD对文档之所以重要的原因之一. 1. 替换和不可替换元素 从元素本身的特点来讲,可以分为替换和不可替换元素. a) 替换元素 替换元素就是浏览器根据元素的标签和属性,来决定元素的具体显示内容

不设置宽高,使元素居中的方法

在某些特定的场合,在没有知道宽度的情况下却要求水平居中,今找到些解决方法,现转过来一起学习学习 方案一.利用浮动的包裹性和相对定位百分比数据值特性,传说称之为“相对浮动” .unknow_width_center1 {position:relative; left:50%; float:left;}.unknow_width_center1 li {position:relative; right:50%; z-index:2; float:left}<</span>ul class=&

&lt;canvas&gt;设置宽高遇到的问题

在使用<canvas>元素时必须设置宽度和高度,指定可以绘画的区域大小.但是这里设置宽度和高度的时候有一个小问题. 样例代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>canvas绘图</title> </head> <body> <canvas id="drawimg"

里面的div没有设置宽高,用padding设置的50px来撑开宽高,这个时候就需要用position:absolute或者relative来让文本去掉继承的外层的整宽度

1. <!DOCTYPE html><html><head><style>*{margin:0px;padding:0px;}#div1{position: relative;height: 200px;width: 200px;margin: 100px;padding:10px;border: 1px solid black;} #div2{padding:50px;position: absolute;border: 1px solid black;b

给内联元素设置宽高的几种方式

内联元素默认不能设宽高,其宽高由其内容自动撑开 让内联元素具有宽高属性的几种方式 1,给内联元素转换成块级元素或内联块级元素 block或inline-block 2,让内联元素脱离文档流,比如绝对定位.固定定位或浮动 span{ width:3rem; height:100%; float:left; }

dom块级元素的各种宽高

clientHeight,clientWidth: 元素宽高和padding, 不包括边框和margin, 如果有滚动条,还要减去滚动条的宽高.注意,这个值始终是整数,如果是小数会被四舍五入. clientLeft属性等于元素节点左边框(left border)的宽度(单位像素),不包括左侧的padding和margin.如果没有设置左边框,或者是行内元素(display: inline),该属性返回0.该属性总是返回整数值,如果是小数,会四舍五入. clientTop属性等于网页元素顶部边框的

frame方式布局一段文子,设置宽高

计算一段文字的宽高 /** * 计算一段文字的宽高 * * @param size 这段文字的最大宽高 * @param options NSStringDrawingUsesLineFragmentOrigin * @param attributes 文字的字体属性 * @param context nil * * @return 返回的是 CGRect 类型,frame */ - (CGRect)boundingRectWithSize:(CGSize)size options:(NSStr