CSS BFC 块级格式化上下文
我理解的 BFC(块级格式化上下文)就是一个块级盒子,当它通过一定的方式成为一个 BFC 之后,其内部将作为一个独立的空间布局环境。
根据 MDN 上的描述下列的方式会创建格式化上下文:
- 根元素(<html>)
- 浮动元素(元素的
float
不是none) - 绝对定位元素(元素的
position
为absolute
或fixed
) - 行内块元素(元素的
display
为inline-block
) - 弹性元素(
display
为flex
或inline-flex
元素的直接子元素) - 网格元素(
display
为grid
或inline-grid
元素的直接子元素) overflow
计算值不为visible
的块元素display
值为flow-root
的元素- 表格单元格(元素的
display
为table-cell
,HTML 表格单元格td
、th
默认为该值) - 表格标题(元素的
display
为table-caption
,HTML 表格标题caption
默认为该值)
- 匿名表格单元格元素,元素的
display
为table
、table-row
、table-row-group
、table-header-group
、table-footer-group
,分别是 HTMLtable
、tr
、tbody
、thead
、tfoot
的默认属性或inline-table
contain
值为layout
、content
或paint
的元素- 多列容器(元素的
column-count
或column-width
不为auto
,包括column-count
为1) column-span
为all
的元素始终会创建一个新的 BFC,即使该元素没有包裹在一个多列容器中
接下来我们看几个关于应用 BFC 的实际例子来加深对它的理解:
1.解决外边距重叠
正常布局中,两个块级盒子垂直排列时两者的外边距会发生重叠,没有内容将父元素与子元素隔开时两者的外边距会发生重叠,空的块级元素上下外边距会发生折叠。
<div class="container">
<p>Sibling 1</p>
<p>Sibling 2</p>
<p>Sibling 3</p>
</div>
.container {
background-color: #909399;
overflow: hidden;
}
p {
background-color: #409eff;
margin: 10px 0;
}
上面的代码中给
p
标签设置的外边距将会发生折叠:
现在修改第三个元素使它创建一个新的 BFC:
<div class="container">
<p>Sibling 1</p>
<p>Sibling 2</p>
<!-- 创建 BFC -->
<div style="overflow:hidden;">
<p>Sibling 3</p>
</div>
</div>
2.避免文字环绕
<div class="container">
<div></div>
<p>My bottomm argin collapses with my parent yielding abot tom argin of</p>
</div>
.container {
width: 200px;
height: 100px;
background-color: #909399;
}
div {
width: 30px;
height: 39px;
margin-right: 10px;
background-color: #409eff;
float: left;
}
p {
width: 200px;
margin: 0;
color: #fff;
}
现在改变p
标签的样式创建一个新的 BFC:
p {
width: 160px;
margin: 0;
color: #fff;
/*创建 BFC*/
overflow: hidden;
}
3.包含浮动
浮动元素会脱离正常文档流,如果一个没有高度的父元素的子元素是浮动元素,则父元素的高度不会被撑开:
<div class="container">
<div>Sibling 1</div>
<div>Sibling 2</div>
</div>
.container {
width: 200px;
background-color: #909399;
border: 1px solid #000;
}
.container div {
width: 80px;
height: 80px;
margin: 10px;
background-color: #409eff;
color: #fff;
float: left;
}
现在改变父元素的属性创建一个新的 BFC:
.container {
width: 200px;
background-color: #909399;
border: 1px solid #000;
/*创建 BFC*/
overflow: hidden;
}
父元素会将浮动元素包裹进去。
参考文章
1.什么是BFC