文档流
是浏览器解析网页的一个重要概念。对于一个XHTML网页,body元素下的任意元素,根据其先后顺序,组成了一个上下关系,这便是文档流。浏览器根据这些元素的顺序去显示它们在网页中的位置。文档流是浏览器的默认显示规则。
Float
float :none| left | right
- 浮动的框可以向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止。
- 由于浮动框不在文档的普通流中,所以文档的普通流中的块框表现得就像浮动框不存在一样。
请看下图,当把框 1 向右浮动时,它脱离文档流并且向右移动,直到它的右边缘碰到包含框的右边缘:
例1:
如果把所有三个框都向左移动,那么框 1 向左浮动直到碰到包含框,另外两个框向左浮动直到碰到前一个浮动框。
例2:
再请看下图,当框 1 向左浮动时,它脱离文档流并且向左移动,直到它的左边缘碰到包含框的左边缘。因为它不再处于文档流中,所以它不占据空间,实际上覆盖住了框 2,使框 2 从视图中消失。
例3:
如下图所示,如果包含框太窄,无法容纳水平排列的三个浮动元素,那么其它浮动块向下移动,直到有足够的空间。
例4:
如果浮动元素的高度不同,那么当它们向下移动时可能被其它浮动元素“卡住”:
例5:
- 浮动元素会生成一个块级元素,而不论它本身是何种元素。
代码:
效果:
解释:内联元素无法设置宽高,但是加了float后便可以,说明浮动的元素都是块。
- 如果未给浮动元素设置宽度,那么其宽度为内容宽度。
代码:
效果:
解释:div是个块级元素,默认宽度为父级容器的100%,但是加上浮动后,宽度变的符合内容,可见,浮动的元素,如果不设置宽度,那么它会根据内容自适应宽度。
清除浮动 clear
clear :none| left | right | both
由于浮动的元素会对其下的元素产生影响,所以,可以给其下元素清除浮动。
上例的解决办法是给蓝色块加clear:left或者clear:both
浮动中常见的问题
- IE6 margin加倍
产生原因:同方向定义了float和margin,如margin-left,float:left
解决:display:inline。内联元素没有加倍问题
- IE6的3像素问题
产生原因:左边加float,右边没加。
解决:都加浮动
- 内层浮动,外层不能自动扩高
产生原因:内层元素浮动,脱离文档流,外层等同于没有包含内容。
解决:内部清除浮动。或者overflow:hidden;zoom:1;
扩展:haslayout(拥有布局)
一个元素要么自己对自身的内容进行计算大小和组织,要么依赖于父元素来计算尺寸和组织内容。一些元素默认会有一个布局,例如img或者input。
大部分的 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 外任意值)
Internet Explorer 7 还有一些额外的属性(不完全列表):
* 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 盒模型中的属性,目前还未被浏览器广泛支持。
- 浮动元素自动换行,被卡住问题
解决:固定宽高,overflow:hidden
- 浮动的列表,图标不出现
解决:将小图标用做
li的背景