美文网首页Web 前端开发 让前端飞
你所知道的BFC是怎样的?

你所知道的BFC是怎样的?

作者: 葶寳寳 | 来源:发表于2017-08-19 16:10 被阅读0次

什么是BFC?

在解释BFC 是什么之前,需要先介绍BoxFormatting Context的概念。

Box: CSS布局的基本单位   元素的类型和 display 属性,决定了这个 Box 的类型。 不同类型的 Box, 会参与不同的Formatting Context,因此Box内的元素会以不同的方式渲染。让我们看看有哪些盒子:

  • block-level box: display 属性为 block, list-item, table 的元素,会生成 block-level box。并且参与 block fomatting context
  • inline-level box: display 属性为 inline, inline-block, inline-table 的元素,会生成 inline-level box。并且参与inline formatting context
  • run-in box: css3 中的。

Formatting context   是 W3C CSS2.1 规范中的一个概念。它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。

最常见的Formatting contextBlock fomatting context(简称BFC)和 Inline formatting context(简称IFC)。

CSS2.1 中只有 BFCIFC, CSS3 中还增加了 GFCFFC

BFC 定义   BFC(Block formatting context)直译为"块级格式化上下文"。它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。

触发条件或者说哪些元素会生成BFC:

满足下列条件之一就可触发BFC

  • 根元素,即HTML元素
  • float的值不为none
  • overflow的值不为visible
  • display的值为inline-blocktable-celltable-caption
  • position的值为absolutefixed

BFC布局规则:

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

BFC布局规则实例:

  1. Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠
   //html文件
   <div id="left"></div>
   <div id="right"></div>
 //css文件
 div{
   width: 100px;
   height: 100px;
 }
 #left{
   background-color: aquamarine;
   margin: 100px;
 }

 #right{
   background-color: violet;
   margin: 100px;
 }

浏览器效果图如下:两个divmargin发生的重叠变成了100ox

属于同一个BFC的两个相邻Box的margin会发生重叠

此时可以利用BFC阻止margin重叠:

当两个相邻块级子元素分属于不同的BFC时可以阻止margin重叠

操作方法:给其中一个div外面包一个div,然后通过触发外面这个divBFC(例如:设置外层div属性为:overflow: hidden;),就可以阻止这两个divmargin重叠。

2.每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。

 //html文件
 <div id="total">
   <div id="left"></div>
   <div id="right"></div>
 </div>
 #left{
    float: left;
    width: 100px;
    height: 100px;
    background-color: aquamarine;
 }

 #right{
   width: 200px;
   height: 200px;
   background-color: violet;
 }

 #total{
   width: 300px;
   height: 200px;
 }

浏览器效果图:

每个元素的margin box的左边, 与包含块border box的左边相接触

3.BFC的区域不会与float box重叠
将上边的例子中加入以下代码:

#right{
    overflow: hidden;
}

将右边的Box设置在一个独立的BFC区域中。
浏览器效果图如下:

BFC的区域不会与float box重叠

BFC有哪些作用:

  • 自适应两栏布局

  • 可以阻止元素被浮动元素覆盖

  • 分属于不同的BFC时可以阻止margin重叠

  • 可以包含浮动元素——清除内部浮动

     <div id="total">
        <div id="left"></div>
        <div id="right"></div>
    </div>
    
    #left{
      float: left;
      width: 100px;
      height: 100px;
      background-color: aquamarine;
    }
    
    #right{
     float: left;
     width: 100px;
     height: 100px;
     background-color: violet;
    }
    
    #total{
    border: 5px solid blueviolet;
    width: 300px;
    }
    

    浏览器效果图如下:

      没用BFC时的效果

    解析:给这两个子div加浮动,浮动的结果,如果没有清除浮动的话,父div不会将下面两个div包裹,但还是在父div的范围之内,左浮是子div的左边接触父div的border box的左边,右浮是子div接触父divborder box右边,除非设置margin来撑开距离,否则一直是这个规则。

    利用BFC清除内部浮动
    在CSS文件中加入以下代码:

      #total{
        overflow: hidden;
      }
    

    此时浏览器效果如下:


    可以包含浮动元素——清除内部浮动

参考资料
[布局概念] 关于CSS-BFC深入理解
前端精选文摘:BFC 神奇背后的原理(转)

相关文章

  • 你所知道的BFC是怎样的?

    什么是BFC? 在解释BFC 是什么之前,需要先介绍Box、Formatting Context的概念。 Box:...

  • 你所不知道的BFC

    真是一个小例子引发的“命案”呀,原本只是在想为什么一个容器内的块元素几个块元素会发生外边距(margin coll...

  • 前端常见面试题二十三 (CSS)

    什么是块级格式化上下文(BFC)? 什么样的元素会生成BFC? BFC的布局规则是怎样的? BFC 块级格式化上...

  • 技术面经

    加粗代表重点+高频 HTML & CSS 什么是BFC,BFC有什么作用列举你所知道的所有水平垂直居中的方法fle...

  • 什么是BFC

    BFC:即“块级格式化上下文” BFC是在传统布局中实现自适应布局,所产生的一种布局。 那如何触发BFC呢? 下面...

  • ....

    你是不是也会不知所措 不知道怎样是对怎样是错

  • BFC及其应用

    前言 本文包括以下内容: 什么是BFC 如何产生BFC BFC的特点 应用BFC 1、什么是BFC BFC (Bl...

  • 定位

    BFC (隐含的属性)1 父元素的垂直外边距不会和元素重叠2 开启BFC的元素不会被浮动元素所覆盖的3 开启BFC...

  • 05day

    BFC (隐含的属性)1 父元素的垂直外边距不会和元素重叠2 开启BFC的元素不会被浮动元素所覆盖的3 开启BFC...

  • CSS知识汇总1:BFC

    1、为何会有BFC?BFC是谁提出的? “BFC”是Block Formatting Context的缩写,中文为...

网友评论

    本文标题:你所知道的BFC是怎样的?

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