CSS: 潜藏着的BFC

在写样式时,每每是添加了一个样式,又或者是修改了某个属性,就达到了咱们的预期。
而BFC就潜藏在其中,当你修改样式时,一不当心就能触发它而毫无察觉,所以没有意识到BFC的神奇之处。css

1、什么是BFC(Block Formatting Context)

写CSS样式时,对一个元素设置css,咱们首先要知道这个元素是块级元素仍是行内元素,而BFC就是用来格式化块级盒子的。html

Formatting Context:指页面中一个渲染区域,而且拥有一套渲染规则,它决定了其子元素如何定位,以及与其余元素的相互关系和做用。前端

BFC定义:块级格式化上下文,它是指一个独立的块级渲染区域,只有Block-level Box参与,该区域拥有一套渲染规则来约束块级盒子的布局,且与区域外部无关。布局

2、BFC的生成

咱们说到BFC是一块渲染区域,那么这块渲染区域到底在哪里呢,具体大小又是多少?这些都是由生成BFC的元素来决定的。flex

知足下列CSS声明之一的元素便会生成BFC:ui

一、根元素或其它包含它的元素

二、float的值不为none;

三、overflow的值不为visible;

四、position的值不为static;

五、display的值为inline-block、table-cell、table-caption;

六、flex boxes (元素的display: flex或inline-flex);

注:也有人认为display: table能生成BFC,我认为最主要缘由是table会默认生成一个匿名的table-cell,正是这个匿名的table-cell生成了BFC。spa

3、BFC的布局规则

简单概括以下:
一、内部的元素会在垂直方向一个接一个地排列,能够理解为是BFC中的一个常规流
二、元素垂直方向的距离由margin决定,即属于同一个BFC的两个相邻盒子的margin可能会发生重叠
三、每一个元素的左外边距与包含块的左边界相接触(从左往右,不然相反),即便存在浮动也是如此,这说明BFC中的子元素不会超出它的包含块
四、BFC的区域不会与float元素区域重叠
五、计算BFC的高度时,浮动子元素也参与计算
六、BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然3d

4、BFC的应用

说了这么多,那么咱们BFC到底有什么用呢?下面咱们经过几个实例来解决一些问题:code

实例一、解决margin重叠问题

玩css的朋友都知道margin collapse,也就是相邻的垂直元素同时设置了margin后,实际margin值会塌陷到其中较大的那个值。
其根本原理就是它们处于同一个BFC,符合“属于同一个BFC的两个相邻元素的margin会发生重叠”的规则。orm

margin重叠现象:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>margin重叠现象</title>
    <style type="text/css">
        *{margin: 0;padding: 0;}
        .box p {
            margin: 20px 0px;
            background-color: skyblue;
        }
    </style>
</head>
<body>
    <div class="box" >
        <p>Lorem ipsum dolor sit.</p>
        <p>Lorem ipsum dolor sit.</p>
        <p>Lorem ipsum dolor sit.</p>
    </div>
</body>
</html>

clipboard.png

clipboard.png

clipboard.png

clipboard.png

经过实验结果咱们发现,上下margin重叠了。

咱们能够在其中一个元素外面包裹一层容器,并触发该容器生成一个BFC。那么两个元素便属于不一样的BFC,就不会发生margin重叠了。
咱们作以下修改:

<div class="box">
    <p>Lorem ipsum dolor sit.</p>
    <div style="overflow:hidden;">
        <p>Lorem ipsum dolor sit.</p>
    </div>
    <p>Lorem ipsum dolor sit.</p>
</div>

clipboard.png

clipboard.png

clipboard.png

咱们使用overflow:hidden;生成了一个BFC,成功解决了margin重叠问题。

实例二、解决浮动问题

咱们知道给父元素设置overflow:hidden能够清除子元素的浮动,但每每都不知道原理是什么。
其实这就是应用了BFC的原理:当在父元素中设置overflow:hidden时就会触发BFC,因此他内部的元素就不会影响外面的布局,BFC就把浮动的子元素高度当作了本身内部的高度去处理溢出,因此外面看起来是清除了浮动。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>BFC浮动问题</title>
    <style>
        .one {
            /* 文档流 里面的文字标签将父元素撑起来 */
            background-color: pink;
        }
        .two {
            float: left;
        }
    </style>
</head>
<body>
    <!-- 文档流 从上到下,当遇到float、position:absolute时,会离开文档流 -->
    <div class="one">
    <div class="two">Hello World!</div>
    </div>
    你好世界!
</body>
</html>

clipboard.png

clipboard.png

咱们作以下修改:

.one {
        background-color: pink;
        overflow: hidden;
    }

clipboard.png

clipboard.png

对比发现,当咱们一个元素设置成为BFC以后,计算BFC元素高度的时候,浮动元素也参与了计算。

实例三、解决侵占浮动元素的问题

咱们知道浮动元素会脱离文档流,而后浮盖在文档流元素上。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>BFC侵占浮动元素的问题</title>
    <style>
        .box1 {
            float: left;
            width: 100px;
            height: 100px;
            background-color: pink;
        }
        .box2 {
            width: 200px;
            height: 200px;
            background-color: skyblue;
        }
    </style>
</head>
<body>
    <div class="box1">box1</div>
    <div class="box2">box2</div>
</body>
</html>

clipboard.png

当一个元素浮动,另外一个元素不浮动时,浮动元素由于脱离文档流就会盖在不浮动的元素上。

咱们作以下修改:

.box2 {
        width: 200px;
        height: 200px;
        background-color: skyblue;
        overflow: hidden;
    }

或以下修改:

.box2 {
        width: 200px;
        height: 200px;
        background-color: skyblue;
        /* overflow: hidden; */
        float: left;
    }

clipboard.png

咱们为非浮动元素创建BFC环境,根据BFC的不与float box重叠的规则,解决了侵占元素问题。

这一特性,我认为仍是颇有用的,特别是应用在两栏布局上,对比咱们常规为非浮动元素或非定位元素设置margin来挤开的方法,其优势在于不须要去知道浮动或定位元素的宽度。

总结

以上就是关于BFC的一些分析,BFC 是一种概念,是对前端布局技术的一种理论上的总结,掌握它可让咱们在使用CSS +DIV进行布局时,知道一些特殊操做以及规避问题的原理。BFC的概念比较抽象,但经过实例分析,有助于咱们对BFC的理解。

在此仅列举了几个例子,欢迎你们一块儿探索更多^_^

相关文章
相关标签/搜索