当前位置:首页 > 前端 > 正文内容

什么是BFC?看这一篇就够了

放牧的风3年前 (2021-06-16)前端6213

BFC 定义

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

在解释什么是BFC之前,我们需要先知道Box、Formatting Context的概念。

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;

  • run-in box: css3 中才有, 这儿先不讲了。

Formatting Context

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

BFC是一个独立的布局环境,其中的元素布局是不受外界的影响,并且在一个BFC中,块盒与行盒(行盒由一行中所有的内联元素所组成)都会垂直的沿着其父元素的边框排列。

BFC的布局规则

  • 内部的Box会在垂直方向,一个接一个地放置。

  • Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠。

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

  • BFC的区域不会与float box重叠。

  • BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。

  • 计算BFC的高度时,浮动元素也参与计算。

如何创建BFC

  • float的值不是none。

  • position的值不是static或者relative。

  • display的值是inline-block、table-cell、flex、table-caption或者inline-flex

  • overflow的值不是visible

BFC的作用

1.利用BFC避免margin重叠。

一起来看一个例子:

<!DOCTYPE html>
<html>
<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>
</head>
<style>
    *{
        margin: 0;
        padding: 0;
    }
    p {
        color: #f55;
        background: yellow;
        width: 200px;
        line-height: 100px;
        text-align:center;
        margin: 30px;
    }
</style>
<body>
    <p>看看我的 margin是多少</p>
    <p>看看我的 margin是多少</p>
</body>
</html>

页面生成的效果就是这样的:

20190323155704915.png

根据第二条,属于同一个BFC的两个相邻的Box会发生margin重叠,所以我们可以设置,两个不同的BFC,也就是我们可以让把第二个p用div包起来,然后激活它使其成为一个BFC

<!DOCTYPE html>
<html>
<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>
</head>
<style>
    *{
        margin: 0;
        padding: 0;
    }
    p {
        color: #f55;
        background: yellow;
        width: 200px;
        line-height: 100px;
        text-align:center;
        margin: 30px;
    }
    div{
        overflow: hidden;
    }
</style>
<body>
    <p>看看我的 margin是多少</p>
    <div>
        <p>看看我的 margin是多少</p>
    </div>
</body>
</html>

20190323160150540.png

2.自适应两栏布局

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

<!DOCTYPE html>
<html>
<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>Document</title>
</head>
<style>
    *{
        margin: 0;
        padding: 0;
    }
    body {
        width: 100%;
        position: relative;
    }
 
    .left {
        width: 100px;
        height: 150px;
        float: left;
        background: rgb(139, 214, 78);
        text-align: center;
        line-height: 150px;
        font-size: 20px;
    }
 
    .right {
        height: 300px;
        background: rgb(170, 54, 236);
        text-align: center;
        line-height: 300px;
        font-size: 40px;
    }
</style>
<body>
    <div>LEFT</div>
    <div>RIGHT</div>
</body>
</html>

页面:

2019032316073845.png

又因为:BFC的区域不会与float box重叠。

所以我们让right单独成为一个BFC

<!DOCTYPE html>
<html>
<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>Document</title>
</head>
<style>
    *{
        margin: 0;
        padding: 0;
    }
    body {
        width: 100%;
        position: relative;
    }
 
    .left {
        width: 100px;
        height: 150px;
        float: left;
        background: rgb(139, 214, 78);
        text-align: center;
        line-height: 150px;
        font-size: 20px;
    }
 
    .right {
        overflow: hidden;
        height: 300px;
        background: rgb(170, 54, 236);
        text-align: center;
        line-height: 300px;
        font-size: 40px;
    }
</style>
<body>
    <div>LEFT</div>
    <div>RIGHT</div>
</body>
</html>

页面:

20190323161159873.png

right会自动的适应宽度,这时候就形成了一个两栏自适应的布局。

3.清除浮动

当我们不给父节点设置高度,子节点设置浮动的时候,会发生高度塌陷,这个时候我们就要清除浮动。

比如这样:

<!DOCTYPE html>
<html>
<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>清除浮动</title>
</head>
<style>
    .par {
        border: 5px solid rgb(91, 243, 30);
        width: 300px;
    }
    
    .child {
        border: 5px solid rgb(233, 250, 84);
        width:100px;
        height: 100px;
        float: left;
    }
