美文网首页前端CSS专题
CSS的 BFC与IFC 解析

CSS的 BFC与IFC 解析

作者: 黑木令 | 来源:发表于2021-03-23 21:13 被阅读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>
    
    希望对大家有所帮助,如有问题还望不吝赐教,本人会及时更改;如果大家喜欢可以点个关注(如需转载,请注明出处)。

    相关文章

      网友评论

        本文标题:CSS的 BFC与IFC 解析

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