简洁明了介绍BFC

109 阅读2分钟

BFC,即块级格式上下文,是页面的中的一块渲染区域,有自己的一套渲染规则;

规则

  • 区域内部的盒子会在垂直方向上一个接一个的放置;
  • BFC内部相邻的盒子会发生margin重叠,与方向无关;
  • BFC的区域不会与浮动区域发生重叠;
  • 在计算BFC区域的高度时,浮动子元素也会参与计算;
  • BFC本质上就是一个独立的容器,容器内部的子元素不会影响到外部的元素;

其实简单来讲,BFC的目的就是形成一块独立的区域,你可以在内部进行自定义布局,不会影响到外界;

触发条件

想要得到一块BFC区域,肯定有其必要的条件,总结如下:

  • 根元素:HTML元素;
  • 浮动元素:float值为left/right;
  • overflow:hidden,scroll,auto;
  • display:flex,grid,inline-grid,table,inline-table,inline-block;
  • position的值:absolute或者fixed;

应用场景

BFC有其独特的规则,那么其规则就可以帮助我们去解决问题,进而就会有其对应的不同的应用场景;

  • 防止margin重叠(塌陷)

    • 有这样一个场景,两个p标签,第一个p标签margin-bottom:100px;第二个p标签margin-top: 100px;由于同一个BFC内部相邻的盒子会发生margin重叠,取两者最大值,那么两个p标签之间的距离还是100px,而不是我们想要的200px;
    • 为了解决这个问题,可以给第二个p标签外部再套上一个容器,并触发这个容器成为一个BFC区域,这样不属于同一个BFC,就解决了margin重叠的问题;
    <style>
     .wrap {
        overflow: hidden;// 新的BFC
        }
    p {
        color: #f55;
        background: #fcc;
        width: 200px;
        line-height: 100px;
        text-align:center;
        margin: 100px;
        }
    </style>
    
<body>
   <p>Haha</p >
    <div class="wrap">
        <p>Hehe</p >
    </div>
</body>
</html>
  • 清除内部浮动

    • 子元素设置浮动后,不会撑开父元素的高度;
    • BFC规则中计算高度的时候,也会计算浮动子元素的高度,进而可以去解决这个问题;
<style>
    .par {
        border: 5px solid #fcc;
        width: 300px;
        overflow: hidden;
    }
 
    .child {
        border: 5px solid #f66;
        width:100px;
        height: 100px;
        float: left;
    }
</style>
<body>
    <div class="par">
        <div class="child"></div>
    </div>
</body>
  • 自适应两栏布局

    • BFC区域不会与浮动区域重叠,利用这个规则,可以实现右边自适应的两栏布局;
.aside {

width: 100px;

height: 150px;

float: left;

background: #f66;

}

.main {

height: 200px;

background: #fcc;

overflow: hidden;

}
  • 中间自适应三栏布局

    • display:flex会形成一个BFC区域,那么两边浮动并固定,中间部分flex:1填充并自适应;
body {

display: flex;

}

.left {

height: 150px;

background-color: pink;

width: 200px;

float: left;

}

.main {

height: 200px;

background-color: orange;

flex: 1;

}

.right {

background-color: skyblue;

height: 150px;

width: 300px;

float: right;

}

这个就是对BFC的定义,规则以及应用场景的一个简单明了的介绍,当然BFC的应用场景还有很多,可以在开发使用的过程中加以整理;希望大家多多点赞,算是给我的一点小小的鼓励。