一、什么是高度塌陷?
一般情况下,父元素的高度不会写固定值,而是让他被元素撑开,随着元素的高度变化而变化。高度塌陷就是我们给子元素设置浮动,让子元素脱离文档流,不能再撑开父元素高度。从而导致我们父元素高度丢失,从而导致高度塌陷。
二、解决方案
可以给父元素设定固定高度
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<style type="text/css">
.outer {
height: 100px;
border: 10px red solid;
}
.inner {
width: 100px;
height: 100px;
background-color: blue;
float: left;
}
.box3 {
height: 100px;
background-color: yellow;
}
</style>
</head>
<body>
<div class="outer">
<div class="inner"></div>
</div>
<div class="box3"></div>
</body>
</html>

开启BFC属性元素,元素会变成一个独立的布局区域不会在布局上影响到外面的元素(BFC理解为一一个封闭的大箱子,箱子的内部不会影响到外部)
可以直接在高度塌陷的父元素的最后,添加一个空白的div。由于这个div并没有浮动,所以他是可以撑开父元素的高度的,然后在对其进行清除浮动,这样可以通过这个空白的div来撑开父元素的高度,基本没有副作用。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title></title>
<style type="text/css">
.box1 {
border: 10px solid red;
}
.box2 {
width: 100px;
height: 100px;
background-color: blue;
float: left;
}
.box3{
clear: both;
}
</style>
</head>
<body>
<div class="box1">
<div class="box2">box2</div>
<div class="box3"></div>
</div>
</body>
</html>
<--使用这种方式虽然可以解决问题,但是会在页面中添加多余的结构。-->

可以通过after伪类向元素的后面添加一个空白的块元素,然后对其清除浮动,这样做不仅和添加一个div的原理一样,也可以达到一个相同的效果,而且不会在页面中添加多余的div。这是我们最推荐使用的方式,几乎没有副作用。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title></title>
<style type="text/css">
.box1 {
border: 10px solid red;
}
.box2 {
width: 100px;
height: 100px;
background-color: blue;
float: left;
}
.box1::after{
content: '';
display: table;
clear: both;
}
</style>
</head>
<body>
<div class="box1">
<div class="box2"></div>
</div>
</body>
</html>

三、什么是BFC属性
页面元素中的隐含属性:块格式化上下文(Block Formatting Context) ,简称BFC。相当于把元素单独隔开成为一个独立区块,不影响其他元素。
四、开启BFC元素有什么作用呢?
开启BFC的元素不会被浮动元素所覆盖
父元素的垂直外边距不会被浮动元素所覆盖(可以解决父子外边距问题)
开启BFC的元素可以包裹住浮动的元素(可以解决高度塌陷的问题)
五、如何开启BFC呢?
设置元素浮动
float:left;
float:right;
将元素转为行内块元素(这种方法会导致宽度失去而且有三像素问题)
display:inline-block;
用overflow样式,不取visiable值。scroll、auto、与hidden可以取scroll与auto需要考虑隐藏滚动条的问题。
overflow: hidden;
overflow: scoll;
overflow: auto;
设置绝对定位
position: absolute;
六、清除浮动
clear:none;默认样式,不清除浮动
clear:left;清除左侧浮动对元素的影响
clear:right;清除右侧浮动对元素的影响
clear:both;清除俩侧浮动/对其影响较大的一边