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

ops/2024/10/18 12:21:30/

深入理解: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/ops/20807.html

相关文章

NXP恩智浦 S32G电源管理芯片 VR5510 安全概念 Safety Concept (万字长文详解,配21张彩图)

NXP恩智浦 S32G电源管理芯片 VR5510 安全概念 Safety Concept (万字长文详解&#xff0c;配21张彩图) 1. 简介 本应用笔记描述了与S32G处理器和VR5510 PMIC相关的安全概念。该文档涵盖了S32G和VR5510的安全功能以及它们如何相互作用&#xff0c;以确保对ASIL D安全完整性级别…

学习 Rust 的第十天:枚举和模式匹配

大家好&#xff0c; 今天是学习 Rust 的第十天。昨天我们讨论了如何使用 structs 将相关数据分组在一起。今天我们来看一个类似的概念&#xff0c;即 enums。 导论 Rust 中的枚举是一种数据类型&#xff0c;允许你通过列举可能的值来定义类型&#xff0c;提供了一种简洁而类…

Thinkphp--in-sqlinjection

一、漏洞原理 在 Builder 类的 parseData 方法中&#xff0c;由于程序没有对数据进行很好的过滤&#xff0c;将数据拼接进 SQL 语句&#xff0c;导致 SQL注入漏洞 的产生。 影响版本 5.0.13<ThinkPHP<5.0.15 5.1.0<ThinkPHP<5.1.5 在相应的文件夹位置打开终端…

No ‘Access-Control-Allow-Origin‘ header is present on the requested resource关于vue跨域问题

浏览器为了安全考虑&#xff0c;有一个最基本的安全策略&#xff0c;即同源策略。 同源策略规定&#xff1a;浏览器在解析Ajax请求时&#xff0c;要求浏览器的路径与Ajax的请求的路径必须满足三个要求&#xff0c;即请求的协议、域名、端口号都相同&#xff0c;满足同源策略&am…

IntelliJ IDEA 如何启用 JDK 预览特性

IntelliJ IDEA 也可以启用 JDK 的预览特性。 针对项目&#xff0c;选择项目结构。 配置是在语言结构上。 单击语言结构上的 SDK 默认&#xff0c;往下拉&#xff0c;就可以看到针对新版本的选项。 同时还可以看到那些版本是支持新特性预览的&#xff0c;那些版本是不支持新特…

使用Python实现语音识别与处理模型

语音识别与处理是一项重要的人工智能技术&#xff0c;它可以将人类语音转换成文本形式&#xff0c;从而实现语音命令识别、语音转写等功能。在本文中&#xff0c;我们将介绍语音识别与处理的基本原理和常见的实现方法&#xff0c;并使用Python来实现这些模型。 什么是语音识别…

1.pytorch加载收数据(B站小土堆)

数据的加载主要有两个函数&#xff1a; 1.dataset整体收集数据&#xff1a;提供一种方法去获取数据及其label&#xff0c;告诉我们一共有多少数据&#xff08;就是自开始把要的数据和标签都收进来&#xff09; 2.dataloader&#xff0c;后面传入模型时候&#xff0c;每次录入数…

MultiHeadAttention在Tensorflow中的实现原理

前言 通过这篇文章&#xff0c;你可以学习到Tensorflow实现MultiHeadAttention的底层原理。 一、MultiHeadAttention的本质内涵 1.Self_Atention机制 MultiHeadAttention是Self_Atention的多头堆嵌&#xff0c;有必要对Self_Atention机制进行一次深入浅出的理解&#xff0c;这…