当一个父元素包含的子元素都设置为float的时候,父元素的高度会出现坍塌的现象(见下图)。此时可能会对周围的布局产生影响,因此清除浮动,显得十分重要。segmentfault
经过在父元素后面添加一个伪元素,设置为 block并清除左右浮动解决问题。目前这个方法是最新的。布局
.container::after { content:" "; display:block; clear:both; }
可能有些代码有添加::before
,且display:table
spa
.container::after,.container::before{ content:" "; display:table; } .container::after{ clear:both; }
实际上添加的部分跟浮动并无关系,他们的做用是防止子元素的margin-top发生重叠。
但添加::before就必须将display设置为table。主要原理:display设置为table时会出现一个匿名表格单元格(anonymous table-cell),从而建立一个新的BFC(下文会说起),根据BFC的布局规则,会使margin-top不重叠。这里只是解释说明有些代码出现这种写法的缘由,若是没有防止重叠的需求,彻底能够精简代码,使用上一种写法。code
有时还会在代码的最后写上blog
.container { zoom:1; /* For IE 6/7 (trigger hasLayout) */ }
这里主要是为了兼容IE6/7.图片
还有一种类似的作法element
.clearfix:after{ display: block; clear: both; content: ""; visibility: hidden; height: 0; } .clearfix{ zoom:1; }
将display设置为block是由于:after
是伪元素,要想得到clear属性必须将他转换为block。添加visibility: hidden;height: 0;
是让包含块末端看起来不那么乱,因此就直接隐藏起来。get
最简单除粗暴的方法就是直接在包含块末端添加一个标签,而且使用clear属性。it
<br style="clear:both" /> <!-- So dirty! -->
但这种作法在HTML中语义不明确,一旦代码量增长,后期比较难维护。慎用!table
.container { overflow: hidden; /* Clearfix! */ zoom: 1; /* Triggering "hasLayout" in IE */ display: block; /* Element must be a block to wrap around contents. Unnecessary if only using block-level elements. */ }
这里主要是将overflow设置为非visible值,创建一个BFC,根据BFC的布局规则将浮动子元素包含进来。须要注意的是,container 里面的内容是否有溢出的风险。
直接将包含块设置为float。便可创建BFC。但这种作法不推荐,由于总体浮动会影响其余的布局。
如上所述,清除浮动有两大方法,使用clear属性和创建BFC。围绕这两方面可使用不少小技巧。这里只是罗列几个常见的方法,并详细解释每条语句的做用,虽然有点啰嗦,但重在理解。若是有更好的方法也欢迎补充。