BFC详解

作者: 枸杞辣条 | 来源:发表于2016-11-12 11:01 被阅读492次

    本文归饥人谷和本人所有,如需转载请注明来源

    BFC定义


    在解释BFC之前,先说一下文档流。我们常说的文档流其实分为定位流、浮动流和普通流三种。而普通流其实就是指BFC中的FC。FC是formatting context的首字母缩写,直译过来是格式化上下文,它是页面中的一块渲染区域,有一套渲染规则,决定了其子元素如何布局,以及和其他元素之间的关系和作用。常见的FC有BFC、IFC,还有GFC和FFC。BFC是block formatting context,也就是块级格式化上下文,是用于布局块级盒子的一块渲染区域。

    个人理解是:BFC就是一个有特定规则的区域,这块区域内的元素只遵循特定规则,不受外部影响。

    BFC内部规则。

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

    相信这5个东西都看得有点懵~~所以接下来浓缩介绍最常用的规则整理。

    规则一:BFC是一块独立规则的区域,不受外部影响,而内部元素也不会影响到外部。
    规则二:清楚浮动。触发BFC后能感知得到浮动元素的存在。
    规则三:BFC感知得到浮动元素的高度。

    如何触发BFC

    1. 根元素
    2. float属性不为none
    3. position为absolute或fixed
    4. display为inline-block, table-cell, table-caption, flex, inline-flex
    5. overflow不为visible(常用)

    接下来是一些经典的应用场景。

    • 布局的浮动清除:规则二

    未触发BFC前:
    2.png
    触发BFC后:
    3.png

    HTML:

    <body>
    <div class="header"></div>
      <div class="content">
        <div class="aside">这是设置浮动的元素</div>
        <div class="main"></div>
      </div>
    <div class="footer"></div>
    </body>`
    CSS:
    .header,.footer{
      height:50px;
      background:red;
    }
    .aside{
      height:400px;
      width:200px;
      background:#09f;
      font-size:30px;
      float:left;
    }
    .main{
      height:200px;
      margin-left:200px;
      background:pink
    }
    .content{
      overflow:auto;//在父元素触发BFC,也可以试试其他的触发方式。ps:不过处理起来会比较麻烦。
      //
    }
    

    点击代码演示

    这里我们介绍一下使用BFC清除浮动和用clear清除浮动的区别:

    clear清除浮动:

    <style>
    .header,.footer{
      height:50px;
      background:red;
    }
    .aside{
      height:400px;
      width:200px;
      background:#09f;
      font-size:30px;
      float:left;
    }
    .main{
      height:200px;
      margin-left:200px;
      background:pink
    }
    .clear{
      clear:both;
    }
    </style>
    <div class="header"></div>
      <div class="content">
        <div class="aside">这是设置浮动的元素</div>
        <div class="main"></div>
        <div class="clear"></div>/*在这里添加一个clear的空div*/
      </div>
    <div class="footer"></div>
    

    二者都能达到浮动的效果,不同的是,BFC清除浮动是因为触发到BFC能感知得到浮动元素,计算高度时候浮动元素。而clear清除浮动时候,父元素只计算到.clear的div的高度,但是.clear感知得到浮动元素。当我们添加clear:both的时候,.clear的就被浮动元素挤下去了。规则三

    • 清除外边距。规则二

    未清除边距合并前:

    4.png
    给其中一个添加一个warp并且触发warp的BFC
    5.png
    html:
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <title>JS Bin</title>
    </head>
    <body>
    <div class="content">
      <div class="box1"></div>
      <div class="warp">
        <div class="box2"></div>
      </div>
    </div>
    </body>
    </html>`
    CSS:
    `.box1,.box2{
      width:100px;
      height:100px;
    }
    .box1{
      background:#09f;
      margin-bottom:100px;
    }
    .box2{
      margin-top:100px;
      background:pink;
    }
    .warp{
      overflow:auto;
    }
    

    代码演示点这里

    PS:对比的话可以把Html里面的warp去掉试试。

    再再PS:外边距合并有2种,垂直margin的合并,还有父子margin的合并,在这里后者就不演示了可以点击这里

    结论:

    BFC主要就是围绕这3个主要规则去使用。如果对W3C的理解很困难的话,只需要记住这3个规则和触发BFC的条件就行~~~

    相关文章

      网友评论

        本文标题:BFC详解

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