BFC块级格式化上下文
BFC块级格式化上下文
余生BFC(边距重叠解决方案)
BFC(Block Formatting Context)
:块级格式化上下文。你可以把它理解成一个独立的区域。
另外还有个概念叫IFC
。不过,BFC
问得更多。
BFC 的原理/BFC的布局规则【非常重要】
BFC
的原理,其实也就是BFC
的渲染规则(能说出以下四点就够了)。包括:
- BFC 内部的子元素,在垂直方向,边距会发生重叠。
- BFC在页面中是独立的容器,外面的元素不会影响里面的元素,反之亦然。(稍后看
举例1
) - BFC区域不与旁边的
float box
区域重叠。(可以用来清除浮动带来的影响)。(稍后看举例2
) - 计算
BFC
的高度时,浮动的子元素也参与计算。(稍后看举例3
)
如何生成BFC
有以下几种方法:
- 方法1:
overflow
: 不为visible
,可以让属性是hidden
、auto
。【最常用】 - 方法2:浮动中:
float
的属性值不为none
。意思是,只要设置了浮动,当前元素就创建了BFC
。 - 方法3:定位中:只要
posiiton
的值不是 static
或者是relative
即可,可以是absolute
或fixed
,也就生成了一个BFC
。 - 方法4:
display
为inline-block
,table-cell
,table-caption
,flex
,inline-flex
BFC 的应用
**举例1:**解决 margin 重叠
当父元素和子元素发生
margin
重叠时,解决办法:给子元素或父元素创建BFC。
比如说,针对下面这样一个 div
结构:
1 | <div class="father"> |
上面的
div
结构中,如果父元素和子元素发生margin
重叠,我们可以给子元素创建一个BFC
,就解决了:
1 | <div class="father"> |
因为第二条:BFC区域是一个独立的区域,不会影响外面的元素。
举例2:BFC区域不与float区域重叠:
针对下面这样一个div结构;
1 |
|
效果如下:
上图中,由于右侧标准流里的元素,比左侧浮动的元素要高,导致右侧有一部分会跑到左边的下面去。
如果要解决这个问题,可以将右侧的元素创建BFC,因为第三条:BFC区域不与float box
区域重叠。解决办法如下:(将right区域添加overflow属性)
1 | <div class="right" style="overflow: hidden"> |
上图表明,解决之后,father-layout
的背景色显现出来了,说明问题解决了。
**举例3:**清除浮动
现在有下面这样的结构:
1 |
|
效果如下:
上面的代码中,儿子浮动了,但由于父亲没有设置高度,导致看不到父亲的背景色(此时父亲的高度为0)。正所谓有高度的盒子,才能关住浮动。
如果想要清除浮动带来的影响,方法一是给父亲设置高度,然后采用隔墙法。方法二是 BFC:给父亲增加
overflow=hidden
属性即可, 增加之后,效果如下:
为什么父元素成为BFC之后,就有了高度呢?这就回到了第四条:计算BFC的高度时,浮动元素也参与计算。意思是,在计算BFC的高度时,子元素的float box也会参与计算