深入理解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;
}

相关推荐
风之舞_yjf40 分钟前
Vue基础(14)_列表过滤、列表排序
前端·javascript·vue.js
BillKu1 小时前
scss(sass)中 & 的使用说明
前端·sass·scss
疯狂的沙粒1 小时前
uni-app 项目支持 vue 3.0 详解及版本升级方案?
前端·vue.js·uni-app
Jiaberrr2 小时前
uniapp Vue2 获取电量的独家方法:绕过官方插件限制
前端·javascript·uni-app·plus·电量
谢尔登2 小时前
【React】React 18 并发特性
前端·react.js·前端框架
Joker`s smile2 小时前
使用React+ant Table 实现 表格无限循环滚动播放
前端·javascript·react.js
国家不保护废物2 小时前
🌟 React 魔法学院入学指南:从零构建你的第一个魔法阵(项目)!
前端·react.js·架构
import_random2 小时前
[机器学习]svm支持向量机(优势在哪里)
前端
国家不保护废物2 小时前
从刀耕火种到现代框架:DOM编程 vs Vue/React 进化史
前端·vue.js·react.js
陈随易2 小时前
Univer v0.8.0 发布,开源免费版 Google Sheets
前端·后端·程序员