BFC

简介: 一、理解BFC1、Box:css布局的基本单位box是css布局的对象和基本单位几个,直观点说,就是一个页面由很多到 box组成,元素的类型和display属性,决定了box类型,不同类型的box会参与不同的formatting context(决定如何渲染文档的容器),因此box内的元素会以不同的方式渲染。

一、理解BFC

1、Box:css布局的基本单位

box是css布局的对象和基本单位几个,直观点说,就是一个页面由很多到 box组成,元素的类型和display属性,决定了box类型,不同类型的box会参与不同的formatting context(决定如何渲染文档的容器),因此box内的元素会以不同的方式渲染。

几个常见的盒子:

block-level box:display属性为block,list-item,table的元素,会生成block-level box,并且参与BFC;

inline-level box:display属性为inline,inline-block,inline-table的元素,会生成inline-level box .并且参与 inline formatting context;

2、Formatting context

Formatting context是指页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及与其他元素的关系和相互作用,最常见的Formatting contexty有 Block fomatting context (简称 BFC )和 Inline formatting context (简称 IFC )。

3、**BFC **:块级格式化上下文

BFC 是指一个独立的块级渲染区域,只有Block-level Box参与,该区域拥有一套渲染规则来约束块级盒子的布局,且与区域外部无关。

BFC就是一种布局方式,可以理解为一个作用范围,即在一个BFC里的布局与其之外的布局不相关或者说不相互影响。

举一个形象的例子:

可以把一个页面想象成大的集装箱,这个集装箱里装的货物就是html元素。在现实生活中为了避免不同人的货物相互混淆,都是把货物打好包装再装入集装箱,这样的话无论你包装里面的货物怎么摆放,都不会影响到其他人的货物。那么这个包装就可以被想象成 Block Formatting Context。

4.为什么要用BFC?

使用一定的CSS声明可以生成BFC,浏览器对生成的BFC有一系列的渲染规则,利用这些渲染规则我们可以达到一定的布局效果,为了达到特定的布局效果我们让元素生成BFC。

二、哪些元素会生成BFC?

当一个HTML元素满足下面条件的任何一点,都可以产生 Block Formatting Context

根元素

float的值不为none;

overflow的值不为visible(可以为hidden,scroll,auto);

display的值为inline-block,table-cell,table-caption,flex,inline-flex中的任何一个;

position的值为absolute,fixed(不为static,relative中的任何一个);

display:table也认为可以生成BFC,其实这里的主要原因在于table会默认生成一个匿名的table-cell,正是这个匿名的table-cell生成了BFC。

常用的用来触发BFC的CSS样式:

overflow: scroll,overflow: hidden,display: flex,float: left,display: table

其中可能产生的一些问题

display:table—— 可能会产生一些问题

overflow:scroll—— 可能会显示不必要的滚动条

overflow:hidden—— 将会剪切掉溢出的元素

float:left—— 将会把元素置于容器的左边,其他元素环绕着它

三、BFC的布局规则

1、内部的Box会在垂直方向上一个接一个的放置;

2、垂直方向上的距离有margin决定。(完整的说法是:属于同一个BFC的两个相邻的Box的margin会发生重叠,与方向无关)

3、每个盒子的左外边框紧挨着包含块的左边框(从右到左的格式,则为紧挨右边框),即使浮动元素也是如此。(这说明BFC中的子元素不会超出它的包含块)

4、BFC的区域不会与float的元素区域重叠

5、计算BFC的高度时,浮动子元素也参与计算;

6、BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然;

四、BFC的作用及原理

(1)自适应两栏布局

img_fd2cc65e4eb25bc1e00d22e78e0ce4d0.png

效果如下

img_0cc349d0efde7383a49b4de254d32ac7.png

根据BFC布局规则 第3条:* 每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反),即使存在浮动也是如此。

根据BFC布局规则第四条:* BFC的区域不会与floatbox重叠。

改变方法:我们可以通过触发right 生成BFC, 来实现自适应两栏布局,当触发right 生成BFC后,这个新的BFC不会与浮动的 aside 重叠,right会根据包含块的宽度,和 left 的宽度,自动变窄。(一个盒子的边框会由于浮动而收缩,盒子本身将会变得更窄)

.right { overflow: hidden;}//或者利用上述其他方式为它生成 BFC

img_79eda3fcd6581cdd1cd5606b0e2d19c2.png

(2)清除n内部浮动

img_0a78587ee3cd847ef81c14e4b9dd83c1.png
img_f014837d10187b1ae6adc3871024cdf0.png

根据BFC布局规则第五条:* 计算BFC的高度时,浮动元素也参与计算

**改变方法:**为达到清除内部浮动,我们可以触发 section 生成BFC,那么 section 在计算高度时,section 内部的浮动元素 child 也会参与计算。

section{overflow:hidden}

img_8ba036a8b43c74626152860afe4ade07.png

(3)防止垂直 margin 重叠

img_8f3367de17509de3816825da38ae2689.png
img_f1aae6a5644bf0c9d23b7dbd26d87af2.png

根据BFC布局规则第二条:Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠

现象:两个p之间的距离为100px,发送了margin重叠。

修改:

