BFC 的作用以及原理介绍

最近无意间看到很多文章写overflow: hidden可以清除浮动,但大多并没有说明其原理。这里就介绍一下BFC。平时会利用BFC解决一些如清浮动,防止 margin 重叠等问题,但是BFC具体是什么,就感觉只可意会不可言传了,于是特地花了半天时间,查阅了一些资料和文章,记录一下自己的学习过程(其实在《CSS盒子模型》一文中已经提及一些知识,为了方便,这里特地重新开一篇文章,方便以后查阅)。

1、BFC的定义

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

几个概念介绍一下:
Box: CSS布局的基本单位

Box 是 CSS 布局的对象和基本单位,一个页面是由很多个 Box 组成的。元素的类型和 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;

Formatting context

Formatting context 是 W3C CSS2.1 规范中的一个概念。它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。最常见的 Formatting context 有 Block fomatting context (简称BFC)和 Inline formatting context (简称IFC)。

2、BFC布局规则

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

3、生成BFC的元素

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

4、BFC的作用及原理

4.1自适应两栏布局
 <style>
        html,
        body {
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
        }

        .parent {
            width: 100%;
            height: 100%;
            background-color: red;
            overflow: hidden;
        }

        .child1 {
            width: 100px;
            height: 50%;
            text-align: center;
            background-color: cadetblue;
            float: left;
            margin: 10px 20px;
        }

        .child2 {
            width: 200px;
            height: 200px;
            text-align: center;
            margin: 10px;
            background-color: whitesmoke;
            display:inline-block;
              /* overflow: hidden; */
        }
    </style>
</head>

<body>
    <div class="parent">
        <div class="child1">1</div>
        <div class="child2">2</div>
    </div>
</body>
效果

根据第二部分的BFC布局规则第四个,我们只要让child2成为BCF就可以和child1不重叠;再根据第三部分生成BFC的元素的条件,可以为child2设置 display也可以设置overflow等等,可以达到如下图效果



达到了我们希望的自适应两栏布局。

4.2 清除内部浮动

到这里应该知道为什么overflow: hidden可以清除浮动;
第二本部分BFC布局规则第六:计算BFC的高度时,浮动元素也参与计算;
第三部分生成BFC的元素的条件第五:overflow不为visible。
具体例子可以参考我的这篇《常见的清除浮动方法》

4.3 防止垂直 margin 重叠
 <style>
 .child2 {
            width: 200px;
            height: 200px;
            text-align: center;
            margin: 10px;
            background-color: whitesmoke;
            display:inline-block;
              /* overflow: hidden; */
        }
        .child3{
            width: 200px;
            height: 200px;
            text-align: center;
            margin: 80px 10px;
            background-color: whitesmoke;
            display:inline-block;
            /* overflow: hidden; */
        }
 </style>
  <div class="parent">
        <div class="child1">1</div>
        <div class="child2">2</div>
        <div class="child3">3</div>
    </div>

根据BFC布局规则第二:Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠。让child2和child3为不同的BFC的box就不会重叠了。


未设置为BFC,margin重叠
改为BFC,margin不重叠

总结

其实以上的几个例子都体现了BFC布局规则第五条:BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。

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

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,786评论 1 92
  • relative:生成相对定位的元素,通过top,bottom,left,right的位置相对于其正常位置进行定位...
    zx9426阅读 963评论 0 2
  • 先前在学习CSS float时,有同学提到了BFC这个词,作为求知好问的好学生,哪里不懂查哪里,那么今天就来研究一...
    这名字真不对阅读 6,572评论 3 19
  • BFC 已经是一个耳听熟闻的词语了,网上有许多关于 BFC 的文章,介绍了如何触发 BFC 以及 BFC 的一些用...
    ZombieBrandg阅读 645评论 0 0
  • 简介 jQuery是目前使用最广泛的javascript函数库。据统计,全世界排名前100万的网站,有46%使用j...
    奋斗的老王阅读 596评论 0 51