zoukankan      html  css  js  c++  java
  • CSS之BFC的使用场景

    BFC(Block formatting context )“块级格式上下文”。 是用于布局块级盒子的一块渲染区域。并且与这个区域的外部毫无关系。

    BFC

    定义:BFC(Block formatting context )“块级格式上下文”。 是用于布局块级盒子的一块渲染区域。并且与这个区域的外部毫无关系。

    特性

    • 1.处于同一个BFC中的元素相互影响,可能会发生margin合并(垂直方向);
    • 2.BFC在页面上是一个独立的容器,容器里面的子元素不会影响到外面的元素,反之亦然;
    • 3.计算BFC的高度时,考虑BFC所包含的所有元素,包括浮动元素也参与计算;
    • 4.浮动盒的区域不会叠加到BFC上;

    形成规则

    • 浮动(float的值不为none);
    • 绝对定位元素(position的值为absolute或fixed);
    • 行内块(display为inline-block)
    • 表格单元(display为table、table-cell、table-caption等HTML表格相关属性);
    • 弹性盒(display为flex或inline-flex);
    • overflow不为visible;

    BFC使用场景:
    1.防止垂直margin重叠
    边界重叠是指两个或多个盒子(可能相邻也可能嵌套)的相邻边界(其间没有任何非空内容、补白、边框)重合在一起而形成一个单一边界。
    两个或多个块级盒子的垂直相邻边界会重合,它们的边界宽度是相邻边界宽度中的最大值。注意水平边界是不会重合的。

    a:防止父子元素的边界重叠
    默认效果:若块元素和它的第一个子元素(或最后一个子元素)之间没有 border、padding、inline content、 clearance 来分隔,那么上边距(或下边距)会被父子元素所共享,父子元素边界重合
    解决方案:根据BFC的特性2,让父元素成为BFC即可。
    示例:

    <style>
        .parent {
            background: #E7A1C5;
            /*overflow:hidden使其形成一个BFC*/
            overflow:hidden;
        }
        .parent .child {
            background: #C8CDF5;
            height: 100px;
            margin-top: 10px;
        }
    </style>
    <section class="parent">
        <article class="child"></article>
    </section>
    

    前后对比:
    BFC解决父子元素边界重叠前效果 BFC解决父子元素边界重叠

    b:防止兄弟元素的边界重叠
    默认效果:在同一个BFC中的两个元素垂直方向上的margin会发生合并,外边距以大的为准
    示例:默认效果

    <style>
        #margin {
            background: #E7A1C5;
            overflow: hidden;
             300px;
        }
        #margin>p {
            background: #C8CDF5;
            margin: 20px auto 30px;
        }
    </style>
    <section id="margin">
        <p>1</p>
        <p>2</p>
        <p>3</p>
    </section>
    

    默认效果:
    兄弟元素边界重叠
    可以看到1和2,2和3之间的间距不是50px,发生了边距重叠是取了它们之间的最大值30px。(垂直方向margin合并)
    解决方案:根据BFC的特性2,在不需要margin合并的元素外创建一个BFC上下文(外围用一个BFC包裹)

    <section id="margin">
        <p>1</p>
        <!--外围创建一个BFC上下文-->
        <div style="overflow:hidden;">
            <p>2</p>
        </div>
        <p>3</p>
    </section>
    

    修改后效果:
    兄弟元素边界重叠修复后;
    注:其实空元素的边界也会重叠(假设有一个空元素,它有外边距,但是没有边框或填充。在这种情况下,上外边距与下外边距就碰到了一起,它们会发生合并,这个时候只需要在上下边距之间有填充即可)
    空白元素边界重叠

    2.阻止元素被浮动的元素覆盖(可做两栏布局自适应)
    默认效果:某元素会被旁边浮动元素遮盖
    解决方案:根据BFC特性4,让该元素成为BFC即可
    示例:

     <style>
            .box {
                 400px;
                height: 100px;
                margin: 0  auto;
            }
            .green {
                 100px;
                height: 50px;
                float: left;
                background-color: green;
            }
            .red {
                 200px;
                height: 100px;
                /*添加overflow:hidden使红色盒子成为BFC*/
                overflow: hidden;
                background-color: red;
            }
        </style>
    </head>
    <body>
        <div class="box">
            <div class="green"></div>
            <div class="red">BFC</div>
        </div>
    </body>
    

    前后对比
    浮动元素遮挡普通元素兄弟元素边界重叠修复后
    注:将红色盒子设置为BFC后,若该盒子没有设置宽度,则该盒子会根据父元素和绿色盒子(浮动元素)的宽度来进行自适应,因此可做两栏布局自适应。

    3.清除子元素浮动的副作用
    默认效果:当我们不给父元素设置高度,子元素设置浮动的时候,父元素会发生高度塌陷
    解决方案:根据BFC特性3,让父元素成为BFC即可
    示例:

     <style>
            .box {
                 200px;
                border: 1px solid #ccc;
                /*添加overflow:hidden使其成为BFC*/
                overflow:hidden;
            }
            .son {
                 100px;
                height: 100px;
                background-color: green;
                float: left;
            }
        </style>
    </head>
    <body>
        <div class="box">
            <div class="son"></div>
        </div>
    </body>
    

    前后对比:
    浮动副作用清除浮动

    IFC

    定义:Inline Formatting Contexts,也就是“内联格式化上下文”。

    特性:

    • 1.子元素水平方向横向排列,并且垂直方向起点为元素顶部。
    • 2.子元素只会计算横向样式空间,【padding、border、margin】,垂直方向样式空间不会被计算,【padding、border、margin】。
      在垂直方向上,子元素会以不同形式来对齐(vertical-align)
    • 3.能把在一行上的框都完全包含进去的一个矩形区域,被称为该行的行框(line box)。行框的宽度是由包含块(containing box)和与其中的浮动来决定。
    • 4.IFC中的“line box”一般左右边贴紧其包含块,但float元素会优先排列。
    • 5.IFC中的“line box”高度由 CSS 行高计算规则来确定,同个IFC下的多个line box高度可能会不同。
    • 6.当 inline-level boxes的总宽度少于包含它们的line box时,其水平渲染规则由 text-align 属性值来决定。
    • 7.当一个“inline box”超过父元素的宽度时,它会被分割成多个boxes,这些 oxes 分布在多个“line box”中。如果子元素未设置强制换行的情况下,“inline box”将不可被分割,将会溢出父元素。

    形成规则:

    • 块级元素中仅包含内联级别元素

    ps:是当IFC中有块级元素插入时,会产生两个匿名块将父元素分割开来,产生两个IFC

    IFC产生的现象:
    1.文本的上下间距不生效(IFC特性2导致)

    <style>
    .warp { border: 1px solid red; display: inline-block; }
    .text {
      /*内联元素只有左右margin生效了*/
      margin: 20px;
      background: green;
      }
    </style>
    <div class="warp">
        <span class="text">文本一</span>
        <span class="text">文本二</span>
    </div>
    

    效果:左右margin撑开,上下margin并未撑开,符合IFC规范,只计算横向样式控件,不计算纵向样式空间。
    IFC中文本上下间距不生效.png

    2.多个元素水平居中(IFC特性6导致)

    <style>
      .warp { border: 1px solid red;  200px; text-align: center; }
      .text { background: green; }
    </style>
    <div class="warp">
        <span class="text">文本一</span>
        <span class="text">文本二</span>
    </div>
    

    效果:水平排列规则根据IFC容器的text-align值来排列,可以用来实现多个子元素的水平居中。

    3.float元素优先排列(IFC特性4导致)

    <style>
    .warp { border: 1px solid red;  200px; }
    .text { background: green; }
    .f-l { float: left; }
    </style>
    <div class="warp">
        <span class="text">这是文本1</span>
        <span class="text">这是文本2</span>
        <span class="text f-l">这是文本3</span>
        <span class="text">这是文本4</span>
    </div>
    

    效果:IFC中具备float属性值的元素优先排列,在很多场景中用来在文章段落开头添加“tag”可以用到。
    IFC使元素水平居中
    利用IFC还可以做很多其他的事情,例如:解决元素垂直居中、多个文本元素行高不一致排列混乱。

    FFC

    FFC(Flex Formatting Contexts)直译为"自适应格式化上下文",display值为flex 或者 inline-flex 的元素将会生成自适应容器(flex container)。

    GFC

    GFC(GridLayout Formatting Contexts)直译为"网格布局格式化上下文",即display值为grid的元素
    和 table 的区别:同样是一个二维表格,gridLayout 会以更加丰富的属性来控制行列、控制对齐以及更精细的控制语义


    相关问题:

    BFC定义:块级格式化上下文,BFC就是一个页面上独立的容器,规定了内部的块级元素如何布局,并且这些块级元素不会影响外部元素。
    BFC有以下约束规则:
    1.内部的BOX会在垂直方向上一个接一个的放置
    2.同一个BFC的两个相邻BOX的margin会发生重叠
    3.每个元素的左外边距和包含块的左边界相接触
    4.BFC的区域不会和float的区域重叠
    5.计算BFC高度时,浮动子元素也参与计算
    BFC的作用
    1.自适应两栏布局
    2.清除浮动
    3.防止垂直margin重叠
    BFC的生成条件
    1.根元素
    2.overflow不为visiable
    3.float不为none
    4.position属性为absolute/fixed
    5.display为inline-block、table-cell、flex等
    清除浮动的方法
    1.父元素BFC overflow:hidden
    2.新增底部兄弟元素 clear:both 块级元素的左右都不能有浮动元素
    3.添加自身伪元素 伪元素是元素的子元素,在元素的内容之前或者之后

  • 相关阅读:
    GBPR: Group Preference Based Bayesian Personalized Ranking for One-Class Collaborative Filtering-IJACA 2013_20160421
    BPR: Bayesian Personalized Ranking from Implicit Feedback-CoRR 2012——20160421
    基于矩阵分解的推荐算法
    svmlight使用说明
    论文笔记Outline
    Libliner 中的-s 参数选择:primal 和dual
    查询日志方法
    集合 Vector ArrayList 集合一
    c语言 常用知识点
    简单的c语言小程序 回光返照
  • 原文地址:https://www.cnblogs.com/ggymx/p/13780848.html
Copyright © 2011-2022 走看看