BFC是什么? 能解决什么问题?

BFC是什么?能解决什么问题?

1.什么是BFC?

W3C对BFC的定义如下:浮动元素和绝对定位元素,非块级盒子的块级容器(例如 inline-blocks, table-cells, 和 table-captions),以及overflow值不为”visiable”的块级盒子,都会为他们的内容创建新的BFC(Block Fromatting Context, 即块级格式上下文)。

2.BFC的触发条件

  • 满足以下任意一个或多个条件,即可触发BFC:

  • 根元素(html)

  • 浮动元素(float不为none)

  • position为absolute或fixed的定位元素

  • 行内块元素(display:inline-block)

  • display值为table-cell或table-caption的元素

  • overflow的值不为visible的块级元素

  • 网格元素(display为grid或inline-grid)

3.BFC渲染规则

  1. BFC垂直方向边距重叠

  2. BFC的区域不会与浮动元素的box重叠

  3. BFC是一个独立的容器,外面的元素不会影响里面的元素

  4. 计算BFC高度的时候浮动元素也会参与计算

4.能解决的问题

1.防止浮动导致父元素高度塌陷

现有如下页面代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
.container {
border: 10px solid red;
}
.inner {
background: #08BDEB;
height: 100px;
width: 100px;
}
</style>
</head>
<body>
<div class="container">
<div class="inner"></div>
</div>
</body>
</html>

avatar

如果将inner元素设为浮动:

1
2
3
4
5
6
.inner {
float: left;
background: #08BDEB;
height: 100px;
width: 100px;
}

就会产生塌陷:

avatar

但我们对父元素设置BFC之后,这样的问题就解决了:

1
2
3
4
.container {
border: 10px solid red;
overflow: hidden;
}
2.避免外边距合并

两个块同一个BFC会造成外边距合并,但如果对这两个块分别设置BFC,那么边距重叠的问题就不存在了。

现有代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
.container {
background-color: green;
overflow: hidden;
}

.inner {
background-color: lightblue;
margin: 10px 0;
}
</style>
</head>

<body>
<div class="container">
<div class="inner">1</div>
<div class="inner">2</div>
<div class="inner">3</div>
</div>
</body>

</html>

avatar

按照我们的设置,中间的inner与第一个和第三个inner之间的间距应为20px,由于这三个元素同属于一个BFC,导致它们的外边距合并了,三个元素的上下间距都是10px。现在我们做如下操作:

1
2
3
4
5
6
7
<div class="container">
<div class="inner">1</div>
<div class="bfc">
<div class="inner">2</div>
</div>
<div class="inner">3</div>
</div>

style:

1
2
3
.bfc{
overflow: hidden;
}

效果如下:

avatar

问题就解决了。