【CSS】深入理解:BFC究竟是什么?

server/2024/10/20 18:59:10/

深入理解:BFC究竟是什么?

在我们了解BFC之前,我们先来看看什么是FC

1. FC的概念

FC全称 Formatting Context ,元素在标准流里面都属于一个FC

  • 块级元素的布局都属于Block Formatting Context,也就是BFC
    • block level box都是在BFC中布局的
  • 行内级元素的布局都属于Inline Formatting Context,IFC

2. BFC - Block Formatting Context

2.1 什么是BFC呢?怎么创造BFC?

常见的形成BFC的场景

  • 根元素(html,:root)
  • 浮动元素(float属性部位none)
  • 绝对定位元素(absolute或fixed)
  • 行内快元素(display为inline-block)
  • 表格单元格(元素的display为table-cell(默认))
  • 表格标题(display为table-caption)
  • 匿名表格单元格格式(元素的 display 为 table、table-row、 table-row-group、table-header-group、table-footer-group(分别是HTML table、 row、tbody、thead、tfoot 的默认属性)或 inline-table)
  • overflow属性值不是“visible”的元素
  • 弹性元素(flex布局)
  • 网格元素(gird布局)

2.2 BFC的作用

  1. 在BFC中,box会垂直方向上一个挨着一个排布
  2. 垂直方向的属性由magin决定
  3. 同一个BFC中,两个相邻的box上下之间的margin会折叠(规定)
  4. BFC中,每个元素的左侧边缘都是紧挨着包含块的左边缘

这就是浏览器如何排布我们的元素

2.3 利用BFC解决块级元素的margin上下折叠问题

css">.box {width: 100px;height: 100px;
}
.box1 {background-color: pink;margin-bottom: 50px;
}
.box2 {margin-top: 30px;background-color: purple;
}
<div class="box box1"></div>
<div class="box box2"></div>

在上述的代码中,box1和box2在同一个BFC中,(根元素html)会创建一个BFC,所以会折叠,两个box之间的距离为50px,我们可以利用BFC来解决这个问题

<div class="container"><div class="box box1"></div>
</div>
<div class="box box2"></div>

用一个div盒子来包裹box1

css">.container {overflow: auto;
}

当我们给box1的父盒子container设置overfolw的属性为auto时,此时container会开启一个BFC,此时,box1和box2并不是属于同一个BFC,所以不会出现margin上下折叠的问题

2.4 为什么BFC会解决浮动元素高度塌陷的问题呢?

网上有很多的说法,BFC可以解决浮动元素的塌陷问题,实现清除浮动的效果,那么请看这个案例

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><style>css">ul,li {padding: 0;margin: 0;list-style: none;}.box ul {width: 330px;height: 150px;background-color: orange;overflow: hidden;}.box li {float: left;width: 100px;height: 100px;margin: 0 10px 10px 0;background-color: pink;}</style></head><body><div class="box"><ul><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul></div></body>
</html>

在这里插入图片描述

在这个案例中,我们给了ul 一个固定高度,也给ul设置了一个BFC,但并没有清除浮动

事实上,BFC解决高度塌陷的需要满足两个条件

  • 浮动元素的父元素开启BFC
  • 浮动元素的父元素高度是auto

当BFC的高度为auto时,将会计算父元素的高度(权威)

  1. 如果盒子中的子元素只有行内元素,直接计算顶部到底部的距离
  2. 如果有块级元素,计算块级元素的高度
  3. 如果有绝对定位元素,直接忽略其高度
  4. 如果有浮动元素,则会增加高度来包含这些浮动元素的下边缘

也就是我们可以得出一个重要结论,当元素开启新的BFC时,会主动将浮动元素给包括进去,并不是浮动元素向父元素汇报高度


http://www.ppmy.cn/server/4927.html

相关文章

SpringBoot Cloud Gateway

网关简介 大家都都知道在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢&#xff1f; 如果没有网关的存在&#xff0c;我们只能在客户端记录每个微服务的地址&#xff0c;然后分别去用。 这样的架构&#xff0c;会存在…

聚观早报 | 华为Pura70系列先锋计划;月之暗面升级Kimi

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 4月19日消息 华为Pura70系列先锋计划 月之暗面升级Kimi OPPO Find X7将推白色版本 波士顿动力推出人形机器人 v…

JVM之类加载器

1.JVM在哪里 jvm就是java虚拟机&#xff0c;jvm是一个环境&#xff08;或者可以理解成一个运行在操作系统上的软件&#xff09; 2.类加载器与双亲委派 JVM 启动的时候&#xff0c;并不会一次性加载所有的类&#xff0c;而是根据需要去动态加载。也就是说&#xff0c;大部分类…

全量知识系统 程序详细设计 定稿 之1 (QA百度搜索 )

Q1从今天开始&#xff0c;我们进入到全量知识系统&#xff08;简称“全知系统”&#xff09;的程序详细设计的 整理成文阶段--“定稿”&#xff08;或“成熟”&#xff09;阶段&#xff08;相应的&#xff0c;前一阶段可以称为程序详细设计的“构思”&#xff08;或“喂养”&am…

前端npm常用命令总结

npm&#xff08;Node Package Manager&#xff09;是Node.js的包管理器&#xff0c;用于安装和管理Node.js的依赖库。以下是一份npm命令的总结文档&#xff0c;涵盖了常用的npm命令及其功能&#xff1a; 包相关的 安装和卸载包 npm install &#xff1a;安装指定名称的包。n…

【AI】本地部署可以与文件沟通的GPT:Llama 2 + GPT4All + Chroma

【背景】 还是继续致力于实践可以保护数据隐私的本地化LLM部署。 这次用的是Llama 2 + GPT4All + Chroma实现RAG。 【概念】 基于LangChain模板的各个部分的作用: Llama2-》语言模型管理GPT4ALL-》embeddingChroma-》文件内容的向量存储,作为内部知识库,不需要网络就可以…

vue.runtime.esm.js?c320:4625 [Vue warn]: Failed to resolve directive: lazy

使用图片懒加载插件报错 原因&#xff1a;vue2与懒加载插件默认版本不相容导致的 解决方法&#xff1a;重新安装lazyLoad npm install vue-lazyload1.3.3 --save-dev

esp32-通过wifi使用timelib库同步时间(三)

库的安装 本文基于platformIO&#xff0c;安装较为简单如下图 实例代码 完整代码如下&#xff0c;如果时间获取超时请使用time1.aliyun.com获取时间。 /** Time_NTP.pde* Example showing time sync to NTP time source** This sketch uses the Ethernet library*/#include …