什么是BFC?

html-css021

什么是BFC?,第1张

在了解BFC之前,先了解两个个概念:

1.box就是盒模型。box是css布局的对象和基本单位,说白了就是咱们网页布局的基石,简单来说一个页面是由很多box(盒模型)组成的。

2.元素的类型也就是display属性。元素的类型和display属性决定了这个 Box的类型。不同类型的Box,会参与不同的Formatting Context(一个决定如何渲染文档的容器-人话就是网页布局的一个范围),因此Box内的元素会以不同的方式渲染(显示)。

概念:BFC全称Block Formatting Context ,中文直译为块级格式上下文。它是W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用。

通俗的来说:BFC是一个独立的布局环境,我们可以理解为一个箱子(实际上是看不见摸不着的),箱子内部的元素无论如何翻江倒海,都不会影响到外部。转换为BFC的理解则是:BFC中的元素的布局是不受外界的影响(我们往往利用这个特性来消除浮动元素对其非浮动的兄弟元素和其子元素带来的影响。比如清除浮动)并且在一个BFC中,块元素与行元素都会垂直的沿着其父元素的边框排列。

BFC布局规则

1.在BFC下,内部的Box会在垂直方向,一个接一个地放置。

2.Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠

3.在BFC中,每一个盒子的左外边缘(margin-left)会触碰到容器(父元素)的左边缘(border-left)(对于从右到左的格式来说,则触碰到右边缘),即使存在浮动也是如此。

4.BFC的区域不会与float box重叠。例子:两个div,一个进行浮动,一个不浮动,这时浮动的元素会覆盖没有浮动的元素。给没有浮动的元素加overflow:hidden。就不会重合。

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

如何触发 BFC

1.浮动元素,float 除 none 以外的值

2.position的值不为static或者relative

3.display不为none

4.overflow 除了 visible 以外的值

BFC的应用

1.解决浮动塌陷问题

2.自适应两栏布局(我们还可以运用BFC可以阻止元素被浮动元素覆盖的特性来实现自适应两栏布局。方法:给没有浮动的元素加overflow:hidden。)

3.解决设置margin值重叠问题。

总结:BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。它规定了元素与其他元素的关系和相互作用。

最近无意间看到很多文章写overflow: hidden可以清除浮动,但大多并没有说明其原理。这里就介绍一下BFC。平时会利用BFC解决一些如清浮动,防止 margin 重叠等问题,但是BFC具体是什么,就感觉只可意会不可言传了,于是特地花了半天时间,查阅了一些资料和文章,记录一下自己的学习过程(其实在 《CSS盒子模型》 一文中已经提及一些知识,为了方便,这里特地重新开一篇文章,方便以后查阅)。

BFC(Block formatting context)直译为"块级格式化上下文"。它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。

Box 是 CSS 布局的对象和基本单位,一个页面是由很多个 Box 组成的。元素的类型和 display 属性,决定了这个 Box 的类型。 不同类型的 Box, 会参与不同的 Formatting Context(一个决定如何渲染文档的容器),因此Box内的元素会以不同的方式渲染。让我们看看有哪些盒子:

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

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

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

1.根元素

2.float属性不为none

3.position为absolute或fixed

4.display为inline-block, table-cell, table-caption, flex, inline-flex

5.overflow不为visible

根据第二部分的BFC布局规则第四个,我们只要让child2成为BCF就可以和child1不重叠;再根据第三部分生成BFC的元素的条件,可以为child2设置 display也可以设置overflow等等,可以达到如下图效果

达到了我们希望的自适应两栏布局。

到这里应该知道为什么overflow: hidden可以清除浮动;

第二本部分BFC布局规则第六:计算BFC的高度时,浮动元素也参与计算;

第三部分生成BFC的元素的条件第五:overflow不为visible。

具体例子可以参考我的这篇 《常见的清除浮动方法》 。

根据BFC布局规则第二:Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠。让child2和child3为不同的BFC的box就不会重叠了。

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