BFC 是什么?

140 阅读1分钟

BFC 是什么?

一、定义

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

个人理解是BFC是是个独立布局区域,换句话来说就是个大盒子(元素),每一个BFC大盒子(元素)只包含自己的子盒子(元素),不包含自己子盒子(元素)的子盒子(元素),BFC里的子盒子(元素)不会影响BFC外面的盒子(元素)。

二、触发BFC

并不是所有的元素都是BFC, 只有满足了下面的任意1个条件之后,这个盒子(元素)才成为BFC

  • 根元素()
  • 设置浮动,不包括none
  • 设置定位,absoulte或者fixed
  • 行内块显示模式,inline-block
  • 设置overflow,即hidden,auto,scroll
  • 表格单元格,table-cell,table-caption
  • 弹性布局,flex

三、利用BFC解决问题

  • 解决外边距的塌陷问题(垂直塌陷)
<!DOCTYPE html>
<html><head>
    <meta charset="utf-8">
    <title></title>
    <style type="text/css">
        .top {
            width: 200px;
            height: 200px;
            background: orange;
            margin-bottom: 100px;
        }
​
        .bottom {
            width: 200px;
            height: 200px;
            background: pink;
            margin-top: 100px;
        }
​
        /*  解决相邻两容器上下外边距会发生重叠*/
        .box {
            overflow: hidden;
        }
    </style>
</head><body>
    <div class="top"></div>
    <div class="box">
        <div class="bottom"></div>
    </div>
</body></html>
  • 利用BFC解决包含塌陷
<!DOCTYPE html>
<html><head>
    <meta charset="utf-8">
    <title></title>
    <style type="text/css">
        .box {
            width: 200px;
            height: 200px;
            background: orange;
        }
​
        .son {
            width: 200px;
            height: 100px;
            background: pink;
            margin-top: 100px;
        }
​
        /*  解决容器内子盒子给外边距会发生子盒子和父盒子一起往下掉*/
        .box {
            overflow: hidden;
        }
    </style>
</head><body>
    <div class="box">
        <div class="son"></div>
    </div>
</body></html>
  • 当浮动产生影响的时候,可以利用BFC来清除浮动的影响
<!DOCTYPE html>
<html><head>
    <meta charset="utf-8">
    <title></title>
    <style type="text/css">
        .box {
            width: 300px;
            background: orange;
        }
​
        .son {
            float: left;
            width: 100px;
            height: 30px;
            background: pink;
            border: 1px solid #ccc;
​
        }
​
        /*  解决一个没有设置高度的父盒子,里面子盒子都浮动,父盒子失去原来高度带来的*/
        .box {
            overflow: hidden;
        }
    </style>
</head><body>
    <div class="box">
        <div class="son"></div>
        <div class="son"></div>
        <div class="son"></div>
        <div class="son"></div>
        <div class="son"></div>
​
    </div>
</body></html>
  • BFC可以阻止标准流元素被浮动元素覆盖
<!DOCTYPE html>
<html><head>
    <meta charset="utf-8">
    <title></title>
    <style type="text/css">
        .top {
            float: left;
            width: 300px;
            height: 200px;
            background: orange;
        }
​
        .bottom {
            height: 300px;
            background: pink;
        }
​
        /* 解决上面盒子浮动,下面盒子时标准流,浮动元素覆盖了标准流元素的*/
        .bottom {
            overflow: hidden;
        }
    </style>
</head><body>
    <div class="top"></div>
    <div class="bottom"></div>
</body></html>

\