css|浮动 按照CSS规范,浮动元素(floats)会被移出文档流,不会影响到块状盒子的布局而只会影响内联盒子(通常是文本)的排列。因此当其高度超出包含容器时,一般父容器不会自动伸长以闭合浮动元素。但是有时我们却需要这种自动闭合行为,具体如何处理呢?
按照规范,以下类型的元素会产生一个块级格式化范围:
- 浮动元素,left 或者 right 皆可。
- 绝对定位的元素。
- inline-block 元素,不过这个 gecko目前不支持。
- table-cell 类型元素,其实 table, table-head-group, table-row 什么的也都可以,还有inline-
- table(gecko不支持)也同样,因为他们都会间接产生一个匿名的 table-cell。
- overflow 取值非 visible 的元素。
而对于 IE/Win,它有一套自己的体系,就是 layout,具有 layout 的元素会自动闭合浮动元素,再来看看触发 layout 的 CSS 属性,会发现和上面的块级格式化范围有很多类似之处:
- 浮动元素
- 绝对定位元素
- display:inline-block
- zoom
- width/height
- overflow/overflow-x/overflow-y [IE7 新增]
- max/min-width/height [IE7 新增]
还要提一点的是 display:inline-block,这个属性对 IE 而言本身没什么用,实际效果只是给一个元素暗地添加了 layout,但是标准兼容浏览器是认得这个属性的,所以要不影响这些浏览器,需要将 display 设回默认。这里 IE 有一个 bug,如果先定义了 display:inline-block,然后再将 display 设回 block(这两个 display 要先后放在两个 CSS 声明中才有效果),那么 layout 不会消失,同时也不会影响其他浏览器,所以目前来说,这也算一个不错的触发 layout 的方法:
.gainlayout{display:inline-block;}
.gainlayout{display:block;}
所以 要跨浏览器闭合浮动元素,可以选择的方式还是很多的,如何搭配使用这些 CSS 属性就要具体情况具体分析了,灵活应用条件注释也很有必要,要是实在不行我们回过头来还有 clear 可以用嘛。