CSS 中的 BFC

发布于 2024-02-27 12:55:07 字数 5558 浏览 17 评论 0

BFC 是什么?

BFC ( Block Formatting Contexts ) 即块级格式化上下文,从样式上看,它与普通的容器没有什么区别,但是从功能上, BFC 可以看作是隔离了的独立容器,容器里面的元素不会在布局上影响到外面的元素,并且 BFC 具有普通容器没有的一些特性,例如可以包含浮动元素,使到它可以包含浮动元素,从而防止出现高度塌陷的问题


如何触发 BFC

  • 触发 BFC 的条件
    • 浮动元素, floatnone 以外的值
    • 绝对定位元素, positionabsolutefixed
    • display 为以下其中之一的值 inline-blockstable-cellstable-captions
    • overflow 除了 visible 以外的值( hiddenautoscroll
    • CSS3 中, BFC 叫做 Flow Root ,并增加了一些触发条件:
      • displaytable-caption
      • positionfixed 值,其实 fixedabsolute 的一个子类,因此在 CSS2.1 中使用这个值也会触发 BFC ,只是在 CSS3 中更加明确了这一点

BFC 布局规则

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

BFC 的作用及原理

  • 自适应两栏布局
body {
       width: 300px;
       position: relative;
   }
   .aside {
       width: 100px;
       height: 150px;
       float: left;
       background: #f66;
   }
   .main {
       height: 200px;
       background: #fcc;
   }
 <body>
       <div class="aside"></div>
       <div class="main"></div>
</body>

  • 根据 BFC 布局规则第 3 条:
    • 每个元素的 margin box 的左边, 与包含块 border box 的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
  • 因此,虽然存在浮动的元素 aslide ,但 main 的左边依然会与包含块的左边相接触
  • 根据 BFC 布局规则第四条:
    • BFC 的区域不会与 float box 重叠
  • 我们可以通过通过触发 main 生成 BFC , 来实现自适应两栏布局
.main {
    overflow: hidden;
}
  • 当触发 main 生成 BFC 后,这个新的 BFC 不会与浮动的 aside 重叠。因此会根据包含块的宽度,和 aside 的宽度,自动变窄。效果如下:

  • 清除内部浮动
.par {
    border: 5px solid #fcc;
    width: 300px;
 }

.child {
    border: 5px solid #f66;
    width: 100px;
    height: 100px;
    float: left;
}
<body>
    <div class="par">
        <div class="child"></div>
        <div class="child"></div>
    </div>
</body>

  • 根据 BFC 布局规则第六条:
    • 计算 BFC 的高度时,浮动元素也参与计算
  • 为达到清除内部浮动,我们可以触发 par 生成 BFC ,那么 par 在计算高度时, par 内部的浮动元素 child 也会参与计算
.par {
    overflow: hidden;
}

  • 防止垂直 margin 重叠
p {
    color: #f55;
    background: #fcc;
    width: 200px;
    line-height: 100px;
    text-align: center;
    margin: 100px;
}
<p>Haha</p>
<p>Hehe</p>

  • 两个 p 之间的距离为 100px ,发送了 margin 重叠
  • 根据 BFC 布局规则第二条:
    • Box 垂直方向的距离由 margin 决定。属于同一个 BFC 的两个相邻 Box 的 margin 会发生重叠
  • 我们可以在 p 外面包裹一层容器,并触发该容器生成一个 BFC 。那么两个 P 便不属于同一个 BFC ,就不会发生 margin 重叠了
.wrap {
    overflow: hidden;
}
p {
    color: #f55;
    background: #fcc;
    width: 200px;
    line-height: 100px;
    text-align: center;
    margin: 100px;
}
<p>Haha</p>
<div class="wrap">
    <p>Hehe</p>
</div>


总结

其实以上的几个例子都体现了 BFC 布局规则第五条,BFC 就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此

因为 BFC 内部的元素和外部的元素绝对不会互相影响,因此, 当 BFC 外部存在浮动时,它不应该影响 BFC 内部 Box 的布局, BFC 会通过变窄,而不与浮动有重叠。同样的,当 BFC 内部有浮动时,为了不影响外部元素的布局, BFC 计算高度时会包括浮动的高度。避免 margin 重叠也是这样的一个道理

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

じее

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

我们的影子

文章 0 评论 0

素年丶

文章 0 评论 0

南笙

文章 0 评论 0

18215568913

文章 0 评论 0

qq_xk7Ean

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文