一、BFC

BFC (Block Formatting Context) 即块格式化上下文,它是一个独立的布局环境,其中的元素不受外界的影响。

要搞清楚 BFC 的作用,我们先来看下面几个问题。

二、margin 坍塌问题

同级元素垂直方向上的坍塌(水平方向上不会坍塌),比如:上面的元素设置了 margin-bottom,下面的元素设置了 margin-top,这种情况下,会按照较大者去显示。

来看下面这个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
<body>
<div class="test"></div>
<div class="test"></div>
</body>

.test {
width: 200px;
height: 200px;
margin: 50px;
padding: 50px;
border: 50px solid black;
background-color: brown;
}

修改代码解决问题:

1
2
3
4
5
6
7
8
9
10
.container {
overflow: hidden;
}

<div class="container">
<div class="test"></div>
</div>
<div class="container">
<div class="test"></div>
</div>

父子元素之间的坍塌,也是垂直方向上会坍塌,水平方向上不会坍塌。比如:父元素设置了 margin-top,子元素也设置了 margin-top,这种情况下,会按照较大者去显示,或者只设置子元素的 margin-top,那么父元素会随子元素一起掉下来。

例子如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
.father {
width: 300px;
height: 300px;
margin-top: 50px;
margin-left: 50px;
background-color: brown;
}
.son {
width: 100px;
height: 100px;
margin-top: 60px;
margin-left: 60px;
background-color: black;
}

<body>
<div class="father">
<div class="son"></div>
</div>
</body>

修改代码解决问题:

1
2
3
4
5
6
7
8
9
.container {
overflow: hidden;
}

<div class="father">
<div class="container">
<div class="son"></div>
</div>
</div>

三、浮动塌陷问题

元素设置了 float 之后会,会脱离文档流,原本父元素会包裹住子元素,但是子元素脱离了文档流,所以子元素就会变成未被父元素包裹的样子,父元素本应该被撑开的高度也会坍塌。

1
2
3
4
5
6
7
8
9
10
11
12
13
.container {
border: 1px solid red;
}
.test {
width: 100px;
height: 100px;
background-color: blue;
float: left;
}

<div class="container">
<div class="test"></div>
</div>

显示效果如下图所示:

修改代码解决问题:

1
2
3
4
.container {
border: 1px solid red;
+ overflow: hidden;
}

四、浮动元素覆盖问题

一个元素设置了浮动,另一个元素未设置浮动,浮动元素会覆盖未添加浮动的元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.test1 {
width: 100px;
height: 100px;
background-color: blue;
float: left;
}
.test2 {
width: 200px;
height: 200px;
background-color: red;
}

<div class="test1"></div>
<div class="test2"></div>

显示效果如下图所示:

修改代码解决问题:

1
2
3
4
5
6
.test2 {
width: 200px;
height: 200px;
background-color: red;
+ overflow: hidden;
}

五、总结

1. BFC 的作用

  • 解决 margin 塌陷问题
  • 清除浮动
  • 阻止元素被浮动元素覆盖

2. BFC 如何创建

  • 根元素(<html>
  • 浮动元素(元素的 float 不是 none)
  • 绝对定位元素(元素的 position 为 absolute 或 fixed)
  • display 为 inline-block、table-cell、table-caption、table、table-row、table-row-group、table-header-group、table-footer-group、inline-table、flow-root、flex 或 inline-flex 或 inline-grid
  • overflow 值不为 visible 的块元素
  • contain 值为 layout、content 或 paint 的元素
  • 多列容器(元素的 column-count 或 column-width 不为 auto,包括 column-count 为 1)