002 BFC

2/18/2022 CSS

# BFC

BFC 全称:Block Formatting Context (块级格式化上下文)

最简单的解释是 BFC 是一个独立空间,空间内的子元素不会影响外部布局

# 触发条件

# 渲染规则

  • BFC 是一个块级元素,块级元素会在垂直方向一个接一个排列
  • BFC 是一个独立的容器,容器内的元素不会影响外部元素
  • 属于同一个 BFC 的两个相邻的标签外边距会发生重叠
  • 计算BFC高度的时候浮动元素也会参与计算

# 应用

  1. 触发BFC解决高度塌陷

    <style>
        .container {
            border: 10px solid red;
        }
        .inner {
            background: #08BDEB;
            height: 100px;
            width: 100px;
            float: left;
        }
    </style>
    <div class="container">
        <div class="inner"></div>
    </div>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    此时 inner 产生 BFC 独立空间,不影响外部空间导致 container 高度塌陷,通过使用 overflow 触发父级 BFC 解决问题,或者通过 display: flow-root 创建无副作用的 BFC

    .container {
        border: 10px solid red;
        overflow: hidden;
        /* display: flow-root; */
    }
    
    1
    2
    3
    4
    5
    1. 外边距塌陷

      MDN 解释为: 块的 margin-topmargin-bottom有时折叠为单个边距,其大小取两者最大值,相同则取其中一个,这种行为成为边距折叠

      <style>
          .container {
            background-color: green;
            overflow: hidden;
          }
      
          .inner {
            background-color: lightblue;
            margin: 10px 0;
          }
      </style>
      <body>
        <div class="container">
          <div class="inner">1</div>
          <div class="inner">2</div>
          <div class="inner">3</div>
        </div>
      </body>
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18

      此时因为三个元素同属于一个BFC所以三个元素的上下间隔都是10px,为了解决此问题可以使用BFC规则(为元素包裹一个盒子形成一个完全独立的空间,做到里面元素不受外面布局影响),或者简单粗暴方法一个设置margin,一个设置padding

      <style>
      .bfc{
          overflow: hidden;
       }
      </style>
      <div class="container">
          <div class="inner">1</div>
          <div class="bfc">
            <div class="inner">2</div>
          </div>
          <div class="inner">3</div>
      </div>
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12

Last Updated: 2/21/2022, 6:17:41 PM