20190416 期
如何理解 CSS 中 BFC?
定义: 块格式化上下文(Block Formatting Context,BFC)是 Web 页面的可视化 CSS 渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。
BFC 特性及应用
同一个 BFC 下外边距会发生折叠
代码理解
<style>
div{
width: 100px;
height: 100px;
background: red;
margin: 100px;
}
</style>
// 两个 div 元素都处于同一个 BFC 容器下 (这里指 body 元素) 所以第一个 div 的下边距和第二个 div 的上边距发生了重叠,两个盒子之间距离只有 100px,而不是 200px
<body>
<div></div>
<div></div>
</body>
// 这不是 CSS 的 bug,我们可以理解为一种规范,如果想要避免外边距的重叠,可以将其放在不同的 BFC 容器中
BFC 可以包含浮动的元素(清除浮动)
我们都知道,浮动的元素会脱离普通文档流,来看下下面一个例子
// 由于容器内元素浮动,脱离了文档流,所以容器只剩下 2px 的边距高度。如果使触发容器的 BFC,那么容器将会包裹着浮动元素
<div style=”border: 1px solid #000;”>
<div style=”width: 100px;height: 100px;background: red;float: left;”></div>
</div>
// 下面我们将其清除浮动触发 BFC, 将可包裹浮动元素
<div style=”border: 1px solid #000;overflow:hidden”>
<div style=”width: 100px;height: 100px;background: red;float: left;”></div>
</div>
BFC 可以阻止元素被浮动元素覆盖
这里有一个经典的 css 布局试题 (两列自适应布局) 就是应用的 BFC 特性
<div style=”float:left; width:200px; background:blue”>left</div>
<div style=”height:100%; background: red”>right</div>
触发 BFC
下列方式会触发 BFC(摘抄自 MDN)
根元素或包含根元素的元素
浮动元素(元素的 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 的元素
contain 值为 layout、content 或 strict 的元素
弹性元素(display 为 flex 或 inline-flex 元素的直接子元素)
网格元素(display 为 grid 或 inline-grid 元素的直接子元素)
多列容器(元素的 column-count 或 column-width 不为 auto,包括 column-count 为 1)
column-span 为 all 的元素始终会创建一个新的 BFC,即使该元素没有包裹在一个多列容器中
总结
BFC 概念很多同学都没有什么概念,不知道为什么需要清除浮动,margin 重叠等等系列骚操作, 看完这篇我想应该有个大概了
再来回顾一个 BFC 的特性
同一个 BFC 下外边距会发生折叠
BFC 可以阻止元素被浮动元素覆盖
BFC 可以包含浮动的元素(清除浮动)
关于 JS 每日一题
JS 每日一题可以看成是一个语音答题社区 每天利用碎片时间采用 60 秒内的语音形式来完成当天的考题 群主在次日 0 点推送当天的参考答案
注 绝不仅限于完成当天任务,更多是查漏补缺,学习群内其它同学优秀的答题思路
点击加入答题