深入理解BFC原理

总览


🎯大家好我是一溪风月一名普普通通的前端开发,做前端两年多了,但是自己反思了一下,在这两年多的时间,在对技术的追寻上一直都是追求新与多在这个道路上往往忽略了前端最本质的东西,那就是前端究竟在做什么,前端的价值和意义在什么地方,前端的基础,经过自己的思考决定从头学习下前端的知识,让自己沉下心来查漏补缺,放弃追逐新东西,寻找自己,了解自己。

一.什么是FC


🎪FC:FC的全称是Formatiing Context ,元素在标准流里面都是属于一个FC的,我们可以看下官网文档。

那么从官方文档中我们可以看到BFC其实就是FC,如果是行内就是IFC,其实BFC就可以理解为块级元素的布局,也就是布局的上下文,也就是环境块级元素布局的环境

那么BFC在哪?拿出来给我看看,MDN整理出的会形成BFC的情况

二.BFC有什么作用哪?


🥴我们先看下官方文档对BFC的描述

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

😭BFC的具体作用常见的有两种:解决margain折叠问题,解决浮动高度塌陷问题。


其实我们日常开发中习以为常的现象背后的操作者就是BFC,可以理解为它是一套布局的规则,比如从左到右排布,为什么margain会折叠,其实这些背后都是BFC在起作用。


三.BFC的作用一:解决折叠问题


😊通过上面的内容我们会了解到,在同一个BFC中两个box之间的margain会折叠。

css 复制代码
.box1 {
  height: 30px;
  background-color: aquamarine;
  margin-bottom: 30px;
}

.box2 {
  height: 50px;
  background-color: blueviolet;
  margin-top: 30px;
}

那么我们解决margain塌陷问题的方法就是让两个元素处于不同的BFC就可任意折叠不同的BFC

css 复制代码
.container{
  overflown:auto;
}
.box1 {
  height: 30px;
  background-color: aquamarine;
  margin-bottom: 30px;
}

.box2 {
  height: 50px;
  background-color: blueviolet;
  margin-top: 30px;
}

😶‍🌫️解决这个问题的方案就是在第一个盒子外部增加一个盒子让这个盒子在一个新的BFC中。

四.BFC解决浮动高度问题


🎯网上有很多说法,BFC可以解决浮动高度塌陷,可以实现清除浮动的效果,但是从来没有给出过BFC可以解决高度塌陷的原理或者权威的文档说明,他们也压根没有办法解释,为什么可以解决浮动高度的塌陷问题,但是不能解决绝对定位元素的高度塌陷问题呢?

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

  1. 浮动元素的父元素触发BFC,形成独立的块级格式化上下文(Block Formatting Context);
  2. 浮动元素的父元素的高度是auto的;

🎪BFC的高度是auto的情况下,是如下方法计算高度的。

  1. 如果只有inline-level,是行高的顶部和底部的距离;
  2. 如果有block-level,是由最底层的块上边缘和最底层块盒子的下边缘之间的距离
  3. 如果有绝对定位元素,将被忽略;
  4. 如果有浮动元素,那么会增加高度以包括这些浮动元素的下边缘。
css 复制代码
.container {
  width: 100%;
  height: 100%;
  background-color: antiquewhite;
}

.item {
  width: 60px;
  height: 30px;
  background-color: aquamarine;
  margin-bottom: 30px;
  float: left;
  border: 1px solid #000;
}
html 复制代码
<div class="container">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
</div>

使用BFC来解决高度塌陷问题:

css 复制代码
.container {
  width: 100%;
  height: 100%;
  overflow: auto;
  background-color: antiquewhite;
}

相关推荐
pepedd8641 分钟前
浅谈js拷贝问题-解决拷贝数据难题
前端·javascript·trae
@大迁世界3 分钟前
useCallback 的陷阱:当 React Hooks 反而拖了后腿
前端·javascript·react.js·前端框架·ecmascript
跟橙姐学代码4 分钟前
学Python别死记硬背,这份“编程生活化笔记”让你少走三年弯路
前端·python
前端缘梦4 分钟前
深入理解 Vue 中的虚拟 DOM:原理与实战价值
前端·vue.js·面试
Fantastic_sj5 分钟前
React 19 核心特性
前端·react.js·前端框架
VaJoy5 分钟前
Cocos Creator Shader 入门 ⒂ —— 自定义后处理管线
前端·cocos creator
小高0076 分钟前
📌React 路由超详解(2025 版):从 0 到 1 再到 100,一篇彻底吃透
前端·javascript·react.js
Data_Adventure10 分钟前
Java 与 TypeScript 的“同名方法”之争:重载机制大起底
前端·typescript
summer77712 分钟前
GIS三维可视化-Cesium
前端·javascript·数据可视化
HWL567916 分钟前
pnpm(Performant npm)的安装
前端·vue.js·npm·node.js