块格式化上下文(Block Formatting Context,BFC) 是Web页面的可视化CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其余元素交互的区域。 —— 来自MDN
下列方式会建立 块格式化上下文:
<html>
)float
不是 none
)position
为 absolute
或 fixed
)display
为 inline-block
)display
为 table-cell
,HTML表格单元格默认为该值)display
为 table-caption
,HTML表格标题默认为该值)display
为 table、
`table-row、
table-row-group、table-header-group、
table-footer-group(分别是HTML table、row、tbody、thead、tfoot的默认属性)或
inline-table`)overflow
值不为 visible
的块元素display
值为 flow-root
的元素 , 能够建立无反作用的BFC(火狐53+,chrome58+,opera45+支持)contain
值为 layout
、content
或 paint 的元素display
为 flex
或 inline-flex
元素的直接子元素)display
为 grid
或 inline-grid
元素的直接子元素)column-count
或 column-width
不为 auto,包括
`column-count 为
1`)column-span
为 all
的元素始终会建立一个新的BFC,即便该元素没有包裹在一个多列容器中(标准变动,Chrome bug)。清除浮动css
css
html
.box { border: 1px solid #f00; // 触发BFC, 如下任意一种 overflow: hidden; /* overflow: auto; */ /* position: absolute; */ /* position: fixed; */ /* display: table; */ /* display: flex; */ } .fl { float: left; width: 50px; height: 50px; background: #0f0; margin: 5px; }
html
git
<div class="box"> <div class="fl"></div> <div class="fl"></div> <div class="fl"></div> </div>
效果展现
解决外边距塌陷github
建立新的BFC避免两个相邻
<div>
之间的
外边距合并 问题
下面代码:chrome
三个p标签,距离上方15px, 下方20px
p { margin: 15px auto 20px; background: #f00; }
html
ide
<div class="bfc-container"> <p>1</p> <p>2</p> <p>3</p> </div>
效果展现
)布局
两个p标签之间的高度为20px, 并非 20+15 = 45 px, 这就是边距重叠,选择最大的一个边距,及20px
解决方法就是给p标签一个父元素,并建立BFCflex
css
ui
p { margin: 15px auto 20px; background: #f00; }
html
spa
<p>1</p> <div style="overflow: hidden;"> <p>2</p> </div> <p>3</p>
这时候,中间的元素边距不会发生重叠,此时的间距就是 45px
你们能够去尝试一下
参考文档: