理解css的BFC

321 阅读3分钟

这是我参与更文挑战的第17天,活动详情查看:更文挑战

BFC的定义

BFC(Block formatting context)直译为"块级格式化上下文"。它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。

也就是当BFC起作用的时候,其元素内部无论怎么翻江倒海都不会影响到外部元素。同样,外部元素的变化也不会影响到BFC内部元素,这就跟结界一样。可以理解为有一个很强的护盾在包裹着BFC元素,这也是为什么BFC元素不会发生margin重叠的原因。

BFC的布局规则

  • 内部的Box会在垂直方向,一个接一个地放置。
  • Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠。
  • 每个盒子(块盒与行盒)的margin box的左边,与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
  • BFC的区域不会与float box重叠。
  • BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
  • 计算BFC的高度时,浮动元素也参与计算。

引起BFC的条件

BFC起作用不需要特别多的条件,满足以下情况都会引起BFC:

  • html根元素
  • float不为none的元素
  • overflow为auto、hidden或scroll的元素,即不是visible的元素
  • position不为relative、none或static的元素
  • display为inline-block、table-cell、table-row、table-caption、flex或者inline-flex元素 在清除浮动的时候,只要元素满足以上这些情况,就不需要再加clear属性。

BFC的作用

  1. 利用BFC避免margin重叠。
  • 根据规则第二条:属于同一个BFC的两个相邻Box的margin会发生重叠。所以我们可以设置,两个不同的BFC。
<body>
    <p>查看我的margin是多少</p>
    <div>
        <p>查看我的margin是多少</p>
    </div>
</body>
  1. 自适应两栏布局
  • 根据第三条:每个盒子的margin box的左边,与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。 html:
<body>
    <div class="left">LEFT</div>
    <div class="right">RIGHT</div>
</body>

css:

.left {
    width: 100px;
    height: 150px;
    float: left; // 此处
    background: pink;
    text-align: center;
    line-height: 150px;
    font-size: 24px;
    font-weight: bold;
    color: #fff;
}
.right {
    eight: 300px;
    background: cornflowerblue;
    text-align: center;
    line-height: 300px;
    font-size: 40px;
    font-weight: bold;
    color: #fff;
}

image.png

又因为第四条:BFC的区域不会与float box重叠。
所以让right单独成为一个BFC。

.right {
    overflow: hidden; //增加
}

right会自动的适应宽度,形成了一个两栏自适应的布局。 image.png

  1. 清楚浮动。
    当我们不给父节点设置高度,子节点设置浮动的时候,会发生高度塌陷,这个时候我们就要清楚浮动。
  • 根据第六条:计算BFC的高度时,浮动元素也参与计算