BFC:块级格式化上下文

117 阅读2分钟

1. 常见的定位方案

1.1 普通流

在普通流中,元素按照其在 HTML 中的先后位置至上而下布局,在这个过程中,行内元素水平排列,直到当行被占满然后换行,块级元素则会被渲染为完整的一个新行,除非另外指定,否则所有元素默认都是普通流定位,也可以说,普通流中元素的位置由该元素在 HTML 文档中的位置决定。

1.2 浮动流

在浮动布局中,元素首先按照普通流的位置出现,然后根据浮动的方向尽可能的向左边或右边偏移,其效果与印刷排版中的文本环绕相似。

1.3 定位流

在绝对定位布局中,元素会整体脱离普通流,因此绝对定位元素不会对其兄弟元素造成影响,而元素具体的位置由绝对定位的坐标决定。

BFC:被隔离的区间

会形成独立的渲染区域,内部元素的渲染不会影响外界。

1. 怎么触发BFC呢?

  • 浮动元素:float属性不为none
  • 绝对定位元素:positionabsolutefixed
  • 块级元素:overflow属性不是visible
  • flex元素
  • inline-block元素
  • html元素

2. 解决什么问题?

  1. 竖直方向上的margin重叠

想要避免外边距重叠,可以把它们放进不同的BFC容器中 例如:

.container {
    overflow: hidden;
}
p {
    width: 100px;
    height: 100px;
    background: lightblue;
    margin: 100px;
}
<div class="container">
    <p></p>
</div>
<div class="container">
    <p></p>
</div>
  1. margin-top传递
.test{
    width: 100px;
    height: 100px;
    background-color: lightgreen;
    /*下面注释的这几种方式都可以的*/
    /* overflow: auto|hidden|scroll; */
    /* position: fixed | absolute; */
    /* float: right | left; */
    /* display: table|flex|grid|inline-block; */
}
.test-box{
    width: 50px;
    height: 50px;
    background-color: lightcoral;
    margin-top: 20px;
}
<div class="test">
    <div class="test-box">
    </div>
</div>
  1. 高度坍塌(清除浮动)
.float-box{
    width: 200px;
    border: 1px solid black;
    /* overflow: scroll | auto | hidden; */
    /* display: table | grid | flex | inline-block; */
    /* position: fixed | absolute; */
    /* float: right | left; */
}
.f-box{
    height: 100px;
    width: 100px;
    background-color: lightgreen;
    float: left;
}
<div class="float-box">
    <div class="f-box"></div>
</div>
  1. 阻止元素被浮动元素覆盖 下面代码展示的一个文字环绕效果中,第二个div有一部分被浮动元素覆盖了。
<div style="height: 100px;width: 100px;float: left;background: lightblue">我是一个左浮动的元素</div>
<div style="width: 200px; height: 200px;background: #eee">我是一个没有设置浮动, 
    也没有触发 BFC 元素, width: 200px; height:200px; background: #eee;</div>

这个时候触发第二个元素的BFC特性,例如加上overflow: hidden,第二个元素就不会被浮动元素覆盖。

参考资料:

10 分钟理解 BFC 原理