当前位置:网站首页>BFC详解(Block Formmating Context)
BFC详解(Block Formmating Context)
2022-08-05 05:14:00 【汪鸿的好朋友】
BFC 是一个页面的渲染区域的一部分,它是默认布局模式:标准文档流 (Normal Flow) 的活动区域 和 浮动元素的活动区域。
我们可以将网页的渲染看成一颗 BFC 树(便于理解),这颗树的根元素就是 <html> ,在这颗树下,有很多其他的子 BFC 以及 其他布局模式的节点,如 FFC , GFC 和 Table 等。

1. 产生BFC的途径
<html>标签也就是整个网页本身就是一个最大的 BFC。*float浮动一个元素会使其脱离标准文档流,这个浮动元素就成了一个单独的 BFC。* 定位对一个元素进行绝对定位 (postion: absolute) 和固定定位 (position: fixed) 会使其变成一个BFC。*display通过display改变一个元素的内部布局模式,比如:*display: flow-root,推荐使用这种方式,因为这种方式的目的就是为了产生一个 BFC,而其他方式产生的 BFC 是为了实现其他特定目标而顺带的产生一个 BFC*display: inline-block与上一条基本等价,因为其全写为:display: inline flow-root*display: talbe等与表格布局模式相关的值。overflow只要overflow的值不是visible和clip,都会产生 BFC。* Flex item,弹性盒的子元素,也就是说对一个盒子使用display: flex,那么它的子元素都会自动成为一个 BFC。* Grid item,栅格盒的子元素,也就是说对一个盒子使用display: grid,那么它的子元素都会自动成为一个 BFC。* 多列布局,比如对一个元素设置column-count或column-wdith(只要这个值不是auto),这个元素也会成为一个 BFC。*column-span: all也会产生一个 BFC。2. 类似BFC但不是BFC的情况
网上有一些文章会说 Flex 和 Grid 也会产生 BFC,其实这是个错误的说法。
因为 Flex 和 Grid 产生的是一个 Flex/Grid formatting context,这个 FFC/GFC 与 BFC 很像,因为它们都是某种特定的布局模式的活动环境,但还是存在一些区别:
在 FFC 和 GFC 内部不会存在浮动子元素,也就是说 FFC 和 GFC 不是浮动元素的活动区域,我们来看个例子:
<div class="container"><p>below is a Flex box</p><div class="flexbox"><div class="float">I am a box assigned float: right</div></div>
</div>
.flexbox {width: 100%;height: 20em;background-color: aquamarine;display: flex;
}
.float {float: right;width: 50%;height: 25%;background-color: aqua;
}
假如浮动元素可以在弹性盒子里活动的话,那么这个浮动盒子应该是靠右的,但实际情况是:

这是因为 Flex 和 Grid 有自己的布局规则,这个规则的优先级是高于浮动的,所以在 Flex 和 Grid 中使用 Float 是不会产生对应效果的。
3. BFC可以用来干什么
上面详细解释了 BFC 的产生途径,这小节讲述 BFC 的主要用途:
3.1 限制浮动元素的活动范围
有时候我们对一个元素内部的子元素使用浮动后,当这个浮动元素的高度比父元素的实际高度更高时,就会出现类似下面的效果:

这种情况发生的原因本质上是因为浮动元素是脱离了标准文档流,父元素和浮动元素实际上是处于两个图层:

在上图中,浮动子元素的活动区域是 外界的BFC,为了解决这个问题,我们需要把父元素变成一个 BFC,让子元素只能在父元素的 BFC 里面活动。

一种解决方法是使用 overflow 把父元素变成一个BFC:

但是这种方法有一个隐藏的问题就是,当父元素里面内容过多的话,会出现滚动条。
并且这种方式具有歧义性:设置 overflow: auto 的意思是让父元素自行安排自己的内容溢出,而我们想要的仅仅只是让父元素成为一个 BFC。
另一种解决方法是使用 display: flow-root ,这只会使父元素变成一个 BFC 而不带其他副作用:

值得一提的是,IE 并不支持这种方式,所以要兼容 IE 就不要采用这种方法。
3.2 解决margin合并问题
有时候当父元素的上边和第一个子元素的上边是紧密贴在一起,两者之间没有任何其他内容的时候,这个时候对子元素设置 margin-top 会影响到父元素,举个例子:
<div class="blue"></div>
<div class="red-outer"><div class="red-inner">red inner</div>
</div>
.blue {background: blue;height: 50px;
}
.red-inner {height: 50px;margin: 10px 0;
}
.red-outer {background: red;
}
这段 CSS 本意是想让 red-inner 离 red-outer10px 远,但实际却是这样的:

红色的 父div 与 蓝色的div 之间产生了一个外边距,而这个边距其实是来自 red inner。
要消除这个影响,可以让 红色的父div 成为一个 BFC。
.red-outer {display: flow-root;
}

4. 总结
- BFC 本质上是 默认布局模式 Normal flow 的活动环境/上下文。
- 使用
display: flow-root可以无副作用的生成一个 BFC ,但在 IE 中不兼容。
边栏推荐
- 数据库实验五 备份与恢复
- el-pagination左右箭头替换成文字上一页和下一页
- IDEA 配置连接数据库报错 Server returns invalid timezone. Need to set ‘serverTimezone‘ property.
- day8字典作业
- Lecture 5 Using pytorch to implement linear regression
- 如何停止flink job
- redis复制机制
- 解决端口占用问题
- npm搭建本地服务器,直接运行build后的目录
- vscode+pytorch use experience record (personal record + irregular update)
猜你喜欢
![[Go through 4] 09-10_Classic network analysis](/img/f2/e6e71869b8ab014cc1eea0537fc2e7.png)
[Go through 4] 09-10_Classic network analysis

第三讲 Gradient Tutorial梯度下降与随机梯度下降

vscode要安装的插件

NodeJs接收上传文件并自定义保存路径
![[Study Notes Dish Dog Learning C] Classic Written Exam Questions of Dynamic Memory Management](/img/0b/f7d9205c616f7785519cf94853d37d.png)
[Study Notes Dish Dog Learning C] Classic Written Exam Questions of Dynamic Memory Management

DOM and its applications

Database experiment five backup and recovery

Geek卸载工具

第5讲 使用pytorch实现线性回归

flink实例开发-详细使用指南
随机推荐
day6-列表作业
Redux
Returned object not currently part of this pool
Mesos learning
redis cache clearing strategy
【过一下11】随机森林和特征工程
[Go through 8] Fully Connected Neural Network Video Notes
基于Flink CDC实现实时数据采集(四)-Sink接口实现
DOM及其应用
day11-函数作业
Spark ML学习相关资料整理
Geek卸载工具
【Over 16】Looking back at July
[Go through 7] Notes from the first section of the fully connected neural network video
学习总结week3_2函数进阶
flink项目开发-flink的scala shell命令行交互模式开发
Calling Matlab configuration in pycharm: No module named 'matlab.engine'; 'matlab' is not a package
02.01-----参数的引用的作用“ & ”
【过一下 17】pytorch 改写 keras
【零基础开发NFT智能合约】如何使用工具自动生成NFT智能合约带白名单可Mint无需写代码