最近学习了BFC,开始学习的时候,单纯看概念,有种云里雾里的感觉,字都认识,凑一起啥意思大致也知道,但是具体有什么用呢?

这个就有点迷迷糊糊的,经过老师的讲解,以及自己课后的代码实验与总结,就拨云见日了,在这里分享自己对BFC的一些理解。

BFC的概念:

  BFC 即(Block Formatting Context)块级格式化上下文,指一个独立的块级渲染区域,只有块级盒子(box)参与,该区域拥有一套渲染规则来约束块级盒子的布局,且与区域外部无关。与之对应的还有IFC、GFC、FFC。

BFC的形成:

  1、根元素  html标签就是一个bfc

  2、float的值不为none 

  3、overflow的值不为visible

  4、display的值为 inline-block/ table-cell/ table-caption/ flex/ inline-flex  

  5、position的值为absolute或fixed 

BFC的特性:

  1、Box垂直方向的距离由margin决定,属于同一个BFC的两个相邻box的margin会发生重叠

  2、计算BFC的高度时,浮动元素也参与计算

  3、BFC的区域不会与float box发生重叠

  4、BFC内部的Box会在垂直方向,一个接一个的放置。

  5、每个元素的margin box的左边会与包含块border box的左边相接触(对于从左到右的格式化,否则相反),即使存在浮动也会如此。

  6、BFC就是页面上的一个独立容器,容器里面的元素不会影响到外面的元素 

  看到这里,肯定有些伙伴知道BFC以及开始慢慢知道BFC是个什么东西了,如果把html和css看做是数学,那么BFC就是一个公式,用来解决页面布局中的一些问题。

BFC在页面布局中的应用及原理

  运用BFC的特性,可以用来解决在页面布局中常见bug,也可以用来实现两栏、三栏布局、还可以解释我们页面布局中块状元素布局的规则

  1、解决页面布局中常见的bug

    • 两个垂直放置的box,上面的box设置margin-bottom,下面的box设置margin-top会发生重叠,最后浏览器解析的两个box之间的距离是两个box之间margin值大的那个数值。    

     常用的解决方法之一就是过下面的box添加父元素,并过父元素添加overflow:hidden;

     原理:首先,html是一个BFC,根据其特性,同一个BFC的两个相邻box的margin会发生重叠,所以导致这个问题。而添加overflow的解决方法,就是这针对这条特性,既然它要求在同一个BFC内会触发这个特性,那么让它不在同一个BFC区域内就行,也就是:给下面添加父元素,然后通过添加声明overflow:hidden;将父元素包含的区域变成了BFC区域,而下面的box和上面的box不在同一个BFC区域,自然也就不会再触发重叠的特性了。

同样,你可以用其他的方法将这两个box不放在同一个BFC区域,也能解决这个问题,但是可能会造成其他问题,所以需要注意。

是不是感觉有点意思呢,了解了问题产生的原因,再去解决问题就轻松许多了

                                        没有给下面的boX添加父元素和声明                     

                   BFC的基础理解及应用场景                   

              给下面的box添加父元素和给父元素声明overflow:hidden;

           BFC的基础理解及应用场景

      

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=di, initial-scale=1.0">
 6     <title>Document</title>
 7     <style>
 8         body{
 9             margin: 0;
10             padding: 0;
11         }
12         .box1{
13             width: 200px;
14             height: 200px;
15             background-color: red;
16             margin-bottom: 100px;
17         }
18         .box2{
19             width: 300px;
20             height: 300px;
21             background-color: blue;
22             margin-top: 150px;
23         }
24         .box3{
25             overflow: hidden;
26         }
27     </style>
28 </head>
29 <body>
30     <div class="box1">上面的盒子</div>
31     <div class="box3">
32         <div class="box2">下面的盒子</div>
33     </div>
34 </body>
35 </html>
View Code

相关文章: