CSS BFC
原文:
深入理解 BFC; - 页面内可演示
BFC的概念以及通俗理解
通俗理解:BFC就是css布局的一个概念,是一块区域,一个环境。可以简单的理解为某个元素的一个 CSS 属性,只不过这个属性不能被开发者显式的修改,拥有这个属性的元素对内部元素和外部元素会表现出一些特性,这就是 BFC。
较官方概念:块级格式化上下文。它是一个独立的渲染区域,只有 Block-level box 参与(在下面有解释), 它规定了内部的 Block-level Box 如何布局,并且与这个区域外部毫不相干。
我们常说的文档流其实分为定位流、浮动流和普通流三种。而普通流其实就是指 BFC 中的 FC - formatting 。是页面中的一块渲染区域,有一套渲染规则,决定了其子元素如何布局,以及和其他元素之间的关系和作用。
常见的 FC 有 BFC、IFC(行级格式化上下文)、GFC(网格布局格式化上下文)和FFC(自适应格式化上下文)。
BFC 的触发条件:
下列条件只需满足其一即可:
【1】根元素,即HTML元素;
【2】float的值不为none;
【3】overflow的值不为visible;
【4】display的值为inline-block、table-cell、table-caption;
【5】position的值为absolute或fixed;
BFC 触发后的布局规则:
1.内部的Box会在垂直方向,一个接一个地放置。
2.Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠。
3.每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
4.BFC的区域不会与float box重叠。
5.BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
6.计算BFC的高度时,浮动元素也参与计算。
BFC 的常见应用:
除了耳熟能详的清除内部浮动外,还能进行页面布局、阻止某些情况下发生的 margin 重叠等等,下面依次根据布局规则进行解释。
规则1:就是我们平常div一行一行块级放置的样式,不多说;
规则2:同一个BFC的两个相邻Box的margin会发生重叠,见下例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | // html <div class = "aside" ></div> <div class = "text" > <div class = "main" ></div> </div> // css .aside { margin-bottom: 100px; width: 100px; height: 150px; background-color: #f66; } .text { overflow: hidden; } .main { background-color: #fcc; margin-top: 100px; height: 200px; } |
在按照如上写法, .aside 与 .main 之间的空白区域高度是 200px,而把 .text 的样式注释掉,空白区域变成 100px,见下图;
规则3:左浮是子div的左边接触父 div 的 borderbox 的左边,右浮是子 div 接触父 div 的 borderbox 右边,除非设置margin来撑开距离,否则一直是这个规则。见下例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // html <div class = "par" > <div class = "child" ></div> <div class = "child" ></div> </div> // css .par { width: 300px; border: 10px solid #fcc; overflow: hidden; } .child { float: left; width: 100px; height: 100px; border: 10px solid #f66; } |
因此,通常使用的 overflow: hidden; 方法来清除浮动就是利用的 BFC 的触发条件 3 来实现的。
规则4:BFC的区域不会与float box重叠:首先看下例子 - 自适应两栏布局:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | // html <div class = "aside" ></div> <div class = "text" > <div class = "main" ></div> </div> // css .aside { width: 100px; height: 150px; float: left; background: #f66; } .text { width: 500px; } .main { height: 200px; /* 触发 .main 盒子的 BFC 规则 */ overflow: hidden; background: #fcc; } |
上面盒子 .aside 左浮动,因此 .main 盒子在没有触发 BFC 的情况下会被覆盖。而后来 .main 盒子触发 BFC ,根据规则 4 ,就会显示成两栏布局的样子。
附上一个关于 float 的案例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | // html <div class = "par" > <div class = "child" ></div> <div class = "child0" >123</div> </div> // css .par { width: 200px; border: 10px solid #fcc; } .child { float: left; width: 100px; height: 100px; border: 3px solid #f66; } .child + div { border: 3px solid #000; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码