BFC(Block Formatting Context,块级格式化上下文)是 CSS 中一个重要的概念,它决定了元素如何对其内容进行布局,以及与其他元素的关系和相互作用。简单来说,BFC 是一个独立的渲染区域,内部元素的布局不会影响外部的元素,反之亦然。
BFC 的布局规则
- 内部的块级盒子会在垂直方向一个接一个地放置。
- 属于同一个 BFC 的两个相邻块级盒子的上下外边距会发生折叠(margin collapse)。
- BFC 的区域不会与浮动盒子重叠。
- 计算 BFC 的高度时,浮动元素也参与计算(即 BFC 可以清除内部浮动)。
- BFC 是一个独立的容器,内部元素不会影响外部的元素。
通俗来说
你可以把BFC想象成一个独立的“小房间” 。
在这个房间里,CSS的摆放规则自己说了算,房间里的人和家具怎么摆,都不会影响到房间外面;同样,外面的人怎么摆,也干扰不到房间里面。
- “房间里的东西都是竖着排队的”
这个房间里的所有块级元素(比如div),都会从上到下一个挨一个竖着放,就像排队买东西一样,不会横着挤。 - “同一个房间里,上下两个人打招呼(margin)可能被合并”
如果房间里有两个人(两个块级元素)上下紧挨着,他们都对外宣称“我离别人要留20px的距离”(margin-bottom和margin-top),那实际两个人之间的距离不是20+20=40px,而是取最大值20px(如果都是20px就是20px)。这叫“边距折叠”,只有同一个BFC里的兄弟才会这样。 - “我的房间不会和隔壁的浮动杂物重叠”
如果房间外面有个浮动的东西(比如一张浮动的图片),我这个BFC房间会很“有骨气”,坚决不让它挡我的道——我会自动避开它,不会和它重叠,老老实实占剩下的空间。所以可以用来做两列布局。 - “算房间高度时,飘起来的家具也算在内”
如果房间里有家具设置了浮动(float),就像气球飘起来了,普通房间可能就忽略了它们,导致房间看起来没撑开(高度塌陷)。但BFC这个房间很负责,算高度时会把这些浮动的家具也算进去,把房间撑起来,确保它们被包住。 - “这个房间是完全独立的”
房间内部怎么布置、怎么挤,都不会影响到外面;外面怎么乱,也干扰不到里面。内外互不影响,自成一个小天地。
创建 BFC 的常见方法
-
根元素(
<html>)本身就是一个 BFC。 -
浮动元素:
float不为none(如left、right)。 -
绝对定位元素:
position为absolute或fixed。 -
display为以下值:inline-blocktable-cell(表格单元格)table-caption(表格标题)flex或inline-flex(弹性布局)grid或inline-grid(网格布局)flow-root(专门创建无副作用的 BFC)
-
overflow不为visible:如hidden、auto、scroll。 -
contain为layout、content或paint等也会创建新的格式化上下文。
BFC 的应用场景
-
清除内部浮动
当父元素包含浮动子元素时,父元素高度可能塌陷。通过触发父元素的 BFC(如设置overflow: hidden),可以让父元素包裹浮动子元素,高度自适应。css
.parent { overflow: hidden; /* 触发 BFC */ } -
防止外边距折叠
相邻块级元素的上下外边距会合并,取两者最大值。通过将其中一个元素放入新的 BFC 中,可以阻止外边距折叠。html
<div class="bfc-container"> <div class="box">上边距</div> </div> <div class="box">下边距</div> -
实现自适应两列布局
利用 BFC 不会与浮动元素重叠的特性,可以实现一列固定宽度浮动,另一列自适应宽度。css
.left { float: left; width: 200px; } .right { overflow: hidden; /* 触发 BFC,避免与左侧重叠 */ } -
防止文字环绕
浮动元素旁边的文本可能会环绕,给文本所在的容器触发 BFC 可阻止环绕。css
.text { overflow: hidden; /* 触发 BFC,不与浮动重叠 */ } -
实现更复杂的布局
利用display: flex或grid创建的 BFC 可以方便地进行现代布局。
总结
BFC 是 CSS 布局中一个强大的工具,理解它的特性可以帮助我们解决许多常见的布局问题,如浮动塌陷、外边距折叠等。创建 BFC 的方式多样,根据实际需求选择最合适的方法即可。display: flow-root 是目前最专门用于创建 BFC 且无副作用的属性,推荐在需要清除浮动等场景中使用。