目的
BFC,概念被无数次提起,也看过无数次,可是每次碰到总会犹豫,什么是BFC,BFC能干什么,根据MNDD定义,记录下来增强记忆。
什么是BFC
根据MDN定义:
块格式化上下文(Block Formatting Context,BFC) 是Web页面的可视化CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。
根据定义首先要理解几个关键字:盒子、布局、浮动元素
盒子
块级盒子
- 盒子会在内联的方向上扩展并占据父容器在该方向上的所有可用空间,在绝大数情况下意味着盒子会和父容器一样宽
- 每个盒子都会换行
- width 和 height 属性可以发挥作用
- 内边距(padding), 外边距(margin) 和 边框(border) 会将其他元素从当前盒子周围“推开”
内联盒子
- 盒子不会产生换行。
- width 和 height 属性将不起作用。
- 内边距、外边距以及边框会被应用但是不会把其他处于 inline 状态的盒子推开。
布局特点
- 块级盒子,换行,竖直排列
- 内联盒子,不换行,与其它行内级元素排列为多行
浮动元素
float CSS属性指定一个元素应沿其容器的左侧或右侧放置,允许文本和内联元素环绕它。该元素从网页的正常流动(文档流)中移除,尽管仍然保持部分的流动性。
BFC要达到什么效果呢?
块格式化上下文包含创建它的元素内部的所有内容.
块格式化上下文对浮动定位(参见 float)与清除浮动(参见 clear)都很重要。浮动定位和清除浮动时只会应用于同一个BFC内的元素。浮动不会影响其它BFC中元素的布局,而清除浮动只能清除同一BFC中在它前面的元素的浮动。外边距折叠(Margin collapsing)也只会发生在属于同一BFC的块级元素之间。
以上官方定义。很难理解的样子。还是通过一些例子来认识下吧
实例一
<style>
* {
margin: 0;
padding: 0;
}
.box {
border: 10px solid black;
}
.left {
float: left;
width: 200px;
height: 150px;
background-color: red;
border:1px solid black;
padding: 10px;
}
</style>
<div class="box">
<div class="left">浮动元素</div>
<p>普通内容</p>
</div>
效果如下:

而使用overflow:hidden 给父元素创建BFC后
.box {
border: 10px solid black;
overflow:hidden;
}

实例二
我们跟普通内容添加点宽高
.right {
background: blue;
border: 5px solid green;
width:500px;
min-height: 100px;
opacity: 0.5;
}
</style>
<div class="box">
<div class="left">浮动元素</div>
<p class="right">普通内容</p>
</div>
效果如下:

普通内容与浮动内容重合了,同样给普通元素创建BFC
.right {
background: blue;
border: 5px solid green;
width:500px;
min-height: 100px;
opacity: 0.5;
overflow: hidden;
}
效果:

总结
根据实例理解BFC,可很好的得到BFC的特性:
1.BFC可计算内部浮动元素高度
2.BFC内部相对独立,即不会与浮动元素重叠
最后,如何创建BFC呢,MDN说的很详细:
- 根元素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、row、tbody、thead、tfoot的默认属性)或 inline-table)
- overflow 值不为 visible 的块元素
- display 值为 flow-root 的元素
- contain 值为 layout、content或 paint 的元素
- 弹性元素(display为 flex 或 inline-flex元素的直接子元素)
- 网格元素(display为 grid 或 inline-grid 元素的直接子元素)
- 多列容器(元素的 column-count 或 column-width 不为 auto,包括 column-count 为 1) column-span 为 all 的元素始终会创建一个新的BFC,即使该元素没有包裹在一个多列容器中(标准变更,Chrome bug)。