前端CSS专题

CSS的 BFC与IFC 解析

2021-03-23  本文已影响0人  黑木令

1. BFC

  1. 正常的流中就是如何把文档中的元素呈现出来, 而布局呈现的规则就是 BFC、IFC 和 相对位移, 而 BFC 与 IFC 简单来说就是一个规则 。

  2. BFC 用于块级元素, IFC 用于行内元素 。

  3. 所谓 BFC 就是 块级 格式化上下文, Block Formatting Context; 在常规流中竖着排列 。

  4. IFC 就是 行内 格式化上下文, Inline Formatting Content; 在常规流中横着排列 。

  5. 除了常规流会影响布局外, 还有 浮动 和 绝对定位 。


2. BFC 规则:

  1. 如果给一个元素创建了一个 BFC, 就相当于创建了一个新的容器(一个独立的容器), 容器内和容器外中的元素不会相互影响 。 外边的 BFC 规则, 不会对容器里的 BFC 产生影响, 而容器里面的 BFC 也不会对容器外的 BFC 产生影响, 也就是相互隔绝, 互不影响 。

  2. 盒子的布局开始是从包含容器的顶部开始的 。

  3. BFC 内部的盒子会在内部一个接着一个在垂直方向排列 。

  4. 盒子的垂直方向的距离由 margin 决定, 但是在同一个 BFC 中, 在两个相邻的块级元素中, 垂直 margin 会发生折叠 。

  5. BFC 的区域不会与浮动(float)元素的 box 重叠, 可以用来清除浮动和布局 。

  6. 每个盒子的左边界都要紧靠包含容器的左边界 (这也就解释了为什么块级元素都是单独成一行的, 如果不单独成行, 第二个盒子的左边界怎么紧靠包含容器的左边界)

  7. 计算 BFC 高度的时候, 浮动元素也会参与计算 。


3. 如何产生新的 BFC:

  1. float 的值不为 none。

  2. overflow 的值不为 visible; 可使用 overflow: hidden 或者 overflow: auto 。

  3. display 的值为 table-cell, table-caption, inline-block 中的任何一个; 也可使用 flex、table、grid 。

  4. position 的值不为 relative 和 static 。

  5. 根元素或者其他包含它的元素

  6. 当一个元素设置了新的 BFC 后, 就和这个元素外部的 BFC 没有关系了, 这个元素只会去约束自己内部的子元素 。


4. 实际应用:

  1. 清除浮动

  2. margin 折叠问题


5. IFC 规则:

  1. 盒子是水平一个接一个的排列, 水平的 margin, 内边距, 边框是可以有的 。

  2. 垂直方向的对齐, 可能是底部对齐, 顶部对齐, 也可能是基线对齐 。

  3. 行框中的内联盒子的高度小于行框的高度时, 内联盒子的垂直方向的对齐方式取决于 vertical-align 属性

  4. 当一个行框水平不能容纳内联盒子时, 他们将会在垂直方向上产生多个行框, 他们上下一个挨着一个, 但是不会重叠

  5. 一般来说, 行框的左边界紧挨着包含容器的左边界, 行框的右边界紧挨着包含容器的右边界, (是两个边都紧挨着)。然而, 浮动盒子可能存在于包含边框边界和行框边界之间 。



6. 图例:

1-1-1-1.png

6. 代码示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>BFC</title>
</head>
<style>
    html * {
        padding: 0;
        margin: 0;
    }
    /* 父子元素的边距重叠 */
    #sec1 {
        background-color: slategray;
        /* 在我们没有添加 overflow: hidden 之前父元素的高度是 100 , 在我们添加了 overflow: hidde之后 , 父元素的高度是 110 , 这个是为什么呢? */
        /* 添加了 overflow: hidden  相当于给父元素添加了 BFC : 块级格式化上下文  */
        /* overflow: hidden; */
    }
    .child1 {
        height: 300px;
        width: 80%;
        background-color: brown;
        margin-top: 30px;
    }
    /* 兄弟元素的边距重叠 */
    /* 它重叠的原则就是取最大值 */
    /* 它们上下的边距会合并 , 合并为较大的哪一个 */
    #sec2 {
        background-color: yellowgreen;
    }
    #sec2 p {
        height: 100px;
        background-color: #555;
        margin-top: 20px;
        margin-bottom: 20px;
    }
    .children1 {
        overflow: auto;
    }

</style>
<body>
    <!-- 父子元素的边距重叠 -->
    <section id="sec1">
      <article class="child1">
        父子元素的边距重叠
        <p>/* 在我们没有添加 overflow: hidden 之前父元素的高度是 100 , 在我们添加了 overflow: hidde之后 , 父元素的高度是 110 , 这个是为什么呢? */</p>
        <p>/* 添加了 overflow: hidden  相当于给父元素添加了 BFC : 块级格式化上下文  */</p>
        <p>/* overflow: hidden; */</p>
      </article>
    </section>

    <!-- 兄弟元素的边距重叠 -->
    <!-- 怎么解决这个边距重叠的问题: 我们在子元素的外层添加一个父元素, 并且设置它的 BFC -->
    <section id="sec2">
      <p>
        /* 兄弟元素的边距重叠 */<br>
        /* 它重叠的原则就是取最大值 */<br>
        /* 它们上下的边距会合并 , 合并为较大的哪一个 */<br>
      </p>
      <div class="children1">
          <p>兄弟元素的边距重叠22222</p>
      </div>
      <p>兄弟元素的边距重叠33333</p>
      <p>兄弟元素的边距重叠33333</p>
      <p>兄弟元素的边距重叠33333</p>
    </section>
</body>

</html>
希望对大家有所帮助,如有问题还望不吝赐教,本人会及时更改;如果大家喜欢可以点个关注(如需转载,请注明出处)。
上一篇下一篇

猜你喜欢

热点阅读