一、为什么要清除浮动
浮动起来的元素会脱离标准流,如果我们的父级盒子没有设置高度就会造成父级盒子的高度塌陷,就会影响下面盒子的正常显示。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>为什么要清除浮动</title>
<style>
.box {
width: 800px;
border: 1px solid blue;
margin: 0 auto;
}
/* 不设置父亲高度 让子盒子去撑开父盒子 父亲高度会变成为0 影响下面的盒子 */
.damao {
width: 300px;
height: 200px;
background-color: purple;
float: left;
}
.ermao {
width: 200px;
height: 200px;
background-color: pink;
float: left;
}
.footer {
height: 200px;
background-color: black;
}
</style>
</head>
<body>
<div class="box">
<div class="damao">大毛</div>
<div class="ermao">二毛</div>
</div>
<div class="footer"></div>
</body>
</html>
发现box盒子变成了一根线,footer盒子跑到damao,ermao盒子的后面去了,这是因为box盒子没有高度,在没有设置浮动之前damao,ermao子盒子会把box父盒子撑开,一旦给子盒子设置浮动,它们就会立即脱离标准流浮动起来(就是离开父盒子),而父盒子没有设置高度,在失去子盒子支撑的时候就会变成一条横线,随即下面的footer盒子就会跟随父盒子跑上去。这就是造成高度塌陷的原因。
所以我们需要清除浮动,将浮动的子盒子重新塞回父盒子,让footer盒子正常显示。
二、清除浮动的五种方法
1.给父级盒子添加高度
.box {
width: 800px;
border: 1px solid blue;
margin: 0 auto;
height: 200px;
}
原理
造成高度塌陷的原因就是因为父盒子没有高度,所以我们只需要给父盒子设置一个高度即可。
缺陷
有很多局限性,子盒子依然是脱离标准流。更改高度很麻烦。
2.额外标签法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>清除浮动本质之额外标签法</title>
<style>
.box {
width: 800px;
border: 1px solid blue;
margin: 0 auto;
}
/* 不设置父亲高度 让子盒子去撑开父盒子 父亲高度会变成为0 影响下面的盒子 */
.damao {
width: 300px;
height: 200px;
background-color: purple;
float: left;
}
.ermao {
width: 200px;
height: 200px;
background-color: pink;
float: left;
}
.footer {
height: 200px;
background-color: black;
}
.clear {
clear: both;
}
</style>
</head>
<body>
<div class="box">
<div class="damao">大毛</div>
<div class="ermao">二毛</div>
<!-- 把浮动元素隔开 -->
<div class="clear"></div>
<!-- 这个新增的盒子要求必须是块级元素不能是行内元素 -->
<!-- <span class="clear"></span> -->
</div>
<div class="footer"></div>
</body>
</html>
原理
额外标签法在浮动元素末尾添加一个空的标签。给这个标签设置clear属性。(这个标签必须是块级元素)
clear:both的作用是不允许周围有浮动现象,所以就可以达到清除浮动的效果。
缺陷
对于比较复杂的页面就会显得结构非常的乱,不推荐使用。
3.给父级添加overflow属性
给父级添加overflow属性,将其属性值设置为hidden、auto或scroll。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>清除浮动之父元素overflow</title>
<style>
.box {
width: 800px;
border: 1px solid blue;
margin: 0 auto;
/* overflow: auto也行 */
/* 清除浮动 */
/* 外边距合并的时候我们也是通过overflow: hidden去解决的 */
overflow: hidden;
}
/* 不设置父亲高度 让子盒子去撑开父盒子 父亲高度会变成为0 影响下面的盒子 */
.damao {
width: 300px;
height: 200px;
background-color: purple;
float: left;
}
.ermao {
width: 200px;
height: 200px;
background-color: pink;
float: left;
}
.footer {
height: 200px;
background-color: black;
}
</style>
</head>
<body>
<div class="box">
<!-- 大毛和二毛的父亲是box -->
<div class="damao">大毛</div>
<div class="ermao">二毛</div>
<!-- 把浮动元素隔开 -->
<!-- <div class="clear"></div> -->
<!-- 这个新增的盒子要求必须是块级元素不能是行内元素 -->
<!-- <span class="clear"></span> -->
</div>
<div class="footer"></div>
</body>
</html>
缺陷
无法显示溢出部分
4.给父级添加after伪元素
利用after伪元素定义一个clearfix类,浮动元素的父级元素调用此类可以实现清除浮动的效果。(*zoom: 1这个属性是为了兼容低版本的浏览器)
.clearfix::after {
content: "";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
.clearfix {
/* IE6、7 专有 */
*zoom: 1;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>清除浮动之after伪元素</title>
<style>
.clearfix:after {
content: "";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
/* clearfix这个名字可以改 只是习惯用clearfix */
.clearfix {
/* IE6、7 专有 */
*zoom: 1;
}
.box {
width: 800px;
border: 1px solid blue;
margin: 0 auto;
/* overflow: auto也行 */
/* 清除浮动 */
/* 外边距合并的时候我们也是通过overflow: hidden去解决的 */
overflow: hidden;
}
/* 不设置父亲高度 让子盒子去撑开父盒子 父亲高度会变成为0 影响下面的盒子 */
.damao {
width: 300px;
height: 200px;
background-color: purple;
float: left;
}
.ermao {
width: 200px;
height: 200px;
background-color: pink;
float: left;
}
.footer {
height: 200px;
background-color: black;
}
</style>
</head>
<body>
<div class="box clearfix">
<div class="damao">大毛</div>
<div class="ermao">二毛</div>
</div>
<div class="footer"></div>
</body>
</html>
原理
与额外标签法异曲同工。利用伪类向浮动元素的父盒子后面添加一个块级元素。
缺陷
照顾低版本浏览器。
5.双伪元素
给父元素添加
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>清除浮动之双伪元素</title>
<style>
.clearfix:before,
.clearfix:after {
content: "";
/* 把模式转换成表格 */
display: table;
}
/* 清除浮动 */
.clearfix:after {
clear: both;
}
/* clearfix这个名字可以改 只是习惯用clearfix */
.clearfix {
/* IE6、7 专有 */
*zoom: 1;
}
.box {
width: 800px;
border: 1px solid blue;
margin: 0 auto;
/* overflow: auto也行 */
/* 清除浮动 */
/* 外边距合并的时候我们也是通过overflow: hidden去解决的 */
overflow: hidden;
}
/* 不设置父亲高度 让子盒子去撑开父盒子 父亲高度会变成为0 影响下面的盒子 */
.damao {
width: 300px;
height: 200px;
background-color: purple;
float: left;
}
.ermao {
width: 200px;
height: 200px;
background-color: pink;
float: left;
}
.footer {
height: 200px;
background-color: black;
}
</style>
</head>
<body>
<div class="box clearfix">
<div class="damao">大毛</div>
<div class="ermao">二毛</div>
</div>
<div class="footer"></div>
</body>
</html>