</style>
<body>
    <div>
        <div></div>
        <div></div>
    </div>
</body>
</html>

页面:

20190323161720931.png

这个时候我们根据最后一条:计算BFC的高度时,浮动元素也参与计算。

给父节点激活BFC

<!DOCTYPE html>
<html>
<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>清除浮动</title>
</head>
<style>
    .par {
        border: 5px solid rgb(91, 243, 30);
        width: 300px;
        overflow: hidden;
    }
    
    .child {
        border: 5px solid rgb(233, 250, 84);
        width:100px;
        height: 100px;
        float: left;
    }
</style>
<body>
    <div>
        <div></div>
        <div></div>
    </div>
</body>
</html>

页面:

20190323161945489.png

总结

以上例子都体现了:

BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。

因为BFC内部的元素和外部的元素绝对不会互相影响,因此, 当BFC外部存在浮动时,它不应该影响BFC内部Box的布局,BFC会通过变窄,而不与浮动有重叠。同样的,当BFC内部有浮动时,为了不影响外部元素的布局,BFC计算高度时会包括浮动的高度。避免margin重叠也是这样的一个道理。


扫描二维码推送至手机访问。

版权声明:本文由放牧的风发布,如需转载请注明出处。

本文链接:https://grazingwind.com/post/69.html

标签: 前端CSSBFC
分享给朋友:

相关文章

Chrome浏览器开启Ajax跨域访问调试

Chrome浏览器开启Ajax跨域访问调试

由于浏览器安全性限制,Ajax是不能跨域访问的,而我们在日常开发工作中,经常会出现本地开发环境需要访问其他服务器上的API情况。提示信息为:Access to XMLHttpRequest at 'http://****'...

webstorm中用npm运行任务(即显示npm面板)

webstorm中用npm运行任务(即显示npm面板)

第一步右击package.json文件,点击show npm Scripts第二步出现npm面板第三步点击即可运行任务  ...

JavaScript for...of与for...in的区别

JavaScript for...of与for...in的区别

无论是for…in还是for…of语句都是迭代一些东西。它们之间的主要区别在于它们的迭代方式。for…in 语句以原始插入顺序迭代对象的可枚举属性。for…of 语句遍历可迭代对象定义要迭代的数据。以下示例显示了与Array一起使用时,fo...

跨域资源共享 CORS 详解

跨域资源共享 CORS 详解

CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。本文详...

经得住拷问的HTTPS原理解析

经得住拷问的HTTPS原理解析

此文涵盖的大致内容:理解HTTPS原理的概念什么是对称加密和非对称加密?什么是数字签名?怎么生成?怎么校验?啥时候是对称加密?啥时候是非对称加密?啥时候进行算法加密?什么算法?第三方机构包含哪些?HTTPS 是什么?具体流程HTTPS和HT...

彻底理解浏览器的缓存机制

彻底理解浏览器的缓存机制

概述浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的缓存标识进行的,所以在分析浏览器缓存机制之前,我们先使用图文简单介绍一下HTTP报文,HTTP报文分为两种:HTTP请求(Request)报文,报文格式为:请求行...

评论列表

游客
9分钟前

吹牛的人越来越多了!http://www.dnf70.com/2780.html

游客
11分钟前

网站做得不错http://www.a5km.com/yxgl/jdqs/27371.html

游客
23分钟前

管它三七二十一!http://www.dnf70.com/2733.html

游客
39分钟前

不错的帖子,值得收藏!https://m.aaxiazai.com/show/30496.html

游客
43分钟前

谢谢楼主的分享!http://www.a5km.com/yxgl/dnf/25543.html

游客
57分钟前

观点鲜明,立场坚定,作者态度明确。http://www.dnf70.com/1049.html

游客
1小时前

楼主很有激情啊!http://serx.revolution3dprinters.com

游客
1小时前

写的太好啦,评论一个http://www.chenqiujianqi.com

游客
2小时前

强,我和我的小伙伴们都惊呆了!http://3eh9o.lvbangchuye.com/12/3.html

游客
2小时前

论坛的人气不行了!http://www.indaseg.com/a/a/4061.html

游客
2小时前

看在楼主的面子上,认真回帖!http://www.indaseg.com/a/a/768.html

游客
2小时前

雷锋做好事不留名,都写在帖子里!http://u616.lucerocas.com

游客
2小时前

