BFC 全称:Block Formatting Context, 名为 “块级格式化上下文”。
在一个Web页面的CSS渲染中,BFC是按照块级盒子布局的。
简单来说就是,BFC是一个完全独立的空间(布局环境),让空间里的子元素不会影响到外面的布局。
怎样触发BFC
则满足下列的任意一个或多个条件即可:
1、浮动元素,float 除 none 以外的值;
2、绝对定位元素,position(absolute,fixed);
3、display的值是inline-block、table-cell、flex、table-caption或者inline-flex
4、overflow 除了 visible 以外的值(hidden,auto,scroll);
5、body 根元素
BFC的特性
1、内部的Box会在垂直方向上一个接一个的放置。
2、垂直方向上的距离由margin决定
3、bfc的区域不会与float的元素区域重叠。
4、计算bfc的高度时,浮动元素也参与计算
5、bfc就是页面上的一个独立容器,容器里面的子元素不会影响外面元素。
常见应用场景
BFC 的特性不是背的,真正有用的是它解决的几个经典布局问题:
1. 清除浮动(解决父元素高度塌陷)
父元素里的子元素都浮动后,父元素高度会塌成 0(特性 4 的反面)。给父元素触发 BFC(如 overflow: hidden),浮动子元素就会参与高度计算:
.parent {
overflow: hidden; /* 触发 BFC,父元素重新包住浮动子元素 */
}
2. 防止垂直 margin 塌陷
相邻块级元素的上下 margin 会”取最大值”而非相加(margin 折叠)。把其中一个包进 BFC 容器,它们就互不影响了:
.box {
overflow: hidden; /* 内部 margin 不再和外面的 margin 折叠 */
}
3. 自适应两栏布局(阻止与浮动重叠)
左栏浮动、右栏不浮动时,右栏会因”BFC 区域不与 float 重叠”而被左栏挤开,实现自适应:
.aside {
float: left;
width: 200px;
}
.main {
overflow: hidden; /* 触发 BFC,自动占满剩余宽度,不与左栏重叠 */
}
小结:遇到”浮动塌陷 / margin 重叠 / 两栏被挤”这类问题,优先想想能不能用 BFC 隔离解决。