BFC 是什么?
一、定义
BFC(Block Formatting Context,块格式化上下文) 是Web页面的可视化CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。
个人理解是BFC是是个独立布局区域,换句话来说就是个大盒子(元素),每一个BFC大盒子(元素)只包含自己的子盒子(元素),不包含自己子盒子(元素)的子盒子(元素),BFC里的子盒子(元素)不会影响BFC外面的盒子(元素)。
二、触发BFC
并不是所有的元素都是BFC, 只有满足了下面的任意1个条件之后,这个盒子(元素)才成为BFC
- 根元素()
- 设置浮动,不包括none
- 设置定位,absoulte或者fixed
- 行内块显示模式,inline-block
- 设置overflow,即hidden,auto,scroll
- 表格单元格,table-cell,table-caption
- 弹性布局,flex
三、利用BFC解决问题
- 解决外边距的塌陷问题(垂直塌陷)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
.top {
width: 200px;
height: 200px;
background: orange;
margin-bottom: 100px;
}
.bottom {
width: 200px;
height: 200px;
background: pink;
margin-top: 100px;
}
/* 解决相邻两容器上下外边距会发生重叠*/
.box {
overflow: hidden;
}
</style>
</head>
<body>
<div class="top"></div>
<div class="box">
<div class="bottom"></div>
</div>
</body>
</html>
- 利用BFC解决包含塌陷
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
.box {
width: 200px;
height: 200px;
background: orange;
}
.son {
width: 200px;
height: 100px;
background: pink;
margin-top: 100px;
}
/* 解决容器内子盒子给外边距会发生子盒子和父盒子一起往下掉*/
.box {
overflow: hidden;
}
</style>
</head>
<body>
<div class="box">
<div class="son"></div>
</div>
</body>
</html>
- 当浮动产生影响的时候,可以利用BFC来清除浮动的影响
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
.box {
width: 300px;
background: orange;
}
.son {
float: left;
width: 100px;
height: 30px;
background: pink;
border: 1px solid #ccc;
}
/* 解决一个没有设置高度的父盒子,里面子盒子都浮动,父盒子失去原来高度带来的*/
.box {
overflow: hidden;
}
</style>
</head>
<body>
<div class="box">
<div class="son"></div>
<div class="son"></div>
<div class="son"></div>
<div class="son"></div>
<div class="son"></div>
</div>
</body>
</html>
- BFC可以阻止标准流元素被浮动元素覆盖
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
.top {
float: left;
width: 300px;
height: 200px;
background: orange;
}
.bottom {
height: 300px;
background: pink;
}
/* 解决上面盒子浮动,下面盒子时标准流,浮动元素覆盖了标准流元素的*/
.bottom {
overflow: hidden;
}
</style>
</head>
<body>
<div class="top"></div>
<div class="bottom"></div>
</body>
</html>
\