浮动在css中是非常重要但也是引起很多莫名问题的罪魁祸首,所以我们对它可谓又爱又恨。
下面是我总结的几种清除浮动的方式(其中第一种是最常用的方式,很多大型网站都用到过):
提醒读者:全文所有的实例代码都只有些微几行不同,为了让读者更清楚理解才在每个例子中都展现了完整代码。
清除浮动方式一:父级div定义伪类:after 结合使用zoom兼容低版本IE
<!DOCTYPE html>
<html >
<head>
<meta charset="UTF-8">
<title>清除浮动方式一:父级div定义伪类:after结合使用zoom兼容低版本IE</title>
<style type="text/css">
*{
margin:0;
padding: 0;
}
.div1{background:#000080;}
.div2{background:#800080;height:100px;}
.left{float:left;width:20%;height:200px;background:#DDD}
.right{float:right;width:30%;height:80px;background:#DDD}
/*清除浮动代码*/
.clearfloat:after{display:block;clear:both;content:"";visibility:hidden;height:0}
.clearfloat{zoom:1}
</style>
</head>
<body>
<div class="div1 clearfloat">
<div class="left">Left</div>
<div class="right">Right</div>
</div>
<div class="div2">
div2
</div>
</body>
</html>
原理:IE8以上和非IE浏览器才支持:after。zoom(IE专有属性)可解决ie6,ie7浮动问题。
优点:浏览器支持好,不容易出现怪问题。
缺点:代码多,不少初学者不理解原理,要两句代码结合使用,才能让主流浏览器都支持。
建议:推荐使用,建议定义公共类,以减少CSS代码
在文章最后还会在再次详细解释这个方法,因为这是比较重要的一个清楚浮动方法。
清除浮动方式二:添加额外标签
<!DOCTYPE html>
<html >
<head>
<meta charset="UTF-8">
<title>清除浮动方式二:添加额外标签</title>
<style type="text/css">
*{
margin:0;
padding: 0;
}
.div1{background:#000080;}
.div2{background:#800080;height:100px;}
.left{float:left;width:20%;height:200px;background:#DDD}
.right{float:right;width:30%;height:80px;background:#DDD}
/*清除浮动代码*/
.clearfloat{clear:both};
</style>
</head>
<body>
<div class="div1 clearfloat">
<div class="left">Left</div>
<div class="right">Right</div>
<div class="clearfloat"></div>
<!-- <br class="clearfloat"> -->
</div>
<div class="div2">
div2
</div>
</body>
</html>
原理:通过在浮动元素末尾添加一个空的标签例如 <div></div>,其他标签br等亦可。
优点:通俗易懂,容易掌握。
缺点:添加很多无意义的空标签,在后期维护时将会非常麻烦。
建议:不推荐使用。尽管它是以前主要使用的一种清除浮动方法。
清除浮动方式三:父级添加overflow:hidden
<!DOCTYPE html>
<html >
<head>
<meta charset="UTF-8">
<title>清除浮动方式三:父级添加overflow:hidden</title>
<style type="text/css">
*{
margin:0;
padding: 0;
}
.div1{background:#000080;/*解决代码*/overflow:hidden;*zoom:1;}
.div2{background:#800080;height:100px;}
.left{float:left;width:20%;height:200px;background:#DDD}
.right{float:right;width:30%;height:80px;background:#DDD}
</style>
</head>
<body>
<div class="div1 clearfloat">
<div class="left">Left</div>
<div class="right">Right</div>
</div>
<div class="div2">
div2
</div>
</body>
</html>
原理:必须定义width或zoom:1来兼容低版本IE,同时不能定义height。
优点:简单,代码少,浏览器支持好。
缺点:1.内容增多时候容易造成不会自动换行导致内容被隐藏掉,无法显示需要溢出的元素。
2.不能和position配合使用.
建议:只推荐没有使用position或对overflow:hidden理解比较深的朋友使用.
清除浮动方式四:父级添加overflow:auto
<!DOCTYPE html>
<html >
<head>
<meta charset="UTF-8">
<title>清除浮动方式四:父级添加overflow:auto</title>
<style type="text/css">
*{
margin:0;
padding: 0;
}
.div1{background:#000080;/*解决代码*/overflow:auto;*zoom:1;}
.div2{background:#800080;height:100px;}
.left{float:left;width:20%;height:200px;background:#DDD}
.right{float:right;width:30%;height:80px;background:#DDD}
</style>
</head>
<body>
<div class="div1 clearfloat">
<div class="left">Left</div>
<div class="right">Right</div>
</div>
<div class="div2">
div2
</div>
</body>
</html>
原理:必须定义width或zoom:1来兼容低版本IE,同时不能定义height。
优点:简单,代码少,浏览器支持好。
缺点:内部宽高超过父级div时,会出现滚动条。
建议:不推荐使用.
清除浮动方式五:父级手动定义高度
<!DOCTYPE html>
<html >
<head>
<meta charset="UTF-8">
<title>清除浮动方式五:父级手动定义高度</title>
<style type="text/css">
*{
margin:0;
padding: 0;
}
.div1{background:#000080;/*解决代码*/height:200px;}
.div2{background:#800080;height:100px;}
.left{float:left;width:20%;height:200px;background:#DDD}
.right{float:right;width:30%;height:80px;background:#DDD}
</style>
</head>
<body>
<div class="div1 clearfloat">
<div class="left">Left</div>
<div class="right">Right</div>
</div>
<div class="div2">
div2
</div>
</body>
</html>
原理:父级div手动定义height,就解决了父级div无法自动获取到高度的问题。
优点:简单,代码少,容易掌握
缺点:只适合高度固定的布局,要给出精确的高度,如果高度和父级div不一样时,会产生问题
建议:不推荐使用,只建议高度固定的布局时使用。
清除浮动方式六:父级元素也浮动
<!DOCTYPE html>
<html >
<head>
<meta charset="UTF-8">
<title>清除浮动方式六:父级元素也浮动</title>
<style type="text/css">
*{
margin:0;
padding: 0;
}
.div1{background:#000080;/*解决代码*/float: left;width:100%;}
.div2{background:#800080;height:100px;/*解决代码*/clear:both;}
.left{float:left;width:20%;height:200px;background:#DDD}
.right{float:right;width:30%;height:80px;background:#DDD}
</style>
</head>
<body>
<div class="div1 clearfloat">
<div class="left">Left</div>
<div class="right">Right</div>
</div>
<div class="div2">
div2
</div>
</body>
</html>
原理 :所有代码一起浮动,变成了一个整体。注意,需要在父级元素指定width。
优点:不存在结构和语义化问题。
缺点:会产生新的浮动问题。
建议:不推荐使用,只作了解。
清除浮动方式七:父级div定义display:table
<!DOCTYPE html>
<html >
<head>
<meta charset="UTF-8">
<title>清除浮动方式七:父级div定义display:table</title>
<style type="text/css">
*{
margin:0;
padding: 0;
}
.div1{background:#000080;/*解决代码*/display: table;width: 100%;}
.div2{background:#800080;height:100px;}
.left{float:left;width:20%;height:200px;background:#DDD}
.right{float:right;width:30%;height:80px;background:#DDD}
</style>
</head>
<body>
<div class="div1 clearfloat">
<div class="left">Left</div>
<div class="right">Right</div>
</div>
<div class="div2">
div2
</div>
</body>
</html>
原理:所有代码一起浮动,变成了一个整体。注意,需要在父级元素指定width。
优点:结构语义化完全正确。
缺点:盒模型属性已经改变,由此造成的一系列问题,得不偿失。
建议:不推荐使用。
最后在详细讲解一下第一种(after伪类)方式。
.clearfix:after {content:""; display:block; height:0; visibility:hidden; clear:both; }
.clearfix { *zoom:1; }
1) display:block 使生成的元素以块级元素显示,占满剩余空间;
2) height:0 避免生成内容破坏原有布局的高度。
3) visibility:hidden 使生成的内容不可见,并允许可能被生成内容盖住的内容可以进行点击和交互;
4)通过 content:"."生成内容作为最后一个元素,至于content里面是点还是其他都是可以的,当然也可以为空。
5)*zoom:1 兼容低版本IE。
其实。 除了clear:both用来清除浮动的,其他代码无非都是为了隐藏掉content生成的内容,这也就是其他这个方式清除浮动为什么会有font-size:0,line-height:0。(after伪类清除浮动方式的其他写法)
相对于空标签闭合浮动的方法这个方法的代码似乎还是有些冗余,通过查询发现Unicode字符里有一个“零宽度空格”,也就是U+200B ,这个字符本身是不可见的,所以我们完全可以省略掉 visibility:hidden了 。于是有个简介点的写法:
.clearfix:after {content:"\200B"; display:block; height:0; clear:both; }
.clearfix { *zoom:1; }.