CSS BFC是什么及有什么作用

在了解BFC(Block Formatting Context)之前,我们先来看看FC(Formatting Context)是什么

CSS BFC是什么及有什么作用

这段话来自W3C官网,我们可以得到如下信息:

  • 所有的盒子都属于一个FC

  • 块级元素的布局属于一个BFC。例如div/p/h2等 -> BFC布局中

  • 行内级元素的布局属于一个IFC。例如img/a/span/i -> IFC布局中

简单理解:块级元素所在的布局和上下文就是BFC,行内级元素所在的布局和上下文就是IFC

问题1.块级元素都是在BFC中布局的,那么这个BFC在哪里呢

首先我们先看一下W3C的官方解释:

CSS BFC是什么及有什么作用

MDN上整理出的下了情况会创建BFC:

  • 根元素(html)

  • 浮动元素(元素的float值不是none)

  • 绝对定位元素(元素的position为absolute或者fixed)

  • 行内块元素(元素的display为inline-block)

  • 表格单元格(元素的display为table-cell,HTML表格单元格默认为该值,表格标题(元素的display为table-caption,HTML表格标题默认为该值)row,tbody,thead,tfoot的默认属性)或inline-table)

  • overflow计算值(Computed)不为visible的块元素

  • 弹性元素(display为flex或inline-flex元素的直接子元素)

  • 网格元素(display为grid或inline-grid元素的直接子元素)

  • display值为flow-root的元素

由此可见

<!DOCTYPE html><html>  <head>    <meta charset="UTF-8" />    <meta http-equiv="X-UA-Compatible" content="IE=edge" />    <meta name="viewport" content="width=device-width, initial-scale=1.0" />    <title>Document</title>  </head>  <body>    <div></div>    <div></div>  </body></html>

这段代码中的box1和box2都是在html根元素的BFC中布局的

问题2.BFC的作用

首先先看一下官方文档对BFC作用的描述:

CSS BFC是什么及有什么作用

我们可以得到的信息:

  • 在一个BFC中,盒子会从包含块的顶部开始,在垂直方向上会一个挨着一个摆放,可能很多人都对这一点习以为常,但这点是BFC帮助我们实现的。当我们对某个盒子设置一个margin-较好的时候,BFC会帮助我们解析,然后会在盒子布局时候给一个上边距

  • 在一个BFC中,每个元素的左边缘都会紧贴着包含块的左边缘

  • 在同一个BFC中,在垂直方向上,相邻两个盒子的margin会重叠,值取两者中较大的(可以利用此特性解决margin重叠问题)

作用1:利用BFC解决margin重叠问题
<!DOCTYPE html><html>  <head>    <meta charset="UTF-8" />    <meta http-equiv="X-UA-Compatible" content="IE=edge" />    <meta name="viewport" content="width=device-width, initial-scale=1.0" />    <title>Document</title>    <style>      .box1 {        height: 200px;        width: 400px;        background-color: orange;        margin-bottom: 30px;      }      .box2 {        height: 150px;        background-color: purple;        margin-较好: 50px;      }    </style>  </head>  <body>    <div></div>    <div></div>  </body></html>

此时box1和box1此时同处于html的BFC中,并且box1和box2在垂直方向上相邻,所以会出现margin重叠,取两者其中较大的值50px

CSS BFC是什么及有什么作用

如何解决呢?可能很多人会想到直接给box1添加一个BFC,所以直接给box1添加个overflow:hidden属性

<!DOCTYPE html><html>  <head>    <meta charset="UTF-8" />    <meta http-equiv="X-UA-Compatible" content="IE=edge" />    <meta name="viewport" content="width=device-width, initial-scale=1.0" />    <title>Document</title>    <style>      .box1 {        height: 200px;        width: 400px;        background-color: orange;        margin-bottom: 30px;        overflow: hidden;      }      .box2 {        height: 150px;        background-color: purple;        margin-较好: 50px;      }    </style>  </head>  <body>    <div></div>    <div></div>  </body></html>

结果呢?

CSS BFC是什么及有什么作用

发现并不起作用。可能此时很多人就懵了,box1此时不是明明已经形成了BFC了嘛,为什么还会发生重叠?让我来给你解释一下,首先此时box1确实是已经形成了BFC(可以理解成box1内部形成了BFC),但是对于box1这个元素的本身,还是和box2同属于html的BFC中,所以还是会发生margin重叠

