BFC—格式化上下文

317 阅读3分钟

块格式化上下文(Block Formatting Context,BFC) 是Web页面的可视CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。

块格式化上下文对浮动定位与清除浮动都很重要。浮动定位和清除浮动时只会应用于同一个BFC内的元素。浮动不会影响其它BFC中元素的布局,而清除浮动只能清除同一BFC中在它前面的元素的浮动。外边距折叠(Margin collapsing)也只会发生在属于同一BFC的块级元素之间。

1. BFC的作⽤(这块其实就是在阐述在实际⼯作⾥的应⽤) 

清除浮动

.box {
    background-color: rgb(224, 206, 247);
    border: 5px solid rebeccapurple;
}

.float {
    float: left;
    width: 200px;
    height: 150px;
    background-color: white;
    border:1px solid black;
    padding: 10px;
}  

<div class="box">
    <div class="float">I am a floated box!</div>
    <p>I am content inside the container.</p>
</div>
      

我们可以使用overflow:hidden在box属性中,产生一个BFC,如下所示

.box {
    background-color: rgb(224, 206, 247);
    border: 5px solid rebeccapurple;
    overflow: auto;
}

.float {
    float: left;
    width: 200px;
    height: 150px;
    background-color: white;
    border:1px solid black;
    padding: 10px;
}


<div class="box">
    <div class="float">I am a floated box!</div>
    <p>I am content inside the container.</p>
</div>
      

外边距折叠

<head>
div{
    width: 100px;
    height: 100px;
    background: lightblue;
    margin: 100px;
}
</head>
<body>
    <div></div>
    <div></div>
</body>

preview

因为两个 div 元素都处于同一个 BFC 容器下 (这里指 body 元素) 所以第一个 div 的下边距和第二个 div 的上边距发生了重叠,所以两个盒子之间距离只有 100px,而不是 200px。

<div class="container">
    <p></p>
</div>
<div class="container">
    <p></p>
</div>

.container {
    overflow: hidden;
}
p {
    width: 100px;
    height: 100px;
    background: lightblue;
    margin: 100px;

}

下面我们设置container属性为overflow为hidden可以创建两个BFC容器他们都脱离文档流

**preview
**

这下他们之间的间距为200px

◦ 解决边距塌陷等问题

<div class="container">
  <div class="box box1"></div>
</div>
.box {
  width: 20px;
  height: 50px;
  float: left; // 脱离了文档流形成了一个BFC
	border: 4px solid green;
}

我们在外部增加属性overflow

.container {
	overflow: hidden; // 外层容器产生BFC
}

2.产生BFC

  • 根元素(<html>)

  • 浮动元素(元素的 float 不是 none

  • 绝对定位元素(元素的 positionabsolutefixed

  • 行内块元素(元素的 displayinline-block

  • 表格单元格(元素的 displaytable-cell,HTML表格单元格默认为该值)

  • 表格标题(元素的 displaytable-caption,HTML表格标题默认为该值)

  • 匿名表格单元格元素(元素的 display 为 `table

    ``table-rowtable-row-group

    ``table-header-group

    ``table-footer-group(分别是HTML table、row、tbody、thead、tfoot 的默认属性)或 inline-table`)

  • overflow 计算值(Computed)不为 visible 的块元素

  • display 值为 [flow-root](https://drafts.csswg.org/css-display/#valdef-display-flow-root) 的元素

  • contain 值为 layoutcontent

    paint

    的元素

  • 弹性元素(displayflexinline-flex 元素的直接子元素)

  • 网格元素(displaygridinline-grid 元素的直接子元素)

  • 多列容器(元素的 column-countcolumn-width 不为 `auto

    ,包括

    ``column-count1`)

  • column-spanall 的元素始终会创建一个新的BFC,即使该元素没有包裹在一个多列容器中(标准变更Chrome bug)。

讲到这里我想你差不多对BFC有一定了解了,正对外边距折叠和****清除浮动,

BFC原理

 ◦三种⽂档定位⽅式:普通流 浮动 绝对定位 

 ◦ 具体产⽣原因:BFC是上⾯三种布局⽅式中的普通流,BFC会产⽣⼀个独⽴的容器,该容器内部 的元素不会在布局上影响到外部的元素,在外部的普通流看来它和其他普通流元素⽆差别,⽂ 档最终会按照上⾯说的普通流计算布局。

 ◦  注意事项:块格式化上下⽂对浮动定位与清除浮 动都很重要。

参考文献

MDN格式化上下文

全面分析总价BFC原理及实践

10分钟理解BFC原理

===