day012:什么是BFC?什么条件下会触发?渲染规则?应用场景有哪些?

day012:什么是BFC?什么条件下会触发?渲染规则?应用场景有哪些?

1.什么是BFC?

W3C对BFC的定义如下: 浮动元素和绝对定位元素,非块级盒子的块级容器(例如 inline-blocks, table-cells, 和 table-captions),以及overflow值不为"visiable"的块级盒子,都会为他们的内容创建新的BFC(Block Fromatting Context, 即块级格式上下文)。

2.触发条件

一个HTML元素要创建BFC,则满足下列的任意一个或多个条件即可: 下列方式会创建块格式化上下文:

  • 根元素()

  • 浮动元素(元素的 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为 flex 或 inline-flex元素的直接子元素)

  • 网格元素(display为 grid 或 inline-grid 元素的直接子元素) 等等。

3.BFC渲染规则

(1)BFC垂直方向边距重叠

(2)BFC的区域不会与浮动元素的box重叠

(3)BFC是一个独立的容器,外面的元素不会影响里面的元素

(4)计算BFC高度的时候浮动元素也会参与计算

4.应用场景

1. 防止浮动导致父元素高度塌陷

现有如下页面代码:


   
  1. <!DOCTYPE html>

  2. <html lang="en">

  3. <head>

  4. <meta charset="UTF-8">

  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">

  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">

  7. <title>Document</title>

  8. <style>

  9. .container {

  10. border: 10px solid red;

  11. }

  12. .inner {

  13. background: #08BDEB;

  14. height: 100px;

  15. width: 100px;

  16. }

  17. </style>

  18. </head>

  19. <body>

  20. <div class="container">

  21. <div class="inner"></div>

  22. </div>

  23. </body>

  24. </html>

接下来将inner元素设为浮动:


   
  1. .inner {

  2. float: left;

  3. background: #08BDEB;

  4. height: 100px;

  5. width: 100px;

  6. }

会产生这样的塌陷效果:

但如果我们对父元素设置BFC后, 这样的问题就解决了:


   
  1. .container {

  2. border: 10px solid red;

  3. overflow: hidden;

  4. }

同时这也是清除浮动的一种方式。

2. 避免外边距折叠

两个块同一个BFC会造成外边距折叠,但如果对这两个块分别设置BFC,那么边距重叠的问题就不存在了。

现有代码如下:


   
  1. <!DOCTYPE html>

  2. <html lang="en">

  3. <head>

  4. <meta charset="UTF-8">

  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">

  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">

  7. <title>Document</title>

  8. <style>

  9. .container {

  10. background-color: green;

  11. overflow: hidden;

  12. }

  13. .inner {

  14. background-color: lightblue;

  15. margin: 10px 0;

  16. }

  17. </style>

  18. </head>

  19. <body>

  20. <div class="container">

  21. <div class="inner">1</div>

  22. <div class="inner">2</div>

  23. <div class="inner">3</div>

  24. </div>

  25. </body>

  26. </html>

此时三个元素的上下间隔都是10px, 因为三个元素同属于一个BFC。 现在我们做如下操作:


   
  1. <div class="container">

  2. <div class="inner">1</div>

  3. <div class="bfc">

  4. <div class="inner">2</div>

  5. </div>

  6. <div class="inner">3</div>

  7. </div>

style增加:


   
  1. .bfc{

  2. overflow: hidden;

  3. }

效果如下:

可以明显地看到间隔变大了,而且是原来的两倍,符合我们的预期。

关于CSS布局问题,先分享到这里,后续会不断地补充,希望对你有所启发。如果对你有帮助的话,别忘了帮忙点个在看哦。


版权声明:本文为weixin_42098339原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。