为什么要清除浮动?
清除·浮动主要是为了清除浮动元素造成的影响,使浮动元素不会影响其后元素的布局
- 防止父元素高度塌陷:当元素浮动后,它会脱离一个标准文档流,不再占用原先的布局空间。如果一个父元素内只有浮动元素,那么该父元素的高度会塌陷为0。清除浮动可以解决这个问题,使父元素根据浮动元素的高度自动扩展高度。
- 防止浮动元素覆盖后续元素:当元素浮动后,后续元素会忽略它并填补其原先的空间。这可能导致浮动元素覆盖后续元素,影响页面布局。清除浮动可以解决这个问题,保证浮动元素不会影响后续元素的布局。
- 方便给浮动元素添加边距:当元素浮动后,它的外边距不会影响其后元素的布局。如果不清除浮动,添加边距只会使浮动元素覆盖更大的区域,而不会真正创建边距空间。清除浮动可以使外边距生效,真正产生边距效果。
- 使浮动布局更加可控:通过清除浮动,可以很好地解决浮动布局带来的各种问题,使浮动元素不会对布局产生意想不到的影响。这使得浮动布局变得更加可控。
清除浮动有哪几种方式?
- 清除浮动元素后的第一个块级元素添加clear属性,值为浮动方向(left、right、both)。这会强制该元素不允许浮动元素影响其布局。
- 父元素添加overflow属性,值为hidden或auto。这会创建一个BFC(块级格式化上下文),内部的浮动元素不会影响外部元素。
- 父元素添加after伪元素,并设置clear属性。这会向父元素添加一个清除浮动的元素。
- 父元素手动添加高度(不推荐)
演示
1.(1)因为浮动,p元素和两个child元素仿佛同在第一行
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#main {
width: 500px;
height: 300px;
background: #cccccc;
}
#child1 {
width: 100px;
height: 100px;
background: #f000f0;
/* 脱离文档流,空间释放 */
float: right;
}
#child2 {
width: 100px;
height: 100px;
background: #0000ff;
float: right;
}
p {
background: yellow;
}
</style>
</head>
<body>
<div id="main">
<div id="child1"></div>
<div id="child2"></div>
<p>我是p元素</p>
</div>
</body>
</html>
(2)p元素添加clear属性
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#main {
width: 500px;
height: 300px;
background: #cccccc;
}
#child1 {
width: 100px;
height: 100px;
background: #f000f0;
/* 脱离文档流,空间释放 */
float: right;
}
#child2 {
width: 100px;
height: 100px;
background: #0000ff;
float: right;
}
p {
background: yellow;
/* 为块级元素添加clear属性 */
clear: right;
}
</style>
</head>
<body>
<div id="main">
<div id="child1"></div>
<div id="child2"></div>
<p>我是p元素</p>
</div>
</body>
</html>
2.(1)父元素高度塌陷
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#main {
width: 500px;
/* height: 300px; */
background: #cccccc;
}
#child1 {
width: 100px;
height: 100px;
background: #f000f0;
/* 脱离文档流,空间释放 */
float: right;
}
#child2 {
width: 100px;
height: 100px;
background: #0000ff;
float: right;
}
p {
background: yellow;
/* 为块级元素添加clear属性 */
clear: right;
}
</style>
</head>
<body>
<div id="main">
<div id="child1"></div>
<div id="child2"></div>
<!-- <p>我是p元素</p> -->
</div>
</body>
</html>
(2)解决方式
- 方式一:清除浮动元素后的第一个块级元素添加clear属性,值为浮动方向
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#main {
width: 500px;
/* height: 300px; */
background: #cccccc;
}
#child1 {
width: 100px;
height: 100px;
background: #f000f0;
/* 脱离文档流,空间释放 */
float: right;
}
#child2 {
width: 100px;
height: 100px;
background: #0000ff;
float: right;
}
p {
background: yellow;
/* 为块级元素添加clear属性 */
clear: right;
}
.clear {
clear: both;
}
</style>
</head>
<body>
<div id="main">
<div id="child1"></div>
<div id="child2"></div>
<!-- <p>我是p元素</p> -->
<div class="clear"></div>
</div>
</body>
</html>
- 方式二:父元素添加after伪元素,并设置clear属性
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#main {
width: 500px;
/* height: 300px; */
background: #cccccc;
}
#child1 {
width: 100px;
height: 100px;
background: #f000f0;
/* 脱离文档流,空间释放 */
float: right;
}
#child2 {
width: 100px;
height: 100px;
background: #0000ff;
float: right;
}
p {
background: yellow;
/* 为块级元素添加clear属性 */
clear: right;
}
/* .clear {
clear: both;
} */
/* 伪元素默认是行元素 */
#main::after {
content: "";
/* block clear:both才会生效 */
display: block;
clear: both;
}
</style>
</head>
<body>
<div id="main">
<div id="child1"></div>
<div id="child2"></div>
<!-- <p>我是p元素</p> -->
<div class="clear"></div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#main {
width: 500px;
/* height: 300px; */
background: #cccccc;
}
#child1 {
width: 100px;
height: 100px;
background: #f000f0;
/* 脱离文档流,空间释放 */
float: right;
}
#child2 {
width: 100px;
height: 100px;
background: #0000ff;
float: right;
}
p {
background: yellow;
/* 为块级元素添加clear属性 */
clear: right;
}
/* .clear {
clear: both;
} */
/* 伪元素默认是行元素 */
#main::after {
content: "";
/* block clear:both才会生效 */
display: block;
clear: both;
}
#main2 {
background: #000000;
}
</style>
</head>
<body>
<div id="main">
<div id="child1"></div>
<div id="child2"></div>
</div>
<div id="main2">
<div id="child1"></div>
<div id="child2"></div>
</div>
</body>
</html>
父元素添加overflow属性
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#main {
width: 500px;
/* height: 300px; */
background: #cccccc;
}
#child1 {
width: 100px;
height: 100px;
background: #f000f0;
/* 脱离文档流,空间释放 */
float: right;
}
#child2 {
width: 100px;
height: 100px;
background: #0000ff;
float: right;
}
p {
background: yellow;
/* 为块级元素添加clear属性 */
clear: right;
}
/* .clear {
clear: both;
} */
/* 伪元素默认是行元素 */
#main::after {
content: "";
/* block clear:both才会生效 */
display: block;
clear: both;
}
#main2 {
background: #000000;
overflow: hidden;
}
</style>
</head>
<body>
<div id="main">
<div id="child1"></div>
<div id="child2"></div>
</div>
<div id="main2">
<div id="child1"></div>
<div id="child2"></div>
</div>
</body>
</html>