002 BFC
CENSWIN 2/18/2022 CSS
# BFC
BFC 全称:Block Formatting Context (块级格式化上下文)
最简单的解释是 BFC 是一个独立空间,空间内的子元素不会影响外部布局
# 触发条件
- 根元素(
<html>) - 浮动元素(元素的
float(opens new window) 不是none) - 绝对定位元素(元素的
position(opens new window) 为absolute或fixed) - 行内块元素(元素的
display(opens new window) 为inline-block) - 表格单元格(元素的
display(opens new window) 为table-cell,HTML表格单元格默认为该值) - 表格标题(元素的
display(opens new window) 为table-caption,HTML表格标题默认为该值) - 匿名表格单元格元素(元素的
display(opens new window) 为table、``table-row、table-row-group、``table-header-group、``table-footer-group(分别是HTML table、row、tbody、thead、tfoot 的默认属性)或inline-table) overflow(opens new window) 计算值(Computed)不为visible的块元素display(opens new window) 值为flow-root的元素contain(opens new window) 值为layout、content或 paint 的元素- 弹性元素(
display(opens new window) 为flex或inline-flex元素的直接子元素) - 网格元素(
display(opens new window) 为grid或inline-grid元素的直接子元素) - 多列容器(元素的
column-count(opens new window) 或column-width(en-US) (opens new window) 不为auto,包括 ``column-count为1) column-span为all的元素始终会创建一个新的BFC,即使该元素没有包裹在一个多列容器中(标准变更 (opens new window),Chrome bug (opens new window))。
# 渲染规则
- BFC 是一个块级元素,块级元素会在垂直方向一个接一个排列
- BFC 是一个独立的容器,容器内的元素不会影响外部元素
- 属于同一个 BFC 的两个相邻的标签外边距会发生重叠
- 计算BFC高度的时候浮动元素也会参与计算
# 应用
触发BFC解决高度塌陷
<style> .container { border: 10px solid red; } .inner { background: #08BDEB; height: 100px; width: 100px; float: left; } </style> <div class="container"> <div class="inner"></div> </div>1
2
3
4
5
6
7
8
9
10
11
12
13
14此时
inner产生 BFC 独立空间,不影响外部空间导致container高度塌陷,通过使用overflow触发父级 BFC 解决问题,或者通过display: flow-root创建无副作用的 BFC.container { border: 10px solid red; overflow: hidden; /* display: flow-root; */ }1
2
3
4
5-
MDN 解释为: 块的
margin-top和margin-bottom有时折叠为单个边距,其大小取两者最大值,相同则取其中一个,这种行为成为边距折叠<style> .container { background-color: green; overflow: hidden; } .inner { background-color: lightblue; margin: 10px 0; } </style> <body> <div class="container"> <div class="inner">1</div> <div class="inner">2</div> <div class="inner">3</div> </div> </body>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
此时因为三个元素同属于一个BFC所以三个元素的上下间隔都是10px,为了解决此问题可以使用
BFC规则(为元素包裹一个盒子形成一个完全独立的空间,做到里面元素不受外面布局影响),或者简单粗暴方法一个设置margin,一个设置padding<style> .bfc{ overflow: hidden; } </style> <div class="container"> <div class="inner">1</div> <div class="bfc"> <div class="inner">2</div> </div> <div class="inner">3</div> </div>1
2
3
4
5
6
7
8
9
10
11
12
-