精华帖的节奏啊!http://lmymx.shbgl.com/21/4.html

游客
2小时前

楼主的文笔不错!http://www.indaseg.com/a/a/2211.html

游客
2小时前

我只是来赚积分的!http://www.indaseg.com/a/a/3924.html

游客
2小时前

楼主的等级很高啊!http://getti.cn/761984.html

游客
2小时前

楼主人气很旺!http://zfi.e11542.com

游客
2小时前

帖子好乱!http://www.a5km.com/yxgl/dnf/22057.html

游客
3小时前

有钱、有房、有车,人人都想!http://7z2.onejhac.com

游客
3小时前

刚看见一个妹子,很漂亮!http://mmde.onejhac.com

游客
3小时前

我默默的回帖,从不声张!http://l891.482596.com

游客
3小时前

楼主写的很经典!http://www.a5km.com/yxgl/jdqs/28611.html

游客
3小时前

最近回了很多帖子,都没人理我!https://www.wangzhanfenlei.com

游客
3小时前

看帖回帖一条路!http://1i4.menel.net

游客
3小时前

写的太好啦,评论一个http://www.dnf70.com/1049.html

游客
3小时前

楼主内心很强大!http://www.a5km.com/yxgl/dnf/26843.html

游客
3小时前

刚分手,心情不好!http://i8ylo.739720.com/9/2.html

游客
4小时前

今天怎么了,什么人都出来了!http://www.a5km.com/yxgl/jdqs/27512.html

游客
4小时前

楼上的说的很多!http://www.dnf70.com/848.html

游客
4小时前

楼主你想太多了!http://www.dnf70.com/2809.html

游客
4小时前

顶顶更健康!https://www.kaozn.com/gk/45074.html

游客
4小时前

好好学习楼主的帖子!http://www.a5km.com/yxgl/jdqs/27371.html

游客
4小时前

感觉不错!http://www.indaseg.com/a/a/3484.html

游客
4小时前

文章写太挺好了,真的值得推荐http://www.dnf70.com/571.html

游客
4小时前

感觉不错!http://xj0i1h.jdrama.net

游客
4小时前

楼主好聪明啊!http://w3nfrv.jdrama.net

游客
5小时前

投楼主一票,不用谢哦!http://cq.3f2s.com/wanjiaxinde/

游客
5小时前

经典!http://www.indaseg.com/a/a/4790.html

游客
5小时前

文章论点明确,论据充分,说服力强。http://li354.eagleai.net

游客
5小时前

语言表达流畅,没有冗余,读起来很舒服。http://k7j.foodcube.net

游客
5小时前

这一年啥事没干,光研究楼主的帖子了!http://www.a5km.com/yxgl/dnf/26769.html

游客
5小时前

怎么我回帖都没人理我呢?http://www.dnf70.com/2878.html

游客
6小时前

信楼主,考试不挂科!http://dvewv.ftmtgfsc.com/21/3.html

游客
6小时前

很多天不上线,一上线就看到这么给力的帖子!http://www.a5km.com/yxgl/jdqs/27743.html

游客
6小时前

态度决定一切,不错!http://890u5.ds28vip.com

游客
6小时前

十分赞同楼主!http://www.a5km.com/wzjc/jdqskm/25937.html

游客
6小时前

大神好强大!http://www.dnf70.com/1508.html

游客
6小时前

今天怎么了,什么人都出来了!http://www.a5km.com/yxgl/dnf/24889.html

游客
6小时前

楼主的帖子越来越有深度了!http://yuf3.medyahit.net

游客
6小时前

楼上的说的很多!http://cq.3f2s.com/wanjiaxinde/

游客
6小时前

这个帖子会火的,鉴定完毕!http://www.dnf70.com/202.html

游客
6小时前

楼主的头像是本人吗?http://www.a5km.com/yxgl/jdqs/28247.html

游客
6小时前

支持一下,下面的保持队形!http://kp20.e11542.com

游客
7小时前

没人理我,好伤心啊!http://www.a5km.com/yxgl/jdqs/28292.html

游客
7小时前

视死如归的架势啊!https://www.qupojie.cn/category-dnsoft.html

游客
7小时前

宇宙第一贴诞生了!http://h51z00.lost-marbles.com

游客
8小时前

这个帖子好无聊啊!http://www.dnf70.com/2878.html

游客
8小时前

