# 什么是BFC
全称:Block Formatting Context, 名为 "块级格式化上下文"。 W3C官方解释为: BFC它决定了元素如何对其内容进行定位,以及与其它元素的关系和相互作用 BFC是一个完全独立的元素空间,其空间的子元素不会影响外面的布局
# BFC的触发条件
- position为fixed,absolute
- display值为 inline-block、table-cell、table-caption、table、inline-table、flex、inline-flex、- - grid、inline-grid
- overflow为hidden,auto,scroll,不为visible
- 设置浮动,设置float为left,right
# BFC的规则
- 内部的Box会在垂直方向一个接一个的排列
- 垂直方向的距离由margin决定, 属于同一个BFC的两个相邻的标签外边距会发生重叠,不同BFC不会发生折叠
- BFC不会与float元素发生重叠
- 计算BFC高度时,浮动元素也参与计算
# BFC解决问题
# 利用BFC清除浮动
<div class='father'>
<div class='kid kid1'></div>
<div class='kid kid2'></div>
</div>
<style>
.father{
background: #ccc;
}
.kid{
margin:100px;
width: 100px;
height: 100px;
background-color: red;
float:left;
}
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
根据规则第4点,可以设置父元素为BFC元素,设置overflow,display都可,也就是清楚浮动
.father{
overflow:hidden;
/* display:inline-block; */
}
1
2
3
4
2
3
4
# 解决margin边距重叠
<div class='father'>
<div class='kid kid1'></div>
<div class='kid kid2'></div>
</div>
<style>
.father{
background: #ccc;
}
.kid{
margin:100px;
width: 100px;
height: 100px;
background-color: red;
}
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
由上面可知,两个kid盒子的margin发生了重叠,为10px,而不是相加的20px,那么利用规则第2点,使两个BFC盒子成为不同的BFC
.kid2 {
display: inline-block;
}
1
2
3
2
3
# 实现两栏布局
<div class="outer">
<div class="left">左侧</div>
<div class="right">右侧</div>
</div>
<style>
.outer {
height: 100px;
}
.left {
float: left;
width: 200px;
height: 100%;
background: lightcoral;
}
.right {
overflow: auto;
height: 100%;
background: lightseagreen;
}
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
利用浮动,左边元素宽度固定,设置向左浮动。右侧元素设置 overflow: hidden;这样右边就触发了 BFC ,BFC 的区域不会与浮动元素发生重叠,所以两侧就不会发生重叠。
← js面试题 实现水平垂直居中的布局 →