直接参考 MDN 即可。

    BFC 全称 block formatting context ,中文译作「块格式化上下文」。

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

    下列方式会创建块格式化上下文

    • 根元素(<html>)
    • 浮动元素(元素的 float 不是 none
    • 绝对定位元素(元素的 [position](https://developer.mozilla.org/zh-CN/docs/Web/CSS/position)absolutefixed
    • 行内块元素(元素的 [display](https://developer.mozilla.org/zh-CN/docs/Web/CSS/display)inline-block
    • 表格单元格(元素的 [display](https://developer.mozilla.org/zh-CN/docs/Web/CSS/display)table-cell,HTML表格单元格默认为该值)
    • 表格标题(元素的 [display](https://developer.mozilla.org/zh-CN/docs/Web/CSS/display)table-caption,HTML表格标题默认为该值)
    • 匿名表格单元格元素(元素的 [display](https://developer.mozilla.org/zh-CN/docs/Web/CSS/display)table、``table-rowtable-row-group、``table-header-group、``table-footer-group(分别是HTML table、row、tbody、thead、tfoot的默认属性)或 inline-table
    • [overflow](https://developer.mozilla.org/zh-CN/docs/Web/CSS/overflow) 值不为 visible 的块元素
    • [display](https://developer.mozilla.org/zh-CN/docs/Web/CSS/display) 值为 [flow-root](https://drafts.csswg.org/css-display/#valdef-display-flow-root) 的元素
    • [contain](https://developer.mozilla.org/zh-CN/docs/Web/CSS/contain) 值为 layoutcontentpaint 的元素
    • 弹性元素([display](https://developer.mozilla.org/zh-CN/docs/Web/CSS/display)flexinline-flex元素的直接子元素)
    • 网格元素([display](https://developer.mozilla.org/zh-CN/docs/Web/CSS/display)gridinline-grid 元素的直接子元素)
    • 多列容器(元素的 [column-count](https://developer.mozilla.org/zh-CN/docs/Web/CSS/column-count)[column-width](https://developer.mozilla.org/zh-CN/docs/Web/CSS/column-width) 不为 auto,包括 ``column-count1
    • column-spanall 的元素始终会创建一个新的BFC,即使该元素没有包裹在一个多列容器中(标准变更Chrome bug)。

    块格式化上下文包含创建它的元素内部的所有内容。

    块格式化上下文对浮动定位(参见 float)与清除浮动(参见 [clear](https://developer.mozilla.org/zh-CN/docs/Web/CSS/clear))都很重要。浮动定位和清除浮动时只会应用于同一个BFC内的元素。浮动不会影响其它BFC中元素的布局,而清除浮动只能清除同一BFC中在它前面的元素的浮动。外边距折叠(Margin collapsing)也只会发生在属于同一BFC的块级元素之间。

    常见作用:

    1. 包含浮动元素,即达到清除浮动的效果
    问题案例:高度塌陷问题:在通常情况下父元素的高度会被子元素撑开,而在这里因为其子元素为浮动元素所以父元素发生了高度坍塌,上下边界重合。这时就可以用bfc来清除浮动了。 见: http://js.jirengu.com/punosagesu/3/edit
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>JS Bin</title>
    6. <style>
    7. .box1, .box2, .box3 {
    8. width: 300px;
    9. height: 300px;
    10. float: left;
    11. }
    12. .box1 {
    13. background-color: red;
    14. }
    15. .box2 {
    16. background-color: green;
    17. }
    18. </style>
    19. </head>
    20. <body>
    21. <div class='box1'></div>
    22. <div class='box2'></div>
    23. </body>
    24. </html>
    1. 不被浮动元素覆盖
    问题案例: div浮动兄弟遮盖问题:由于左侧块级元素发生了浮动,所以和右侧未发生浮动的块级元素不在同一层内,所以会发生div遮挡问题。可以给蓝色块加 overflow: hidden,触发bfc来解决遮挡问题。 见:http://js.jirengu.com/baguxivelo/5/edit
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>JS Bin</title>
    6. <style>
    7. body {
    8. overflow: hidden;
    9. }
    10. .box1 {
    11. background-color: red;
    12. float: left;
    13. width:300px;
    14. height: 100px;
    15. }
    16. .box2 {
    17. background-color: green;
    18. height: 200px;
    19. overflow: hidden;
    20. }
    21. </style>
    22. </head>
    23. <body>
    24. <div class='box1'>fdfdfdfdfdfd</div>
    25. <div class='box2'>pppp</span>
    26. </body>
    27. </html>
    1. 阻止 margin 塌陷问题
    见:http://js.jirengu.com/decojazocu/6/edit
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>JS Bin</title>
    6. <style>
    7. .box1, .box2 {
    8. width: 200px;
    9. }
    10. .box1 {
    11. margin-top: 20px;
    12. height: 200px;
    13. background-color: red;
    14. overflow: hidden;
    15. }
    16. .box2 {
    17. margin-top: 10px;
    18. height: 100px;
    19. background-color: #ccc;
    20. }
    21. </style>
    22. </head>
    23. <body>
    24. <div class='box1'>
    25. <div class='box2'></div>
    26. </div>
    27. </body>
    28. </html>