雷锋做好事不留名,都写在帖子里!http://rfks2.qqw16.com/42/4.html

游客
8小时前

收藏了,很不错的内容!http://www.indaseg.com/a/a/3953.html

游客
8小时前

顶一下,收藏了!http://www.a5km.com/wzjc/jdqskm/25898.html

游客
8小时前

读了楼主的帖子,顿时马桶就通了。。。http://60px.toroferrer.com

游客
8小时前

看了这么多帖子,第一次看看到这么有内涵的!http://q37f.jdrama.net

游客
8小时前

突然觉得楼主说的很有道理,赞一个!https://www.sjzsaisi.com/

游客
8小时前

顶顶更健康!http://37zmm.0168333.com

游客
8小时前

感谢楼主的推荐!http://ydovw.dnfxongba.com/42/5.html

游客
9小时前

论坛的帖子越来越有深度了!http://xkhpsu.962898.com

游客
10小时前

每天顶顶贴,一身轻松啊!http://y68x.qubaa.net

游客
10小时前

顶一下,收藏了!http://www.a5km.com/yxgl/dnf/26846.html

游客
10小时前

我回帖楼主给加积分吗?http://www.a5km.com/yxgl/dnf/24211.html

游客
10小时前

态度决定一切,不错!http://www.a5km.com/yxgl/jdqs/27902.html

游客
10小时前

内容很有深度!https://weibo.com/tv/show/1034:5059622541918241

游客
11小时前

楼主的帖子提神醒脑啊!http://mrlfm.zhpxjy.com/20240722/3.html

游客
11小时前

我和我的小伙伴都惊呆了!http://ddaqq.fdjznet.com/12/3.html

游客
11小时前

文章写太挺好了,真的值得推荐http://www.a5km.com/yxgl/dnf/26764.html

游客
11小时前

收藏了,改天让朋友看看!http://www.indaseg.com/a/a/4034.html

游客
11小时前

楼主的头像是本人吗?http://www.1389931.com

游客
11小时前

我回帖楼主给加积分吗?https://m.pc235.com/news/291.html

游客
12小时前

没人理我,好伤心啊!http://f426p.lost-marbles.com

游客
12小时前

观点鲜明,立场坚定,作者态度明确。http://www.a5km.com/wzjc/dnfkm/26044.html

游客
12小时前

看了这么多帖子,第一次看到这么高质量内容!http://www.a5km.com/wzjc/dnfkm/25444.html

游客
12小时前

看帖回帖一条路!http://www.indaseg.com/a/a/438.html

游客
13小时前

太邪乎了吧?http://www.a5km.com/wzjc/jdqskm/21831.html

游客
13小时前

十分赞同楼主!http://nzvhk.salasal.com

游客
14小时前

有内涵!http://2k81.salasal.com

游客
14小时前

知识就是力量啊!http://4d6.chancel.net

游客
14小时前

被楼主的逻辑打败了!https://www.uuu9923.cn/766.html

游客
15小时前

支持一下,下面的保持队形!http://usp4.quietgen.com

游客
15小时前

有机会找楼主好好聊聊!http://qll.impactmv.com

游客
15小时前

收藏了,改天让朋友看看!http://www.a5km.com/yxgl/dnf/25671.html

游客
15小时前

最近压力山大啊!http://www.a5km.com/yxgl/jdqs/27609.html

游客
15小时前

白富美?高富帅?http://www.a5km.com/wzjc/dnfkm/26209.html

游客
15小时前

知识就是力量啊!http://www.a5km.com/yxgl/jdqs/26581.html

游客
15小时前

刚看见一个妹子,很漂亮!http://www.a5km.com/yxgl/jdqs/27360.html

游客
15小时前

这么好的帖子,应该加精华!http://www.a5km.com/yxgl/dnf/26900.html

游客
16小时前

一口气看完了,我要下去回味回味了!http://www.dnf70.com/2781.html

游客
16小时前

最近回了很多帖子,都没人理我!http://www.ycscjrlhh.org.cn/345307.html

游客
16小时前

顶一个!http://ycscjrlhh.org.cn/593995.html

游客
17小时前

楼主的头像能辟邪啊!http://28vq.cv-works.com

游客
17小时前

支持一下!http://www.dnf70.com/1281.html

游客
17小时前

对牛弹琴的人越来越多了!http://www.indaseg.com/a/a/2213.html

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。