CSS之BFC

389 阅读2分钟

BFC是什么?

block formatting context,就是块格式化上下文,有点类似js作用域吧。

一. 规则

  • BFC内部的盒子会在垂直方向上,一个接一个放置
  • 盒子的垂直方向由margin决定,同一个BFC下的两个盒子在垂直方向上的margin会发生重叠,取的值是两个盒子相邻margin的最大值
  • BFC区域不会和区域外的浮动盒子发生重叠
  • 计算BFC的高度时,BFC区域内的浮动元素也会参与计算

二. 生成方式

  • 一个根元素
  • 浮动元素(float不为none)
  • 绝对定位元素(positon为absolute或fixed)
  • 行内块级元素(display为inline-block,table-cell,table-caption,flex,inline-flex)
  • overflow不为visible(overflow为hidden)

三.应用

1. 同一个BFC下margin重叠

<style>
 .inner {
      background-color: red;
      margin: 10px 0;
 }
</style>
<div class="inner">1</div>
<div class="inner">2</div>
<div class="inner">3</div>

对照规则2,此时3个元素的上下间隔都是10px,而不是20px,应为他们同属一个BFC。

改为将其放入不同的BFC中

<style>
.container {
    overflow: hidden;
}
.inner {
    background-color: red;
    margin: 10px 0;
}
</style>
<div class="inner">1</div>
<div class="container">
    <div class="inner">2</div>
</div>
<div class="inner">3</div>

2.清除浮动

浮动的元素会脱离文档流,导致父元素高度塌陷

<style>
.container {
    border: 1px solid #000;
}
.inner {
    width: 100px;height: 100px;background: #eee;float: left;
}
</style>
<div class="container">
    <div class="inner"></div>
</div>

对父元素设置BFC后,它将会包裹浮动元素

.container {
    border: 1px solid #000;
    overflow: hidden
}

3.阻止元素被浮动元素覆盖

<style>
.aside {
    width: 100px;
    height: 150px;
    float: left;
    background: #f66;
}
.main {
    height: 200px;
    background: #fcc;
}
</style>
<div class="aside"></div>
<div class="main"></div>

由于aside盒子浮动起来了,脱离了文档流,aside与main的左边界就重合了。

对照规则3,改为让main单独承载一个BFC,比如添加overflow: hidden

.main {
    height: 200px;
    background: #fcc;
    overflow: hidden
}