BFC块格式化上下文

2019-12-30  本文已影响0人  agamgn

一、BFC是什么

BFC(块格式化上下文): 是Web页面可视化渲染CSS的一部分, 是布局过程中生成块级盒子的区域。也是浮动元素与其他元素的交互限定区域。
简单的说BFC就是CSS渲染定位的一个概念,就是一个块级元素的渲染显示规则。

要明白BFC到底是什么,首先要了解CSS 视觉格式化模型,如果你对概念不感兴趣,可以直接跳到如何创建BFC

视觉格式化模型

CSS 视觉格式化模型(visual formatting model)是用来处理和在视觉媒体上显示文档时使用的计算规则。该模型是 CSS 的基础概念之一。

视觉格式化模型定义了盒子(Box)的生成,用于从文档元素生成盒子。盒子主要包括了块盒子、行内盒子、匿名盒子(没有名字不能被选择器选中的盒子)以及其他盒子(一些实验性的,在未来可能添加到规范中)。盒子的类型由display属性决定。

块盒子

块盒子具有以下特性:

行内盒子

行内盒子具有以下特性:

匿名盒子

匿名盒子分为块级匿名盒子和行内匿名盒子,因为匿名盒子没有名字,不能利用选择器来选择它们,所以它们的所有属性都为inherit或初始默认值;
如下面例子,会创键匿名块盒来包含毗邻的行内级盒:

<div>
Some inline text 
<p>followed by a paragraph</p>
 followed by more inline text.
</div>
anonymous_block-level_boxes.png
其他类型的盒子

行盒子:行盒子由行内格式化上下文创建,用来显示一行文本。
Run-in 盒子:Run-in 盒子通过 display:run-in 来定义,它可以是块盒子,也可以是行内盒子,这取决于紧随其后的盒子的类型
由其他模型引入的盒子:
①表格内容模型可能会创建一个表格包装器盒子和一个表格盒子,以及多个其他盒子如表格标题盒子等
②多列内容模型可能会在容器盒子和内容之间创建多个列盒子

定位规则

一旦生成了盒子以后,CSS引擎就需要定位它们以完成布局,盒就是定位的基本单位,在定位时,有三种常见的定位方案。

普通流
浮动
绝对定位

二、BFC的创建

三、BFC的范围

一个BFC包含创建该上下文元素的所有子元素,但不包括创建了新BFC的子元素的内部元素。也就是说一个元素不能同时存在于两个BFC中。

<div id='div_1' class='BFC'>
    <div id='div_2'>
        <div id='div_3'></div>
        <div id='div_4'></div>
    </div>
    <div id='div_5' class='BFC'>
        <div id='div_6'></div>
        <div id='div_7'></div>
    </div>
</div>

这段代码表示,#div_1创建了一个块格式上下文,这个上下文包括了#div_2、#div_3、#div_4、#div_5。即#div_2中的子元素也属于#div_1所创建的BFC。但由于#div_5创建了新的BFC,所以#div_6和#div_7就被排除在外层的BFC之外。
BFC的一个最重要的效果是,让处于BFC内部的元素与外部的元素相互隔离,使内外元素的定位不会相互影响

四、BFC的特性

五、BFC的应用案例

1.使 BFC 内部的浮动元素不会到处乱跑(如:浮动,定位)
        .out{
            border: 10px solid red;
            min-height: 20px;
        }
        .in{
            background-color:darkorchid;
            height:100px;
            width: 100px;
            float: left;
        }
  <div class="out">
      <div class="in"></div>
  </div>
浮动.png

这时里面的元素使用了float,它脱离了普通文档流,如何让外成的元素包裹住内层元素呢,这时候让外层产生一个BFC就可以了。


浮动BFC.png

这就是 BFC 的第一个作用:使 BFC 内部的浮动元素不会到处乱跑。

2.和浮动元素产生边界
.divs{
            margin-top: 10px;
            border: 3px solid red;
            height: 100px;
        }
        .left{
            min-width: 200px;
            margin-right: 20px;
            float: left;
        }
        .right{
            border-color: blue;
        }
 <div class="divs left"></div>
  <div class="divs right"></div>
和浮动元素产生边界.png

在没有BFC的情况下,需要将margin-left加入到非浮动元素上,大小值为浮动元素的宽度+需要隔离的宽度,如果让非浮动元素产生BFC效果,则只需让浮动元素添加margin-right就可以了


和浮动元素产生边界1.png

六、总结

BFC的概念比较抽象,但通过实例分析应该能够更好地理解BFC。
代码地址

七、参考

视觉格式化模型_MDN
块格式化上下文_MDN

上一篇 下一篇

猜你喜欢

热点阅读