清除浮动记录
前端绕不开浮动这个话题,之前也都是拿来主义,所以心里一直有个坎。
首先有“清除浮动”和“闭合浮动”两种叫法,这两种叫法我觉得随意因为都是为了实现一个目的。
浮动的影响
1.高度变0(浮动的元素脱离普通流,通常导致父容器没内容支撑而高度变0)
2.影响兄弟元素的布局(尤其是一些IE浏览器)
清除浮动的影响
关于清除浮动的影响网上有很多版本,我用过两个版本;
版本一:
1 2 3 4 5 6 7 8 | .left{float:left} .right{float:right} .clear{clear:both} <div> <div class="left">...</div> <div class="right">...</div> <div class="clear"></div> </div> |
版本二:
1 2 3 4 5 6 | .clearfix:after {clear:both; content:' '; display:block; font-size:0; line-height:0; visibility:hidden; width:0; height:0} * html .clearfix {zoom:1} <div class="clearfix"> <div class="left">...</div> <div class="right">...</div> </div> |
版本一是最简单的,效果很好,也很好理解,不过多个空div就是不爽,而且明摆着那结构做样式的事情。
版本二现在来分析其实也很明了运用了版本一的原理,换了实现方法,用了伪元素:after添加一个空白内容,并隐藏这个内容。
zoom是针对IE6和7触发hasLayout闭合浮动。
网上有篇博文那些年我们一起清除过的浮动写的非常详细,但是内容太多了,我拿出其中的两段;
精益求精方案一:
相对于空标签闭合浮动的方法代码似乎还是有些冗余,通过查询发现Unicode字符里有一个“零宽度空格”,也就是U+200B ,这个字符本身是不可见的,所以我们完全可以省略掉 visibility:hidden了
1 2 | clearfix:after {content:"\200B"; display:block; height:0; clear:both; } .clearfix { *zoom:1; }. |
精益求精方案二:
一下方案中:before是用来处理margin边距重叠的问题,这个是创建BFC自带的重叠,不用多说
1 2 3 4 5 6 | .cf:before,.cf:after { content:""; display:table; } .cf:after { clear:both; }/* For IE 6/7 (trigger hasLayout) */ .cf { zoom:1; } |