所以我们要给box1套一层,然后给box1外层的盒子设置BFC

<!DOCTYPE html><html>  <head>    <meta charset="UTF-8" />    <meta http-equiv="X-UA-Compatible" content="IE=edge" />    <meta name="viewport" content="width=device-width, initial-scale=1.0" />    <title>Document</title>    <style>      /* 给box1外层增加一个container盒子,并设置BFC */      .container {        overflow: hidden;      }      .box1 {        height: 200px;        width: 400px;        background-color: orange;        margin-bottom: 30px;      }      .box2 {        height: 150px;        background-color: purple;        margin-较好: 50px;      }    </style>  </head>  <body>    <div>      <div></div>    </div>    <div></div>  </body></html>

此时box1属于container的BFC,而box2属于html的BFC,不属于同一个BFC,所以就能解决margin重叠问题

CSS BFC是什么及有什么作用

作用2:解决浮动高度塌陷问题

当我们给container里面的四个item设置浮动的时候,很明显,这几个元素都会脱离文档流,此时container不会有高度

<!DOCTYPE html><html>  <head>    <meta charset="UTF-8" />    <meta http-equiv="X-UA-Compatible" content="IE=edge" />    <meta name="viewport" content="width=device-width, initial-scale=1.0" />    <title>Document</title>    <style>      .container {        background-color: orange;      }      .item {        width: 400px;        height: 200px;        box-sizing: border-box;        border: 1px solid #000;        float: left;        background-color: #f00;      }    </style>  </head>  <body>    <div>      <div></div>      <div></div>      <div></div>      <div></div>    </div>  </body></html>

CSS BFC是什么及有什么作用

很多网上博主说,通过给container设置一个BFC,内部的浮动元素就会向其汇报高度,然后container就能解决浮动高度塌陷问题,这个做法是正确的,但是这个说法其实是错误,并不是因为其内部的浮动元素向其汇报了高度

事实上,想通过BFC解决高度塌陷问题需要满足两个条件:

  • 浮动元素的父元素触发BFC,形成独立的块级格式化上下文(BFC)

  • 浮动元素的父元素高度为auto

首先我们先看一段W3C的描述

CSS BFC是什么及有什么作用

大致意思为BFC的高度是auto情况下,高度是这样计算:

  • 如果只有inline-level,是行高的顶部和底部的距离

  • 如果有block-level,是有最底层的块上边缘和最底层块盒子的下边缘之间的距离(有margin也会计算在内)

  • 如果有绝对定位元素,将被忽略(所有我们无法通过BFC解决绝对定位的高度塌陷问题)

  • 如果有浮动元素,那么会增加高度以包括这些浮动元素的下边缘(这才是BFC能解决浮动元素塌陷问题的原因,并不是因为浮动元素向上汇报了高度)

所以我们直接给container通过添加overflow属性设置BFC,则由于上述第四条4特性,container会增加高度来包括内部四个item浮动元素下边缘,所以解决了浮动塌陷问题

<!DOCTYPE html><html>  <head>    <meta charset="UTF-8" />    <meta http-equiv="X-UA-Compatible" content="IE=edge" />    <meta name="viewport" content="width=device-width, initial-scale=1.0" />    <title>Document</title>    <style>      .container {        background-color: orange;        /* 通过overflow形成BFC */        overflow: hidden;      }      .item {        width: 400px;        height: 200px;        box-sizing: border-box;        border: 1px solid #000;        float: left;        background-color: #f00;      }    </style>  </head>  <body>    <div>      <div></div>      <div></div>      <div></div>      <div></div>    </div>  </body></html>

CSS BFC是什么及有什么作用

感谢各位的阅读,以上就是“CSS BFC是什么及有什么作用”的内容了,经过本文的学习后,相信大家对CSS BFC是什么及有什么作用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

文章标题:CSS BFC是什么及有什么作用,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/25529

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年9月15日 下午11:26
下一篇 2022年9月15日 下午11:28

相关推荐

  • windows deepl如何上传文件

    deepl上传文件的方法 1、点击进入网页端。 2、点击翻译.docx & .pptx文件 3、上传你要翻译的文档。 4、选择你的目标翻译语言。 5、翻译完成之后,点击下载就可以得到翻译好的文档啦。 到此,相信大家对“windows deepl如何上传文件”有了更深的了解,不妨来实际操作一番…

    2022年9月26日
    69400
  • MySQL安装常见报错怎么处理

    1.无法启动处理,错误1053 Windows 无法启动Mysql服务 错误1053:服务没有及时响应启动或控制请求 1.1 结束进程 处理方法: 1、在命令行中敲入tasklist查看进程 2、根据进程名杀死进程 taskkill /f /t /im 进程名称 1.2 更改网络服务 Server2…

    2022年9月15日
    96300
  • laravel是不是后端框架

    laravel是后端开发框架;laravel是一个用于构建web应用程序的跨平台PHP框架,尽管laravel确实提供了一些前端功能,但是Laravel的许多功能与前端无关,Laravel提供了一个功能强大的开发环境,以及直观和富有表现力的命令行界面。 本文操作环境:Windows10系统、Lara…

    2022年9月1日
    76900
  • windows浩辰cad看图王背景怎么换黑色

    浩辰cad看图王背景换黑色的方法: 1、首先我们打开图纸,点击左上角的“文件”选项。 2、接着在上方栏的帮助中,打开“设置” 3、打开后就可以看到背景颜色了,点击下方的颜色,如图所示。 4、点开后,选中弹出菜单中的“黑色” 5、设置完成后点击下方“确定”保存。 6、保存完成就可以发现我们的背景已经换…

    2022年9月21日
    70100
  • cocos2d-LUA逆向中如何解密app资源

    还是以大神apk为例,通过前面分析app解密lua脚本,我们能够解密大神apk的lua脚本,现在我们来解密其资源(配置文件和图片等)。我们以比较重要的配置文件为例,未解密之前: 文件头部也有签名值:fuckyou!。看到这,我们首先就想到是不是也是用xxtea加密的,我们用上面的方法,先xxtea解…

    2022年9月21日
    1.4K00
  • 如何进行电子钱包APP漏洞分析

    雷蛇支付(Razer Pay)在新加坡和马来西亚被广泛使用,在该篇Writeup中,作者通过APP逆向分析,利用Frida调试,发现了雷蛇支付电子钱包(Razer Pay Ewallet)中的用户签名(Signature)生成漏洞,由此可读取雷蛇支付用户的聊天记录、删除用户绑定的银行账户并窃取用户个…

    2022年9月13日
    65900
  • jquery ajax如何改成同步

    在jquery中,ajax可以将async设置为false使其同步;默认情况下jquery中的ajax为异步请求,即“async:true”,通过设置参数“asycn:false”即可,语法为“$.ajax({async: false})”。 本文操作环境:windows10系统、jquery3.6…

    2022年9月10日
    2.6K00
  • windows ventoy怎么使用

    ventoy使用教程: 1、首先我们下载ventoy。 2、下载完成会得到一个压缩包,将它解压出来。 3、解压完成后,双击运行“ventoy2disk.exe”打开它。 4、在上方选择我们想要制作成系统盘的u盘。(如果没有说明没插u盘) 5、接着点击图示位置修改配置版本。 (基本新电脑和系统都设置g…

    2022年8月27日
    1.2K00
  • windows中怎么用cmd打开任务管理器

    用cmd打开任务管理器命令的步骤 1、按住键盘上的Win+R键打开运行窗口,或点击左下角的【开始】—【运行】,在运行窗口中输入cmd,按Enter键打开cmd窗口 2、输入C:Windowssystem32taskmgr.exe,然后按Enter键,就能打开任务管理器了 3、CMD打开任务管理器窗口…

    2022年9月6日
    2.6K00
  • 怎么修改pip install默认安装路径

    1. 修改pip install默认安装路径 一般使用Anaconda时会使用 pip install ### 来安装各类包,但默认安装路径在C盘,极大占用空间,作为强迫症,我们通过以下步骤来修改默认安装路径。 1.1 查看pip 默认安装位置 名列前茅步:通过win菜单,找到Prompt,点击进入…

    2022年8月30日
    3.7K00
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部