美文网首页
BFC - 2023-02-17

BFC - 2023-02-17

作者: 勇敢的小拽马 | 来源:发表于2023-02-16 13:18 被阅读0次

BFC的概念

Formatting context(格式化上下文) 是 W3C CSS2.1 规范中的一个概念。它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。

那么 BFC 是什么呢?

BFC 即 Block Formatting Contexts (块级格式化上下文),它属于上述定位方案的普通流。

具有 BFC 特性的元素可以看作是隔离了的独立容器,容器里面的元素不会在布局上影响到外面的元素,并且 BFC 具有普通容器所没有的一些特性。

通俗一点来讲,可以把 BFC 理解为一个封闭的大箱子,箱子内部的元素无论如何翻江倒海,都不会影响到外部。

  • BFC是一个独立的布局环境,可以理解为一个容器,在这个容器中按照一定的规则进行物品摆放,并且不会影响其他环境中的物品。
  • 如果一个元素符合触发BFC的条件,则BFC中的元素布局不受外部影响。
  • 如果浮动元素会创建BFC,则浮动元素内部的子元素都受到该浮动元素的影响,所以浮动元素之间是互不影响的。

BFC的特性

  1. BFC是一个独立的容器,容器内子元素不会影响容器外的元素,反之亦是如此。
  2. 盒子从顶端开始垂直的一个一个的排列,盒子之间垂直的间距是由margin决定的。
  3. 在同一个BFC中,两个相邻的块级盒子的垂直外边距会发生重叠。
  4. BFC区域不会和float box发生重叠。
  5. BFC能够识别并包含浮动元素,当计算其区域的高度时,浮动元素也可以参与计算了。
  6. 计算BFC的高度时,浮动元素也参与计算。

触发BFC

只要元素满足以下任意一种条件就可以触发BFC特性:

  • body根元素
  • 浮动元素:float除none以外的值
  • 绝对定位元素:position(absolute、fixed)
  • display为inline-block、table-cells、flex、inline-flex、table-caption
  • overflow除了visible以外的值(hidden、auto、scroll)

BFC的应用

防止margin重叠(塌陷)
相邻的两个盒子(可能是兄弟关系也可能是祖先关系)的垂直边距相遇时, 它们将形成一个外边距。这个外边距的高度等于两个发生折叠的外边距的高度中的较大者。
外边距折叠的条件是 margin 必须相邻!

<style type="text/css">
    .box{
        color: brown;
        background: rgb(226, 159, 108);
        width: 100px;
        height: 100px;
        text-align: center;
        line-height: 100px;
        margin: 100px;
    }
</style>

<body>
    <div class="box">上面</div>
    <div class="box">下面</div>
</body>
image.png

两个box之间的距离为100px,发生了margin重叠(塌陷),解决这个问题,只需要把其中一个box变为BFC元素即可

<style type="text/css">
    .box {
        color: brown;
        background: rgb(226, 159, 108);
        width: 100px;
        height: 100px;
        text-align: center;
        line-height: 100px;
        margin: 100px;
    }
</style>

<body>
    <div class="box">上面</div>
    <div style="overflow: hidden;">
        <div class="box">下面</div>
    </div>
</body>
image.png

清除内部浮动

  • 浮动元素会脱离文档流(绝对定位元素也会脱离文档流),导致无法计算准确的高度,这种问题称为高度塌陷
  • 解决高度塌陷问题的前提是能够识别并包含浮动元素,也就是清除浮动
<style type="text/css">
    .parent {
        width: 300px;
        border: 2px solid rgb(120, 201, 177);
    }
    .box {
        color: brown;
        background: rgb(226, 159, 108);
        width: 100px;
        height: 100px;
        text-align: center;
        line-height: 100px;
        float: left;
    }
</style>
<body>
    <div class="parent">
        <div class="box">上面</div>
        <div class="box">下面</div>
    </div>
</body>
image.png

如上左图所示,容器(parent)没有高度或者 height = auto ,并且其子元素(box)是浮动元素,所以该容器的高度是不会被撑开的,即高度塌陷。
解决方法:在容器(container)中创建 BFC。

<style type="text/css">
    .parent {
        width: 300px;
        border: 2px solid rgb(120, 201, 177);
        overflow: hidden;
    }
    .box {
        color: brown;
        background: rgb(226, 159, 108);
        width: 100px;
        height: 100px;
        text-align: center;
        line-height: 100px;
        float: left;
    }
</style>

<body>
    <div class="parent">
        <div class="box">上面</div>
        <div class="box">下面</div>
    </div>
</body>
image.png

自适应多栏布局

<style type="text/css">
    body{
        width: 300px;
    }
    .aside {
        width: 100px;
        height: 150px;
        float: left;
        background: rgb(47, 187, 145);
    }
    .main {
        height: 200px;
        background: rgb(171, 75, 156);
    }
</style>
<body>
    <div class="aside">aside</div>
    <div class="main">main</div>
</body>
image.png

这时候main元素有部分被浮动元素所覆盖,(但是文本信息不会被浮动元素所覆盖) 如果想避免元素被覆盖,可以通过触发main生成BFC,以此适应两栏布局

<style type="text/css">
    body{
        width: 300px;
    }
    .aside {
        width: 100px;
        height: 150px;
        float: left;
        background: rgb(47, 187, 145);
    }
    .main {
        height: 200px;
        overflow: hidden;
        background: rgb(171, 75, 156);
    }
</style>

<body>
    <div class="aside">aside</div>
    <div class="main">main</div>
</body>
image.png

相关文章

网友评论

      本文标题:BFC - 2023-02-17

      本文链接:https://www.haomeiwen.com/subject/jlepkdtx.html