我们可以在p外面包裹一层容器,并触发该容器生成一个BFC。那么两个P便不属于同一个BFC,就不会发生margin重叠了

img_6dd369c05bb1a0c93ff10497a84ab793.png
img_8b9104202876d61b0dfd53cc2a30ec2a.png

其实以上的几个例子都体现了BFC布局规则第六条:BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。

解释:

因为BFC内部的元素和外部的元素绝对不会互相影响;

因此,** 当BFC外部存在浮动时,它不应该影响BFC内部Box的布局,BFC会通过变窄,而不与浮动有重叠;

同样的,

当BFC内部有浮动时**,为了不影响外部元素的布局,BFC计算高度时会包括浮动的高度;避免margin重叠也是这样的一个道理

五、详细分析 margin 折叠

1、产生的原因

这些margin都处于普通流中,并在同一个BFC中

这些margin没有被非空内容、padding、border或clear分隔开

这些margin在垂直方向上是毗邻的

2、包含的情况:

一个box的margin-top与第一个子box的margin-top

一个box的margin-bottom与最后一个子box的margin-bottom,但须在该box的height:auto的情况下

一个box的margin-bottom与紧接着的下一个box的margin-top

一个box的margin-top与其自身的margin-bottom,但须满足没创建BFC

:另一篇CSS盒子对这些情况有图解

3、折叠边距的计算

当两个margin都是正值的时候,取两者的最大值;

当 margin 都是负值的时候,取的是其中绝对值较大的,然后,从 0 位置,负向位移;

当有正有负的时候,先取出负 margin 中绝对值中最大的,然后,和正 margin 值中最大的 margin 相加。

NOTE:所有毗邻的margin要一起参与运算,不能分步进行。

4、举个例子:

1)用 浮动布局 显示成两行两列 ——(为了解决浮动布局里的一个问题:元素浮动不换行怎么办?)

img_dc9347c54c348adb233168db420ac1c4.png
img_e3a3f7b760ad07ef024d784c459daf62.png

我们可以看到四个盒子最终都处在一列里面,为了达到我们的目的,可以**在其中一个外层盒子建立一个BFC**

img_6895e2cbb5a2acb8dcd78fe31d6b9d97.png
img_2b5ef9429ecf054e852d8fbd9ff3a2c3.png

2、实现多栏布局的一种方式

根据BFC布局规则第四条:* BFC的区域不会与floatbox重叠。(与浮动元素相邻的已生成BFC的元素不能与浮动元素互相覆盖)

img_7b2489dbb377620e5ce3d34bf7d13903.png
img_270b68ef720f21d60046e7e908e7b1c2.png
相关文章
|
2月前
|
前端开发 开发者 容器
BFC 及其应用详解
BFC(Block Format Context),即块级格式化上下文,是CSS中一种重要的布局方式,它能够解决浮动元素带来的问题,如元素塌陷等。通过触发BFC,可以将元素布局限制在一个独立的容器内,避免与外部元素相互影响。适用于需要对元素进行精确控制的场景。
|
24天前
|
前端开发
什么是BFC?
【10月更文挑战第27天】BFC是CSS中一个非常重要的概念,它对于理解和掌握页面布局以及解决一些常见的布局问题都有着重要的作用,通过合理地创建和利用BFC,可以实现更加灵活和稳定的页面布局。
|
2月前
|
存储 JavaScript 前端开发
BFC 及其应用
重绘与回流是网页渲染过程中关键环节:重绘涉及更新元素视觉属性如颜色、背景等变化而不改变布局的情况;回流则是在元素大小、位置或布局发生变化时重新计算和更新整个页面布局的过程。为提升性能,应尽量减少强制同步的重绘和回流,采用CSS层叠、使用RAF(requestAnimationFrame)代替setTimeout和setInterval,将动画移至独立容器或使用GPU加速等方式优化。
|
前端开发 容器
BFC
准面试题,这里简洁阐述了,帮助快速复习、加深记忆
94 2
BFC
|
7月前
|
容器
BFC 是什么
BFC 是什么
68 0
|
前端开发 容器
浅谈BFC
浅谈BFC
80 1
|
前端开发 容器
【对BFC的详解】
【对BFC的详解】
|
前端开发
BFC是什么?怎么触发BFC?
BFC是“块级格式化上下文”的缩写,是一个独立的渲染区域,内部的元素按照一定规则进行布局,不会影响到外部元素的布局。BFC主要用于解决一些常见的布局问题,例如清除浮动、防止 margin 重叠等。
|
前端开发 容器
浅谈BFC
大家好,我是 CoderBin,本文讲给大家分享 CSS 中关于 BFC 的相关内容,如果文中有任何不对的地方欢迎在评论区留言指正,如果对同学们有帮助的欢迎点赞收藏,你们的支持就是我最大的动力,谢谢🌻
136 1
浅谈BFC
|
前端开发 JavaScript
了解BFC特性,轻松实现自适应布局
BFC(Block Formatting Context)俗称块级格式上下文,初次看到这词似乎有点不是很理解,通俗解释就是一个独立区域决定了内部元素的排放,以及内部元素与外部元素的相互作用关系
148 0
了解BFC特性,轻松实现自适应布局