到底什么是BFC

298 阅读2分钟

前言

我们经常被问到什么是BFC,总有一种知其然不知其所以然的感觉,一时不知道怎么回答。
今天我们就说说BFC到底是什么???

定义

BFC 全称 Block formatting context, 即是块级格式上下文
官方解释为:BFC它决定了元素如何对其内容进行定位,以及与其它元素的关系和相互作用,当涉及到可视化布局时,Block Formatting Context提供了一个环境,HTML在这个环境中按照一定的规则进行布局。
是不是有点理解
我们可以简单的理解为,它就是一个独立的空间,将子元素与外界隔离,防止影响到外部的其他元素

触发条件

  • 根元素 html默认就是一个BFC

  • float的值不为none单纯的div不是BFC,如果添加了浮动就是BFC

  • overflow的值不为visible  单纯的div不是BFC,如果添加了overflow:hidden等就是BFC

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

  • position的值为absolute或fixed

可以解决哪些问题

问题1:包含塌陷问题

当给子元素box设置margin-top时,会看到如下效果:父元素和子元素一起距离顶部80px

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title></title>
    <style>
        .container{
          background: yellowgreen;
        }
        .box {
            width: 100px;
            height: 100px;
            background: #000;
            margin-top: 80px;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="box"></div>
        <div class="box"></div>
    </div>
</body>
</html>

效果图 1.jpg

这不是我们要的效果
我们想要的是,box与父级container的距离80px, 父级的位置不变

解决

这时候给父级设置 display: inline-block, 让其成为BFC

  .container{
      background: yellowgreen;
      display: inline-block;
   }

效果图

image.png

问题2:外边距的塌陷问题(垂直塌陷)

当给上下两个div设置margin时,会看下如下效果:div之间的间距不是,margin值的叠加,而是重合,取最大值

<!--
 * @Descripttion: 
 * @version: 
 * @Author: Ybb
 * @Date: 2022-10-25 13:47:59
 * @LastEditors: Andy
 * @LastEditTime: 2022-11-23 10:29:53
-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title></title>
    <style>
        .box {
            width: 100px;
            height: 100px;
            background: #000;
            margin: 80px;
        }
    </style>
</head>
<body>
    <div class="box"></div>
    <div class="box"></div>
</body>
</html>

效果图

image.png

这不是我们要的效果
我们想要的是,两个box之间间距应该160px

解决

给其中一个div添加inline-block,让其变成BFC

    <body>
        <div class="box"></div>
        <div class="box" style="display:inline-block"></div>
    </body>

效果图 image.png

问题3:清除浮动

当给子元素设置浮动后,父元素无法被撑开

<!--
 * @Descripttion: 
 * @version: 
 * @Author: Ybb
 * @Date: 2022-10-25 13:47:59
 * @LastEditors: Andy
 * @LastEditTime: 2022-11-23 10:41:04
-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title></title>
    <style>
        .container{
          background: yellowgreen;
        }
        .box {
            width: 100px;
            height: 100px;
            background: #000;
            float: left;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="box"></div>
       <div class="box"></div>
    </div>
</body>
</html>

效果图

image.png

解决

给父级设置BFC,可以清除浮动,这时候就可以看见父级了

 .container{
  background: yellowgreen;
  display: flex;
}

效果图

image.png

总结

  • 一个BFC区域只包含其子元素,不包括其子元素的子元素
  • 并不是所有的元素都能成为一块BFC区域,只有当这个元素满足条件的时候才会成为一块BFC区域
  • 不同的BFC区域之间是相互独立的,互不影响的。利用这个特性我们可以让不同BFC区域之间的布局不产生影响.