清理浮动有很多种方式,像使用br标签自带的clear属性,使用元素的overflow,使用空标签来设置clear:both;等等。但考虑到兼容问题和语义化的问题,一般我们都会使用如下代码来清理浮动。
1
2
3
4
5
6
7
8
9
10
11
12
| /*清理浮动*/
.clearfix:after{
visibility:hidden;
display:block;
font-size:0;
content:" ";
clear:both;
height:0;
}
.clearfix{
zoom:1;
} |
其原理是,在「高级」浏览器中使用:after伪类在浮动块后面加上一个非display:none;的不可见块状内容来,并给它设置clear:both;来清理浮动。在IE6和7中给浮动块添加haslayout来让浮动块撑高并正常影响文档流。
上面的代码应该是现在主流的清理浮动方式。而现在,Nicolas Gallagher给出了一个更简洁的方案:
1
2
3
4
5
6
7
8
9
10
| .cf:before,.cf:after{
content:" ";
display:table;
}
.cf:after{
clear:both;
}
.cf{
zoom:1;
} |
原理还是一样的。使用:after伪类来提供浮动块后的clear:both;不同的是,隐藏这个空白使用的是display:table;。而不是设置visibility:hidden;height:0;font-size:0;这样的hack;
值得注意的是这里中的:before伪类。其实他是来用处理top-margin边折叠的,跟清理浮动没有多大的关系。但因为浮动会创建block formatting context,这样浮动元素上的另而一元素上如果刚有margin-bottom而这个浮动元素刚好有margin-top的话,应该让他们不折叠(虽然这种情况并不常见)。
下面是我自己常用的方式
1
2
3
4
5
6
7
8
| .clearfix:after{
content:"\20"; /* content:" ";=content:"\20"; */
display:block;
clear:both;
}
.clearfix{
zoom:1;
} |
信息来源于:sofish