【offer 收割机之 CSS 回顾系列】请你解释一下什么是 BFC ?他的应用场景有哪些?
本文最后更新于:2022年3月22日 晚上
🧨 大家好,我是 Smooth,一名大二的 SCAU 前端er
🏆 本篇文章将会用大白话的方式带你彻底掌握 BFC,从此面试不再惧怕 BFC 的提问!
🙌 如文章有误,恳请评论区指正,谢谢!
一、常见定位方案
在讲 BFC 之前,我们先来了解一下常见的定位方案,定位方案是控制元素的布局,有三种常见方案:
- 普通流 (normal flow)
在普通流中,元素按照其在 HTML 中的先后位置至上而下布局,在这个过程中,行内元素水平排列,直到当行被占满然后换行,块级元素则会被渲染为完整的一个新行,除非另外指定,否则所有元素默认都是普通流定位,也可以说,普通流中元素的位置由该元素在 HTML 文档中的位置决定。
而对于 float 的 不完全脱离文档流 和 position: absolute 的完全脱离文档流,指的就是上面这个 HTML 的普通流
float对于浮动,是指元素先按照普通流的位置出现,然后将元素移动到所在行的最左边或最右边absolute在绝对定位布局中,元素会完全脱离普通流,而元素具体的位置是在相对于不为 static 的第一个父元素 及绝对定位的坐标决定。二、BFC 概念
Formatting context(格式化上下文) 是 W3C CSS2.1 规范中的一个概念。它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。
所以,BFC 是什么呢?
BFC 是块级格式化上下文,是一个独立的渲染区域,让处于 BFC 内部的元素与外部的元素相互隔离,使内外元素的定位不会相互影响。
通俗一点来讲,可以把 BFC 理解为一个封闭的大箱子,箱子内部的元素无论如何翻江倒海,都不会影响到外部。
三、BFC 规则
BFC 中子元素的 margin box 的左边, 与包含块 (BFC) border box的左边相接触 (子元素 absolute 除外)
BFC 的区域不会与 float 的元素区域重叠
BFC就是一个块级元素,块级元素会在垂直方向一个接一个的排列BFC就是页面中的一个隔离的独立容器,容器里的标签不会影响到外部标签垂直方向距离由
margin决定,属于同一个BFC的两个相邻标签外边距会发生重叠,属于不同BFC的不会重叠计算
BFC的高度时,浮动元素也参与计算四、触发 BFC 的条件
只要元素满足下面任一条件即可触发 BFC 特性:
- body 根元素就是一个 BFC
- 浮动元素:float 除 none 以外的值
- 绝对定位元素:position (absolute、fixed)
- display 为 inline-block、table-cell、flex
- overflow 除了 visible 以外的值 (hidden、auto、scroll)
相信大家在看 BFC 文章时经常会看到上面的字眼吧,没有案例不太好理解,下面便给出几个案例带你真正掌握 BFC
五、BFC 特性及应用
1. 阻止margin重叠
对于同一个 BFC 内的两个相邻元素,如果分别设置了上下边距,那么会发生折叠(取大的那个)
1 | |
从效果上看,因为两个 div 元素都处于同一个 BFC 容器 (这里指 body 元素) ,所以第一个 div 的下边距和第二个 div 的上边距发生了重叠,所以两个盒子之间距离只有 50px(刚好一个正方形的高度),而不是 100px(两个正方形的高度)。
首先这不是 CSS 的 bug,我们可以理解为一种规范,如果想要避免外边距的重叠,可以将其放在不同的 BFC 容器中。
1 | |
1 | |
这时候,两个盒子边距就变成了 100px
2. 清除浮动
我们都知道,浮动的元素会脱离普通文档流,来看下面一个例子
1 | |
样例渲染异常的解释:由于容器内元素浮动,脱离了文档流,所以就只有外面容器的 2px 边距高度。
即方块没有如期将容器撑开
在这里问大家一个问题:我们在什么场景下会用到浮动呢?
毫无疑问,就是想用来布局定位的时候啊!
有了上面的这个回答,我们才知道为什么要清除浮动,因为我们只想使用浮动对页面进行我们所需的布局,但又不想他影响到上下文元素,即不影响页面的普通流,那么下面便讲讲这种方法如何实现吧。
方法
对于上面的例子,如果想内容在设置了浮动的条件下,还能撑开容器高度,那么可以通过触发容器的 BFC,那么容器将会包裹着浮动元素。
1 | |
效果如图:
3. BFC 可以阻止元素被浮动元素覆盖
先来看一个文字环绕效果:
1 | |
这时候其实第二个元素有部分被浮动元素所覆盖,(但是文本信息不会被浮动元素所覆盖) 如果想避免元素被覆盖,可以触发第二个元素的 BFC 特性,在第二个元素中加入 overflow: hidden,就会变成:
1 | |
这个方法还可以用来实现两列自适应布局,效果不错,这时候左边的宽度固定,右边的内容自适应宽度(去掉上面右边内容的宽度即可)。
最后
我是 Smoothzjc,致力于产出更多且不仅限于前端方面的优质文章
写作不易,「点赞」+「收藏」+「转发」 谢谢支持❤
往期推荐
《都2022年了还不考虑来学React Hook吗?6k字带你从入门到吃透》
《一份不可多得的 Webpack 学习指南(1万字长文带你入门 Webpack 并掌握常用的进阶配置)》
《Github + hexo 实现自己的个人博客、配置主题(超详细)》
《React实战:使用Antd+EMOJIALL 实现emoji表情符号的输入》
《【建议收藏】长达万字的git常用指令总结!!!适合小白及在工作中想要对git基本指令有所了解的人群》
《浅谈javascript的原型和原型链(新手懵懂想学会原型链?看这篇文章就足够啦!!!)》https://juejin.cn/post/6993350461172482078)
作者:Smooth
文章链接:http://example.com/2022/03/16/%E3%80%90offer%20%E6%94%B6%E5%89%B2%E6%9C%BA%E4%B9%8B%20CSS%20%E5%9B%9E%E9%A1%BE%E7%B3%BB%E5%88%97%E3%80%91%E8%AF%B7%E4%BD%A0%E8%A7%A3%E9%87%8A%E4%B8%80%E4%B8%8B%E4%BB%80%E4%B9%88%E6%98%AF%20BFC%20%EF%BC%9F%E4%BB%96%E7%9A%84%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF%E6%9C%89%E5%93%AA%E4%BA%9B%EF%BC%9F/
版权说明:本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!
