饥人谷技术博客让前端飞Web前端之路

今天我们来聊聊BFC吧

2018-03-27  本文已影响38人  IrisLong

一、BFC是什么?
在解释 BFC 是什么之前,我们先来了解下Box、Formatting Context是什么?
1、Box: CSS布局的基本单位
Box 是 CSS 布局的对象和基本单位, 直观点来说,就是一个页面是由很多个 Box 组成的。元素的类型和 display 属性,决定了这个 Box 的类型。不同类型的 Box, 会参与不同的 Formatting Context(一个决定如何渲染文档的容器),因此Box内的元素会以不同的方式渲染。

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

3、BFC
BFC(全称Block Formatting Context)块级格式化上下文,它是指一个独立的块级渲染区域,只有block-level box参与,该区域拥有一套渲染规则来约束块级盒子的布局,且与区域外部无关。

二、BFC的生成
生成BFC的元素决定了BFC的位置与大小!

三、BFC的布局规则?

四、BFC的应用
1、自适应两栏布局
正常情况下布局如下:虽然存在浮动元素aside,但是main的左边依然与包含块的左边接触,原因可见BFC布局规则第三条,即:每个元素的左外边距与包含块的左边界相接触(从左向右),即使浮动元素也是如此。

但是可以将main生成BFC,来实现自适应两栏布局,原因可参考BFC布局规则第四条,即:BFC的区域不会与float的元素区域重叠。注意main会根据包含块的宽度、aside的宽度自动调整宽窄

2、清除内部浮动
正常情况下布局如下:父容器高度为自适应时,子元素浮动会导致父容器高度坍塌。

原因:
为元素添加浮动后,会导致元素脱离文档流,导致该浮动元素内容在父容器中被抽离出来。由于父容器高度为自适应,即父容器高度依赖于子元素内容将其撑开,那么子元素消失势必会造成父容器高度坍塌。
解决方法:
(1)利用父元素形成BFC,从而开辟出独立空间
根据BFC布局规则第五条,即:计算BFC的高度时,浮动子元素也参与计算。为了清除内部浮动,可以将父元素box生成BFC,那么在计算box的高度时,box内部的浮动元素child也会参与计算。

(2)在父元素中添加伪元素,代码如下:
.box::after{
            content:'';
            display:block;
            clear:both;
        }

(3)在子元素末尾生成一个空元素clearfix

.clearfix{
            clear:both;
        }

3、防止margin重叠
(1)同时满足以下三点会导致margin重叠:
这些margin都处于普通流中,且属于同一个BFC中
这些margin没有被非空内容、padding、border或clear分隔开
这些margin在垂直方向上是毗邻的
(2)重叠边距计算:
当两个margin都为正值或负值时,取两者中绝对值的最大值
当多个margin毗邻且既有正又有负时,取正负margin中各自绝对值最大的相加
(3)解决办法:
法一:给其中一个元素加border或padding
法二:通过overflow:hidden生成BFC
如图所示:

[参考资料]
https://www.jianshu.com/p/35e3b3374c26
http://www.cnblogs.com/dojo-lzz/p/3999013.html#undefined
http://www.cnblogs.com/lhb25/p/inside-block-formatting-ontext.html

上一篇 下一篇

猜你喜欢

热点阅读