BFC 块级格式化上下文

在解释BFC之前,先说一下文档流。

我们常说的文档流其实分为定位流、浮动流和普通流三种,而普通流其实就是指BFC中的FC。

FC是formatting context的首字母缩写,直译过来是格式化上下文,它是页面中的一块渲染区域,有一套渲染规则,决定了其子元素如何布局,以及和其他元素之间的关系和作用。常见的FC有:BFC、IFC,还有 GFC 和 FFC。

BFC( block formatting context ),译为:块级格式化上下文,是用于布局块级盒子的一块渲染区域。也就是说,它是一个独立的渲染区域,规定了内部的 Block-level Box 如何布局,并且与这个区域外部毫不相干。


触发条件

满足下列条件之一,就可触发BFC

  • 根元素,即HTML元素
  • float的值不为none
  • overflow的值不为visible
  • display的值为inline-block、table-cell、table-caption
  • position的值为absolute或fixed

[ BFC 元素所具有的特性 ]BFC布局规则特性:

  • 在BFC中,盒子从顶端开始垂直的一个接一个的排列;
  • 盒子垂直方向的距离由margin决定;属于同一个BFC的两个相邻盒子会发生重叠(塌陷);
  • 在BFC中,每个盒子的左外边缘(margin-left)会触碰到容器的左边缘(border-left);     // 从右到左的格式,同理
  • BFC的区域不会与浮动盒子产生交集,而是紧贴浮动边缘;
  • 计算BFC的高度时,自然也会检测到浮动的盒子高度;

BFC 的主要用途

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

它与普通的块框类似,但不同之处在于:

  • 清除内部浮动:可以阻止元素被浮动元素覆盖;可以包含浮动元素。

只要把父元素设为BFC就可以清除子元素的浮动了,最常用的方式就是在父元素上设置overflow:hidden;
对于IE6加上zoom:1;就可以了。
  • 解决外边距合并问题:属于同一个BFC的两个相邻块级子元素的上下margin会发生重叠。

// 设置writing-mode:tb-rl时,水平margin会发生重叠

所以,当两个相邻块级子元素分属于不同的BFC时可以阻止margin重叠。

  • 制作右侧自适应的盒子问题:BFC的区域不会与浮动盒子产生交集,而是紧贴浮动边缘

所以,普通流体元素BFC后,为了和浮动元素不产生任何交集,会顺着浮动边缘形成自己的封闭上下文