BFC是css中比较重要的一个概念,它不但能解决很多问题,还可以解释CSS中一些诡异的地方,所以搞懂BFC对于学习css来说是很有必要的,以下从【概念】【规则】【创建】【使用】等方面对BFC做了一些总结,希望对你能有所帮助!
BFC的基本概念
BFC全称为块格式化上下文 (Block Formatting Context) ,是 Web 页面中盒模型布局的 CSS 渲染模式,指一个独立的渲染区域或者说是一个隔离的独立容器。
BFC的通俗理解:首先BFC是一个名词,就是一个有特定规则的区域。我们可以理解为一个箱子(实际上是看不见摸不着的),箱子里面物品的摆放是不受外界的影响的。
W3C 规范对此作了详细的描述:
-
浮动元素和绝对定位元素,非块级盒子的块级容器(例如
inline-blocks
,table-cells
, 和table-captions
),以及overflow
值不为visiable
的块级盒子,都会为他们的内容创建新的 BFC(块级格式上下文)。 -
在 BFC 中,盒子从顶端开始垂直的一个接一个排列,两个盒子之间的垂直间距由他们的
margin
值决定,在同一个 BFC 中,两个相邻块级盒子的垂直外边距会产生折叠。 -
在 BFC 中,每一个盒子的左外边缘会触碰到容器的左边缘,对于从右到左的格式来说,则触碰到右边缘。即使在浮动里也是这样的(尽管一个盒子的
line boxes
会因为浮动而收缩),除非这个盒子的内部创建了一个新的 BFC(由于浮动,在这种情况下盒子本身将会变得更窄)
BFC的布局规则(原理/渲染规则)
- 计算BFC高度时,浮动元素也会参与计算(清除浮动)
- BFC的区域不会与浮动元素的box重叠。(防止浮动文字环绕)
- BFC在页面上是一个独立的容器,内外元素不相互影响。(解决外边距重叠问题)
- Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠。
下面的使用场景会通过这些规则来处理一些实际的问题。
如何创建BFC
括号里面是一些副作用
- 浮动元素:float:left | float:right;【会导致父元素的宽度丢失,也会导致下边的元素上移】
- 定位元素:position:absolute | position:fixed;
- display的一些值:display:inline-block【转为行内块会导致宽度丢失】 | display:flex | display:table | table-cell、table-caption、inline-table、inline-flex、grid、inline-grid;
- overflow值不为visible:overflow:hidden;【将会剪切掉溢出的元素】 | overflow:auto、overflow:scroll;
- display:flow-root【新属性,BFC创建新方式,没有任何副作用,注意浏览器兼容】
『注意』
display:table也可以生成BFC的原因在于Table会默认生成一个匿名的table-cell,是这个匿名的table-cell生成了BFC。
并不是任意一个元素都可以被当做BFC,只有当这个元素满足以上任意一个条件的时候,这个元素才会被当做一个BFC
BFC的使用场景
清除浮动
浮动的元素会脱离普通文档流,如下,父级容器只剩下2px的边距高度。
利用overflow: hidden
给父级创建BFC之后
以上方法可以实现清楚浮动,但是还是推荐使用伪类的方式。
为什么要清除浮动? 浮动塌陷,包含块没有设置高度或者是自适应的时候、包含块就不能撑起来,变成塌陷的状态。
防止浮动文字环绕
有如下文字环绕效果:
.brother-box有部分被浮动元素所覆盖(文本信息不回被浮动元素覆盖),如果想避免元素被覆盖,可利用创建BFC的方法,如给.brother-box加overflow: hidden
,则可得到以下效果
『理由』 上面的规则二:BFC的区域不会与浮动元素的box重叠
这个方法可以用来实现两列自适应布局,左边的宽度固定,右边的内容自适应宽度。
利用BFC解决边距重叠问题
根据前面的边距重合条件来看,想要解决边距重叠,只需要破坏其中的某个触发条件即可,比如创建一个BFC。
根据 BFC 的定义,两个元素只有在同一BFC 内,才有可能发生垂直外边距的重叠,包括相邻元素、嵌套元素。
===============================
要解决 margin 重叠问题,只要让它们不在同一个 BFC 内就行。
- 对于相邻元素,只要给它们加上 BFC 的外壳,就能使它们的 margin 不重叠;
- 对于嵌套元素,只要让父级元素触发 BFC(比如给父级加overflow:hidden),就能使父级 margin 和当前元素的 margin 不重叠。 ===============================
在没有新建BFC时,边距重叠了,margin-bottom + margin-top,应该等于20
新建了BFC之后
上面的例子中,为了使两个正方形的外边距不重叠,就给其中一个div包裹一层container,触发BFC。
注意: 边距折叠的问题可以用 BFC 来解决,但触发 BFC 并不是解决边距折叠的充分条件,还要得到合理的运用
参考:
深入理解BFC和Margin Collapse
理解CSS布局和BFC
理解CSS中BFC
Understanding Block Formatting Contexts in CSS
知乎用户回答
小可爱看完就点个赞再走吧!🤞🤞🤞