BFC是什么

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不重叠功能
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,845评论 1 92
  • 一、什么是BFC(Block Formatting Context) 写CSS样式时,对一个元素设置css,我们首...
    26bc1ce853cd阅读 494评论 0 1
  • relative:生成相对定位的元素,通过top,bottom,left,right的位置相对于其正常位置进行定位...
    zx9426阅读 996评论 0 2
  • -- 6.BFC 是什么?如何生成 BFC?BFC 有什么作用?举例说明 BFC的全称是 Block Format...
    动感超逗阅读 1,484评论 0 1
  • Ⓜ️今天的星系印记是KIN 22,太阳的白风。 在白镜子的指引下,我们会更容易关注到那些已被破除掉谎言的真...
    洋葱头818阅读 381评论 0 0