BFC是什么

什么是BFC

  • BFC即 Block Formatting Contexts (块级格式化上下文), 是 W3C CSS2.1 规范中的一个概念。

  • BFC是指浏览器中创建了一个独立的渲染区域,并且拥有一套渲染规则,他决定了其子元素如何定位,以及与其他元素的相互关系和作用。

简单来说就是,BFC是一个完全独立的空间(布局环境),让空间里的子元素不会影响到外面的布局。

BFC的布局规则

  • 内部的Box会在垂直方向,一个接一个地放置。
  • Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠 。
  • 从左往右的格式化,包括浮动。
  • BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
  • 计算BFC的高度时,浮动元素也参与计算。

创建了BFC的元素具有下面的特性:

  • 清除浮动只能清除同一BFC中在它前面的元素的浮动;
  • 外边距折叠(Margin collapsing)也只会发生在属于同一BFC的块级元素之间;
  • BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然;
  • 计算BFC的高度时,考虑BFC所包含的所有元素,连浮动元素也参与计算;
  • 浮动盒区域不叠加到BFC上。

怎样触发BFC

列举几个触发BFCCSS样式:

  • position:absolutefixed;
  • display:inline-blockflexinline-flexgridinline-gridflow-root;
  • overflow值不为visible的块元素。

推荐使用display:flow-root;,它不会带来其他副作用,是一个很好的选择。而overflow:auto;也是一个合适的选择。

BFC的应用

1. float引起父元素高度塌陷

<html>
<head>
    <style>
        .box{
            width: 100px;
            height: 100px;
            background-color: red;
            float: left;
            margin: 30px;
        }
        .container{
            background-color: black;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="box"></div>
        <div class="box"></div>
    </div>
</body>
</html>

效果:
在这里插入图片描述
上面效果设置float脱离文档流,使父元素高度塌陷,可以使用为父元素设置CSS属性触发BFC的方法,实现清除浮动的效果。

修改代码:

        .container{
            background-color: black;
            overflow: hidden;
        }

效果:
在这里插入图片描述

总结几种清除浮动的方法:

  • 触发BFC的方法。
  • 额外标签法:在要清除浮动的元素后额外添加一个空白标签。
  • 伪元素清除浮动法:父级添加伪元素,.container{ content: ""; display: table; clear: both; }

2. 左右布局

<html>
<head>
    <style>
        div{
            width: 200px;
            height: 100px;
            border: 1px solid red;
        }
    </style>
</head>
<body>
    <div style="float: left;">
        左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左左
    </div>
    <div style="width: 300px;">
        右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右
    </div>    
</body>
</html>

效果
在这里插入图片描述
可以看到上面元素,第二个div元素为300px宽度,但是被第一个div元素设置float脱离文档流给覆盖上去了,解决此方法我们可以把第二个div元素设置为一个BFC

修改代码:

    <div style="width: 300px;display: flex;">
        右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右右
    </div>

效果:
在这里插入图片描述

3. 外边距叠加

(1)上下叠加
当一个块级元素出现在另一个块级元素上面时,第一个元素的底外边距和第二个元素的顶外边距发生叠加。
在这里插入图片描述
(2)包含叠加
当一个元素包含在另一个元素中时,他们的顶和底外边距也会发生叠加。
在这里插入图片描述
(3)自身叠加
外边距也可以和本身发生叠加,前提有三个:空元素,有外边距,无内边距/边框。
在这里插入图片描述
如下box2的位置不是在box1下面50px处,而是30px处,发生了自身外边距叠加。叠加按照最大距离30px,box2为参照

<html>
<body>
    <div class="box1" style="margin-top: 30px;margin-bottom: 20px;"></div>
    <div class="box2" style="height: 30px;background-color: red"></div>
</body>
</html>

效果:
在这里插入图片描述
(4)多个叠加
如果这个外边距遇到另一个元素的外边距,它还会发生合并,前提有四个:空元素,有外边距,无内边距/边框,存在多个元素。
在这里插入图片描述
box3在下方40px处,box1叠加后又与box2叠加。叠加按照最大距离40px,box3为参照

<html>
<body>
    <div class="box1" style="margin-top:30px;margin-bottom: 20px;"></div>
    <div class="box2" style="margin-top:20px;margin-bottom: 40px;"></div>
    <div class="box3" style="height: 30px;background-color: red;"></div>
</body>
</html>

效果
在这里插入图片描述
解决外边距重叠问题,可以简单设置其他的marginpadding。参考其他说法可以为元素包裹一个盒子形成一个完全独立的空间,做到里面元素不受外面布局影响,触发BFC,我试了但是不知道为什么没有效果。

外边距合并的解决方法:

  • 父元素添加边框(border-top: 1px solid transparent;);
  • 父元素添加内边距(padding-top: 1px;);
  • 父子元素之间存在行内元素<span>、匿名元素;
  • 父子元素之间存在触发BFC的元素(插入一个dispaly:flow-root;的块级元素);
  • 父元素触发BFCoverflow:auto;等)。

参考资料:
http://t.zoukankan.com/diantao-p-6068202.html
https://blog.youkuaiyun.com/weixin_44165167/article/details/115617978

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值