BFC
FC(Formatting Context)
FC全称是formatting context(格式化上下文),无论是块级元素还是行内元素,在标准流里面都是属于一个FC的; 块级元素属于BFC,行内元素属于IFC。
理解布局是有用的
Boxes in the normal flow belong to a formatting context,which may be block or inline, but not both simultaneously Block-level boxrs particepate in a block formatting context. Inline-level boxes participate in an inline formatting context.
BFC(Block Formatting Context)
块格式化上下文(Block Formatting Context,BFC)是 Web 页面的可视 CSS 渲染的一部分,是块级盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。
下列方式会创建块格式化上下文:
- 根元素
html; - 浮动元素(float值不为none)
 - 绝对定位元素(position值为absolute或fixed)
 - 行内块元素(display值为inline-block)
 - 表格单元格(display值为table-cell,HTML表格单元格默认值)
 - 表格标题(display值为table-caption,HTML表格标题默认值)
 - 匿名表格单元格元素(display值为table、table-row、table-row-group、table-header-group、table-footer-group(分别是HTML table、tr、tbody、thead、tfoot的默认值)或inline-table)
 - overflow值不为visible、clip的块元素
 - display值为flow-root的元素,兼容性不好
 - contain值为layout、content或paint的元素
 - 弹性元素(display值为flex或inline-flex元素的直接子元素),如果它们本身既不是flex、grid也不是table容器
 - 网格元素(display值为grid或inline-grid元素的直接子元素),如果它们本身既不是flex、grid也不是table容器
 - 多列容器(column-count或column-width(en-US)值不为auto,包括column-count为1)
 - column-span值为all的元素始终会创建一个新的BFC,即时该元素没有包裹在一个多列容器中
 
格式化上下文影响布局,通常,我们会定位和清除浮动创建新的BFC,而不是更改布局,因为它将:
- 包含内部浮动
 - 排除外部浮动
 - 阻止外边距重叠
 
BFC作用
In a block formatting context, boxes are laid out after the other, vertically, beginning at the top of a containing block. The vertical distance between two sibling boxes is determined by the 'margin' properties. Vertical margins between adjacent block-level boxes in a block formatting context collapse. 可以帮助块级元素产生距离或者重叠,margin,浏览器创建的BFC
In a block formatting context, each box's left outer edge touches the left edge of the containing block (for right-to-left formatting, right edges touch). This is true even in the presence of floats(although a box's line boxes may shrink due to the floats), unless the box establishes a new block formatting context(in which case the box itself may become narrower due to the floats).
简单概括如下:
- 在BFC中,box会在垂直方向上一个挨着一个排列;
 - 垂直方向的间距由margin属性决定;
 - 在同一个BFC中,相邻两个box之间的margin会折叠(collapse);
 - 在BFC中,每个元素的左边缘是紧挨着包含块的左边缘的;
 
作用概况:
- 解决margin的折叠问题
 - 解决浮动高度塌陷问题
 
原本都是在html同一个BFC,但是一些情况会创建新的BFC,也就是会不止一个BFC。但是还是在同一个BFC中。
不能触发bfc:
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
      * {
        margin: 0;
      }
      .box1 {
        height: 200px;
        width: 400px;
        background-color: orange;
        margin-bottom: 30px;
        overflow: auto;
      }
      .box2 {
        height: 150px;
        background-color: pink;
        margin-top: 50px;
      }
    </style>
  </head>
  <body>
    <div class="box1"></div>
    <div class="box2"></div>
  </body>
</html>
可以触发bfc:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
        }
        .container {
            overflow: auto;
        }
        .box1 {
            height: 200px;
            width: 400px;
            background-color: orange;
            margin-bottom: 30px;
            overflow: auto;
        }
        .box2 {
            height: 150px;
            background-color: pink;
            margin-top: 50px;
        }
    </style>
</head>
<body>
    <div class="container"><!- 这里形成了一个新的bfc->
        <div class="box1"></div>
    </div>
    <div class="box2"></div>
</body>
</html>
此时margin就不会重叠了
补充
bfc解决浮动元素的父元素高度塌陷问题
浮动和定位,说BFC能解决浮动元素高度塌陷是不准确的,就比如说定位问题。

使用overflow清除浮动的条件:
- 高度为auto,默认就是auto
 - 父元素触发bfc形成独立的块级格式化上下文
 

bfc的高度是auto的情况下,是如下方法计算高度的:
- 如果只有行内元素,是行高的顶部和底部的距离(行盒)
 - 如果有块级元素,是由最底层的块上边缘和最底层块盒子的下边缘之间的距离
 - 如果有绝对定位元素,将会被忽略
 - 如果有浮动元素,那么会增加高度以包括这些浮动元素的下边缘
 
