美文网首页
BFC是什么

BFC是什么

作者: 简默丶XS | 来源:发表于2019-03-05 14:45 被阅读0次

    ps:上个月听朋友说BFC,做了一年多前端了居然不知道是啥,于是百度啥的才知道原来是块级元素排列的机制。虽然感觉比较概念化,但是有些确实挺实用的,整理了一下文档。

    • 先了解FC是什么:Formatting context 是 W3C CSS2.1 规范中的一个概念。它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用
    • 常见的FC有 BFC(块级格式化上下文) 和IFC(行级格式化上下文)。CSS3 中还增加了 GFC 和 FFC。
    • BFC(Block Formatting Context)块级格式化上下文,是Web页面中盒模型布局的CSS渲染模式,指一个独立的渲染区域或者说是一个隔离的独立容器。BFC只有Block-level box(块级元素)参与, 它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。

    哪些元素会生成BFC?

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

    BFC的特性

    1 内部的Box会在垂直方向上一个接一个的放置。
    2 垂直方向上的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠
    3 bfc的区域不会与float的元素区域重叠。
    4 计算bfc的高度时,浮动元素也参与计算
    5 bfc就是页面上的一个独立容器,容器里面的子元素不会影响外面元素。
    

    BFC有什么用?

    1. 双飞燕,圣杯,三栏布局
    <style>
      .warp {
        width: 100%;
        border: 5px solid #999999;
      }
    
      .left {
        height: 300px;
        width: 200px;
        background: red;
        float: left;
      }
    
      .content {
        height: 400px;
        background: green;
        /* BFC */
        overflow: hidden;
      }
    
      .right {
        height: 300px;
        width: 200px;
        background: black;
        float: right;
      }
    
      /* 此方法并没有影响后面的文档流 */
      .test1 {
        background: rgb(192, 107, 107);
        height: 300px;
        width: 200px;
        border: 5px solid darkblue;
      }
    
      .test2 {
        background: rgb(238, 63, 215);
        height: 300px;
        width: 800px;
      }
    </style>
    
    <body>
      <div class="warp">
        <div class="left"></div>
        <div class="right"></div>
        <div class="content"></div>
        <!-- content必须要位于最后一行,因为content占据文档流 -->
        <div style="clear: both;"></div>
        <div class="test1">给我加上了clear:both,又撑起了div,后面的流不变~注意,这个是为了撑起test1之前的内容。。。。当content只有200px时,我出现了塌陷,需要清除浮动~~</div>
      </div>
      <div class="test2">并未受影响</div>
    </body>
    
    没有overflow:hidden效果 overflow:hidden效果

    注意content中的overflow:hidden有无的区别,再参考BFC的第三条:3 bfc的区域不会与float的元素区域重叠

    1. 清除内部浮动,子元素撑不起父元素的高度。
    <style>
      .wrap {
        border: 2px solid darkblue;
        /* BFC */
        overflow: hidden;
      }
    
      .aaa,
      .bbb {
        height: 50px;
        width: 50px;
        float: left;
      }
    
      .aaa {
        background: red;
      }
    
      .bbb {
        background: green
      }
    
      .ccc {
        height: 150px;
        width: 150px;
        background: orange;
      }
    </style>
    
    <body>
      <div class="wrap">
        <div class="aaa"></div>
        <div class="bbb"></div>
      </div>
      <div class="ccc">我是正常元素</div>
    </body>
    
    由于撑不起父级元素,黄色ccc异常 舒服

    利用计算BFC的高度时,浮动元素也参与计算这一特点,就不难理解用BFC清除浮动了

    1. margin重叠的问题
    <style>
      .aaa,
      .bbb {
        height: 50px;
        width: 50px;
      }
    
      .aaa {
        background: red;
        margin-bottom: 100px;
    
      }
    
      .bbb {
        margin-top: 100px;
        background: green
      }
    
      .wrap {
        overflow: hidden;
      }
    </style>
    
    <body>
      <div class="aaa"></div>
      <div class="wrap">
        <div class="bbb"></div>
      </div>
    
    </body>
    
    没有wrap 有wrap

    没有wrap的时候,间距是100px,有wrap的时候,间距是100px。。bbb在没有wrap的情况下,他和aaa是在一个BFC中的(要是不再同一个BFC,怎么会垂直排列呢是吧)。有了warp,bbb就处在独立的BFC下,那么根据2 垂直方向上的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠就不难理解了。

    总结

    1. overflow:hidden 实现BFC
    2. 其实我们一直都在使用BFC,只是你不知道这个概念,你在文档里写块级元素一个个divdivdiv的时候,块级元素一个个在垂直方向整齐的排列,其实他就是BFC在搞得。
    3. 利用BFC可以实现三栏布局不乱插,浮动元素撑高度,margin不重叠功能

    相关文章

      网友评论

          本文标题:BFC是什么

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