CSS清除浮动的几种方法

上一篇博客中提到过css中可以通过设置父元素BFC化的方式来清除浮动,

搜狗截图16年12月02日1152_1

地址http://www.cnblogs.com/adventureofraindrop/p/6123264.html

这几种方法其原理都是共通的,但它们虽然都达到了清除浮动的作用,同时也带来了其他的问题,因此在实际应用中有些并不常用,有些视具体情形才可以使用。

那么有清除浮动有多少种方法呢?有哪些比较好用不会造成其他问题的方法呢?

首先我们总结一下清除浮动几种方法的分类,笔者总结后将它们分为以下几类:

1.BFC清除浮动

详细方法可见上图,共有四种

2.设置父元素height

父元素有了定义的高度后,就不会出现内部元素浮动后因无法获取高度而发生高度坍塌的问题。

3.使用clear:both

有两种用法。一种是在父级div末尾添加一个空div,设置clear:both;另一种是父级div末尾添加一个br标签,同样设置clear:both。

4.after伪类和zoom:1

这种方法是为父级div设置after伪类,达到清除浮动的效果,原理与前一种方法类似。

特别需要注意的是,以上四类方法只是思路,因为兼容性问题等,并非具体实现代码

下面才是这几种方法的具体实现代码及兼容情况和优缺点(按实用程度大致排先后):

一:推荐使用

1.父级div定义clearfix类,利用after伪类和zoom清除浮动

首先看代码

<style type="text/css"> 
.div1{background:#000080;border:1px solid red;} 
.div2{background:#800080;border:1px solid red;height:100px;margin-top:10px} 
.left{float:left;width:20%;height:200px;background:#DDD} 
.right{float:right;width:30%;height:80px;background:#DDD} 
/*清除浮动代码*/ 
.clearfix:after{display:block;clear:both;content:"";height:0;visibility:hidden;} 
.clearfix{zoom:1} 
</style> 
<div class="div1 clearfix"> 
<div class="left">Left</div> 
<div class="right">Right</div> 
</div> 
<div class="div2"> 
div2 
</div>

兼容:IE8以上和非IE浏览器支持after伪类,zoom为IE专有属性,两种配合使用能适用于大部分浏览器。

优点:浏览器支持好,是当前最常用的清除浮动方法

缺点:原理对于初学者难懂,推荐这篇博客http://blog.sina.com.cn/s/blog_60b35e830101c1r8.html

使用:推荐使用,建议在项目中定义公共clearfix类,减少css代码。

二、视具体情形使用

2.父级div定义overflow:hidden

<style type="text/css"> 
.div1{background:#000080;border:1px solid red;/*解决代码*/width:98%;overflow:auto} 
.div2{background:#800080;border:1px solid red;height:100px;margin-top:10px;width:98%} 
.left{float:left;width:20%;height:200px;background:#DDD} 
.right{float:right;width:30%;height:80px;background:#DDD} 
</style> 
<div class="div1"> 
<div class="left">Left</div> 
<div class="right">Right</div> 
</div> 
<div class="div2"> 
div2 
</div>

注意:必须同时定义width或zoom:1,同时不能定义height,使用overflow:hidden时,流浪器会自动检查浮动区域的高度

有点:代码简单、浏览器支持好

缺点:不便与position配合使用,超出部分会被隐藏

建议:推荐不使用position的情况或对overflow理解掌握较深时使用

3.父级div定义高度

<style type="text/css"> 
.div1{background:#000080;border:1px solid red;/*解决代码*/height:200px;} 
.div2{background:#800080;border:1px solid red;height:100px;margin-top:10px} 
.left{float:left;width:20%;height:200px;background:#DDD} 
.right{float:right;width:30%;height:80px;background:#DDD} 
</style> 
<div class="div1"> 
<div class="left">Left</div> 
<div class="right">Right</div> 
</div> 
<div class="div2"> 
div2 
</div>

优点:原理简单,代码少

缺点:只适用于高度固定的布局,内部元素高度超出时会产生其它问题

建议:高度固定时可使用,其它场景避免使用

4.父级定义overflow:outo

代码及原理都类似于方法2,只是将overflow:hidden改为overflow:auto

缺点:超出部分会出现滚动条

建议:需要滚动条或者高度控制到可以确保不出现滚动条的情况使用

三、不推荐使用

在对代码要求越发严格的今天,内容结构分离,语义化都是重要的内容,因此不推荐使用以下方法,可作为了解

5.结尾处加空标签clear:both

<style type="text/css"> 
.div1{background:#000080;border:1px solid red} 
.div2{background:#800080;border:1px solid red;height:100px;margin-top:10px} 
.left{float:left;width:20%;height:200px;background:#DDD} 
.right{float:right;width:30%;height:80px;background:#DDD} 
/*清除浮动代码*/ 
.clearfloat{clear:both} 
</style> 
<div class="div1"> 
<div class="left">Left</div> 
<div class="right">Right</div> 
<div class="clearfloat"></div> 
</div> 
<div class="div2"> 
div2 
</div>

原理:添加一个空div,利用clear:both清除浮动,让父级div能自动获取到高度

优点:代码简单、浏览器支持好

缺点:如果页面浮动布局较多,会添加很多无意义标签,对文档结构不友好

建议:不推荐使用,是以前主要的清除浮动方法

6.结尾处加br标签

原理、代码等同方法5,同时必须定义父级元素zoom:1

推荐:了解即可

7.父级div也一起浮动

<style type="text/css"> 
.div1{background:#000080;border:1px solid red;/*解决代码*/width:98%;margin-bottom:10px;float:left} 
.div2{background:#800080;border:1px solid red;height:100px;width:98%;/*解决代码*/clear:both} 
.left{float:left;width:20%;height:200px;background:#DDD} 
.right{float:right;width:30%;height:80px;background:#DDD} 
</style> 
<div class="div1"> 
<div class="left">Left</div> 
<div class="right">Right</div> 
</div> 
<div class="div2"> 
div2 
</div>

原理:父级div一起浮动,就变成了一个整体

缺点:会产生新的浮动问题

建议:不推荐使用

8.父级div定义display:table

<style type="text/css"> 
.div1{background:#000080;border:1px solid red;/*解决代码*/width:98%;display:table;margin-bottom:10px;} 
.div2{background:#800080;border:1px solid red;height:100px;width:98%;} 
.left{float:left;width:20%;height:200px;background:#DDD} 
.right{float:right;width:30%;height:80px;background:#DDD} 
</style> 
<div class="div1"> 
<div class="left">Left</div> 
<div class="right">Right</div> 
</div> 
<div class="div2"> 
div2 
</div>

原理:父级divBFC化清除浮动

优缺点未知

最后

本文由笔者总结,参考了http://www.jb51.net/css/173023.htmlCSS清除浮动大全共8种方法这篇文章

,感谢前人栽阴!

posted @ 2016-12-02 14:56  云牧  阅读(436)  评论(0编辑  收藏  举报