bfc是什么_全面分析总结BFC原理及实践

cceb20c6b847630e9cb2b9a0ad1303ec.png

前言

经常在面试中被问到“如何清除浮动?”、“为什么 overflow: hidden 可以清除浮动?”等等比较基础的问题。虽然这些题目案在各种写面试题的文章中都有提供答案,但这种教科书式的问答肯定不是我们的目的,与其记住答案不如彻底掌握其核心原理——块级格式化上下文(BFC)

这篇文章主要就是彻底分析清楚BFC原理、总结BFC经典场景中的用法,最后再实践分析解决布局中常遇到的问题。

本文首发自迪诺笔记,转载请注明出处

一、BFC作用

  • 清除浮动:BFC会包含创建它的元素内部的所有内容(包含浮动元素)
  • 外边距折叠:解决同一BFC容器中的相邻元素间的外边距折叠问题
  • 左图右文布局:利用浮动元产生BFC以及BFC之间不会互相覆盖实现左图右文布局
以上BFC的作用可以当做一次检验,思考下如何实现,本文后面将会有原理以及实现的讲解

二、如何产生BFC

名称如何产生备注html根元素html元素本身就是一个BFC元素记住就好,body元素不是BFC浮动元素元素的float属性不是none常用绝对定位元素position属性为absolute或fixed常用行内块元素display属性为inline-block常用表格元素表格元素默认display属性即是BFC表格单元格、表格标题也是弹性元素display属性为flex或inline-flex元素的直接子元素非常重要(flex布局常用)网格元素display属性为grid或inline-grid元素的直接子元素新特性用得少多列容器元素的column-count或column-width不为auto,包括 column-count为1新特性用得少overflow属性overflow属性值不为visible的元素常用oveflfow:visibledisplay属性display属性值为flow-root的元素,flow-root: 一个新的display属性的值,它可以创建无副作用的BFC用得少contain属性contain属性值为layout、content、paint的元素用得少

总结成一句话:凡脱离文档流都可以产生BFC

三、BFC原理

三种文档定位方式

在讲BFC的原理之前先看看html文档的三种定位方式

普通流

在普通流中,元素按照其在HTML中的先后位置自上而下布局,在这个过程中,行内元素水平排列,直到当行被占满然后换行,块级元素则会被渲染为完整的一个新行,除非另外指定,否则所有元素默认都是普通流定位,也就是说普通流中元素的位置由该元素在HTML文档中的位置决定。

浮动

在浮动定位中,元素首先按照普通流的位置出现,然后根据浮动的方向尽可能的向左边或右边偏移,其效果与印刷排版中的文本环绕相似。

绝对定位

在绝对定位中,元素会整体脱离普通流,因此绝对定位元素不会对其兄弟元素造成影响,而元素具体的位置由绝对定位的坐标决定。

BFC产生作用的原因

其实BFC是上面三种布局方式中的普通流,BFC会产生一个独立的容器,该容器内部的元素不会在布局上影响到外部的元素,在外部的普通流看来它和其他普通流元素无差别,文档最终会按照上面说的普通流计算布局。

50a8f6047eeef9534c3756a20c0eb136.png

BFC的注意事项

块格式化上下文对浮动定位与清除浮动都很重要。浮动定位和清除浮动时只会应用于同一个BFC内的元素。 浮动不会影响其它BFC中元素的布局,而清除浮动只能清除同一BFC中在它前面的元素的浮动。 外边距折叠也只会发生在属于同一BFC的块级元素之间。

四、BFC常见用法

为了更好的理解BFC,我们先看看下面这些常见的用法。

清除浮动防止高度塌陷

按照上面三种定位方式中说的,浮动元素会脱离普通文档流,导致外部元素的高度计算不包括浮动元素本身高度,形成高度塌陷。

4e990ba33c74c7854a8c2542de5a75d4.png
<div class="container"><div class="box box1"></div>
</div>
.box {width: 20px;height: 50px;float: left; // 脱离了文档流形成了一个BFCborder: 4px solid green;
}

采用上述产生BFC元素的方法之一使外层元素产生BFC,可以防止元素高度塌陷。

.container {overflow: hidden; // 外层容器产生BFC
}

e10541c5a91dab1cabb4bf376a59faea.png

处理外边距折叠的问题

在普通文档流中,元素(非BFC元素)的外边距margin会自动折叠,产生如下现象。

169bfc82841149e2acc35a5d813b009b.png
<div class="container"><div class="box box1 m20"></div><div class="box box2 m20"></div>
</div>
.m20 {margin: 20px;
}
.box {border: 1px solid green;
}

这个是html的特性不算bug,但是我们更希望margin不产生折叠效果,通过利用BFC元素之间的外边距不会折叠的特性来实现。

<div class="container"><div class="box box1 m20"></div><div class="box box2 m20"></div>
</div>
.m20 {margin: 20px;
}
.box {overflow: hidden; // 使得两个box成为BFC元素border: 4px solid green;
}

使两个box形成BFC或者分别用两个BFC包裹box,然后形成的两个BFC之间的外边距不会折叠,修复后效果如下图。

9dfa106b9a1a4576f37cd7e6d0fc0c01.png

五、扩展一下

存在块级格式化上下文BFC,则对应存在内联格式化上下文IFC、网格格式化上下文GFC、自适应格式化上下文FFC,这些都可以统称为格式化上下文。

IFC

内联格式化上下文,IFC 的 line box(线框)高度由其包含行内元素中最高的实际高度计算而来,不受到竖直方向的 padding、margin 影响。

bb6fc7607274ef3c855c0cabe6c293ee.png

当在内联元素中插入块级元素会产生什么效果呢?在内联元素中插入位置前后的内联元素各自形成一个IFC,然后按照普通文档流进行布局,效果如下图。

4ed6448662e8ef47add6c0025b2e74c2.png

GFC

网格布局格式化上下文(display: grid

FFC

自适应格式化上下文(display: flex

六、常见问题分析

为什么overflow: hidden可以清除浮动?

overflow: hidden使得外层元素产生了一个BFC,BFC的高度计算包含其内部的浮动元素,从而达到清除浮动效果
<div style="border: 5px solid #6EBD91; overflow: hidden;"><div style="float: left; border: 5px solid #F4D491;">Lorem ipsum dolor sit amet consectetur adipisicing elit. Accusamus, maxime fuga assumenda excepturi, exercitationem rerum quae voluptates sunt perspiciatis cupiditate sed itaque officia, placeat minus iure quod expedita earum nam.Eum aliquam totam iure mollitia deserunt, minus repellendus. Harum ullam tenetur, impedit aliquam nobis ut dignissimos eligendi, expedita illum iste esse odio ab quos explicabo, odit architecto. Tempora, hic facilis?</div>
</div>

效果如下:

8398f957e57552f1a2bf365705ba0e59.png

分析过程

外层overflow: hidden的元素产生了一个BFC,本身float: left的元素也产生了一个BFC,外层BFC进行尺寸计算时包含内层BFC尺寸。

177b8a307945b2138a2be1990bd63d91.png

常用的clearfix清除浮动如何实现?

// 采用after伪元素实现
.clearfix::after {content: " ";display: block;height: 0;clear: both;
}
// 兼容IE6
.clearfix {zoom: 1;
}

.clearfix类绑定到外层非浮动元素上,clear: both属性确保外层元素在进行高度计算时包含内部浮动元素。

使用clearfix清除浮动的元素本身并未产生BFC,依靠的是CSS的clear属性。即该元素若没有其他属性产生BFC时仍然按照普通文档流进行定位,垂直外边距还是存在折叠。

如何实现两列自适应布局?

不考虑使用UI框架中的布局组件情况下,直接使用float: left + 固定左侧宽度 + 右边列margin-left
<div><img style="float: left; width: 140px;" src="https://tva1.sinaimg.cn/large/00831rSTly1gcel7v9ji4j3041041wec.jpg" alt="logo"><div style="margin-left: 150px;"><p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quos eligendi numquam nihil excepturi sint reiciendis iusto maiores nostrum fugiat harum?</p><p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quam, perspiciatis magnam consectetur corrupti suscipit a ratione sunt commodi beatae ad!</p></div>
</div>

实现效果如下图:

38df9f1d4ac6b6fff86ef7dc77356b67.png

过程分析

左侧部分使用float: left会产生一个BFC元素,这个BFC与右侧块级元素div一起进行普通流定位;由于是两个按照普通流定位这个两个元素之前不会产生覆盖,即使不固定左侧元素宽度和右侧块级元素给margin-left也可以实现效果(这里给宽度是为了控制左侧固定尺寸)。

079bca700be3e880ca30d98a5e202b8e.png

内联元素中使用块级元素会产生什么效果?

内联元素中插入块级元素会在插入的块级元素前后各产生一个匿名块与插入的块按照普通流进行定位

9d53bd06a069469e22a7a8d6b7da3619.png

内联元素中使用插入浮动元素会产生什么效果?

内联元素使用了display: inline-block会产生一个IFC,其内部的浮动会在内部进行浮动定位,然后整个IFC看成一个块级元素与外部进行文档流定位
<span style="display: inline-block; background-color: #6EBD91;">Lorem ipsum dolor sit amet.<span style="float: left; background-color: chocolate;">Lorem, ipsum.</span><div style="background-color: #F4D491;">Lorem, ipsum dolor sit amet consectetur adipisicing elit. Repellat labore, ipsa quo possimus mollitia, officiis quia provident inventore placeat nulla, rem velit ratione ducimus. Facilis eos repudiandae debitis quam voluptatem.</div>Lorem ipsum dolor sit amet consectetur.
</span>

效果如下:

81a60bf87035dd61d295a13375d9c0fa.png

以上效果可以在线预览

参考文章

  • MDN-格式化上下文
  • MDN-clear
  • gihtub-介绍下BFC及其应用
  • 知乎专栏-10分钟理解BFC原理

写在最后

既然看到这里了不妨点个赞鼓励下作者呗 :)
作者博客:https://blog.lessing.online/
作者github:https://github.com/johniexu

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学会了很多计算机小技巧,超实用的八个电脑小技巧,全都学会让你成为电脑高手...

Part one 截屏我们在使用电脑的过程中&#xff0c;有时候会使用截屏功能。AltCtrlA诶&#xff1f;怎么不行&#xff1f;原来这是QQ特有的快捷键&#xff0c;如果不登录QQ的话&#xff0c;是使用不了的。那么我们就只能先登录QQ&#xff0c;然后再一步步的操作。那在没网的情况下…

mysql从库执行delete停止_MySQL主库大表执行delete语句,Ctrl+C具体发生了什么分析...

MySQL主库大表执行delete语句&#xff0c;CtrlC具体发生了什么分析1、查看表结构localhost.qt>show create table doctor_stats_backup\G*************************** 1. row ***************************Table: doctor_stats_backupCreate Table: CREATE TABLE doctor_stat…

python打开火狐浏览器打不开网页_PHP让指定网页只能在微信内置浏览器打开 附代码...

有时候&#xff0c;有些网页不方便在电脑或者手机QQ打开&#xff0c;比如&#xff1a;想创建一个微信活动页面&#xff0c;在电脑或者QQ打开会导致某些功能失效&#xff0c;页面错版等情况&#xff0c;为了避免出现这种情况&#xff0c;其实我们只需让它只能在微信打开就可以了…

我的世界服务器设置op显示,我的世界设置op权限 | 手游网游页游攻略大全

发布时间&#xff1a;2017-08-19导读:不少我的世界腐竹都会收留一些OP帮助自己管理服务器,那么如果想取消OP的权限该如何操作呢?下面小编就来教教大家如何取消OP权限. 问:我的世界如何取消OP权限? 答:/deop 用户名,就是取消OP,/op 用户名 ...标签&#xff1a;我的世界 问答帮…

python turtle画彩虹的代码_如何用python海龟库画彩虹

python生成的彩虹效果&#xff0c;大家可以参考&#xff1a;使用的python版本&#xff1a;3.7.0 &#xff0c;以下为源代码&#xff1a;# rainbow.py from turtle import * from random import * def HSB2RGB(hues): hues hues * 3.59 #100转成359范围 rgb [0.0,0.0,0.0] i …

vsphere虚拟克隆虚拟服务器,vSphere实战攻略2:虚拟机模板与克隆

【IT168 专稿】 (接上篇)"模板"是VMware为虚拟机提供的一项功能&#xff0c;可以让用户在其中一台虚拟机的基础上&#xff0c;很方便的"派生"或"克隆"出多台虚拟机&#xff0c;这减轻了管理员的负担。1.1 创建模板虚拟机在使用模板之前&#xff…

java ee maven_针对新手的Java EE7和Maven项目–第6部分

java ee maven从前面的部分恢复 第1 部分 &#xff0c; 第2 部分 &#xff0c; 第3 部分 &#xff0c; 第4 部分 &#xff0c; 第5部分 在上一篇文章&#xff08;第5部分&#xff09;中&#xff0c;我们发现了如何使用Arquillian&#xff08;我们的EJB服务&#xff09;进行单元…

windows系统git服务器启动,windowsServer服务器上搭建GIt服务器

十年河东&#xff0c;十年河西&#xff0c;莫欺少年穷学无止境&#xff0c;精益求精摸索了一天&#xff0c;终于把服务器端Git搭建完毕。记录下来&#xff0c;省的以后踩坑。如下&#xff1a;在官网搜索框中输入&#xff1a;download 搜索下载型选择为Java选择开发版然后下载下…

如何在黄瓜中进行后端测试

黄瓜是一种规范语言的执行框架。 它并不是要成为测试语言&#xff0c;而是用于创建测试自动化。 黄瓜最适合出现一些现实世界中的参与者互动并取得某种成果的情况。 当可以从用户的角度编写它时&#xff0c;它特别有用。 Given Sarah is a premium club member When Sarah lo…

云服务器 生物信息学,云服务器 生物信息学

云服务器 生物信息学 内容精选换一换挂载有NVMe SSD盘的Linux弹性云服务器(如P1型云服务器)发生故障时&#xff0c;需联系管理员通过异地重建的方式进行恢复&#xff0c;新建故障弹性云服务器。如果故障弹性云服务器在/etc/fstab中设置了NVMe SSD盘的开机自动挂载功能&#xff…

python图像转字符画_python图像处理-字符画风格图片

前言 字符画图片&#xff0c;顾名思义就是由一个个字符组成的图片&#xff0c;下面这张图片很容易帮助你理解&#xff0c;如果我们可以将字符排列好&#xff0c;让他看上去像一个物体的形状&#xff0c;那么最后再将它输出保存为一张图片就可以实现了。下面的这些形状同样可以使…

react生命周期函数_如何优雅的消灭掉react生命周期函数

开源不易&#xff0c;感谢你的支持&#xff0c;❤ star concent^_^序言在react应用里&#xff0c;存在一个顶层组件&#xff0c;该组件的生命周期很长&#xff0c;除了人为的调用unmountComponentAtNode接口来卸载掉它和用户关闭掉浏览器tab页窗口&#xff0c;该顶层组件是不会…

jolokia_Hawtio和Jolokia的Hibernate统计

jolokia企业Java的很大一部分处理数据。 在企业设置中使用数据的所有不同方式中&#xff0c;仍然存在使用任何种类的O / R映射的行之有效且广泛教授的方法。 JPA标准使每个人都比较容易使用它&#xff0c;并且它也应该是可移植的。 但是&#xff0c;我们不要谈论迁移细节。 O /…

JVM垃圾收集和优化

总览 在对系统进行性能相关问题的故障排除时&#xff0c;内存优化是一个需要深入分析每个系统在内存中存储的内容&#xff0c;存储时间和访问模式的地方。 这篇文章是要在背景信息上进行注释&#xff0c;并在此工作中要注意一些要点&#xff0c;这些工作要专门针对基于Java的实…

redis desktop manager连不上redis_Redis安装教程

Ⅰ 简介Redis 是一个开源&#xff08;BSD许可&#xff09;的&#xff0c;内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构&#xff0c;如字符串&#xff08;strings&#xff09;&#xff0c;散列&#xff08;hashes&#…

c++如何将int数组中的值取出*号运算符_如何用动态规划巧妙解决 “双十一” 购物时的凑单问题?羊毛薅起来!!!...

点击上方“程序员大白”&#xff0c;选择“星标”公众号重磅干货&#xff0c;第一时间送达今年过去的 “双十一” &#xff0c;你有薅到羊毛吗&#xff1f;每年的双十一&#xff0c;会有各种促销活动&#xff0c;比如 “满 300元减 80 元”。假如你女朋友的购物车中有 n 个(n &…

python操作界面_Python使用PyQt5的Designer工具创建UI界面

一、Designer-UI编辑器 Designer是pyqt5-tools带的工具&#xff0c;默认可以在Python安装目录下找到的。我的之前项目导入过pyqt5-tools&#xff0c;所以我直接全盘搜索到了。打开designer后&#xff0c;我们可以编辑我们想要的UI界面&#xff0c;下面是我编辑的测试界面&#…

python统计词频_Python统计四六级考试的词频

Python统计四六级考试的词频此文首发于公众号 「Python知识圈」&#xff0c; 欢迎直接去公众号查看阅读文本大概需要 4.6 分钟。今天是教师节&#xff0c;先祝天下所有老师教师节快乐&#xff0c;感谢您在我学生时代对我的谆谆教诲。现在是开学之初&#xff0c;风华正茂的青年才…

python爬虫数据可视化_适用于Python入门者的爬虫和数据可视化案例

本篇文章适用于Python小白的教程篇&#xff0c;如果有哪里不足欢迎指出来&#xff0c;希望对你帮助。 本篇文章用到的模块&#xff1a; requests,re,os,jieba,glob,json,lxml,pyecharts,heapq,collection 首先 本文我们的目的 抓取周杰伦的所有歌曲&#xff0c; 歌词&#xff0…

mysql中如何卸载插件_Eclipse中如何卸载插件

很久没用Eclipse了&#xff0c;今天打开的时候&#xff0c;突然报Android开发插件需要更新。打开插件管理页面&#xff0c;更新Android插件&#xff0c;又提示和旧版本有冲突&#xff0c;心想只能卸载了重新安装了。找了半天没找到在哪下载&#xff0c;把Eclipse目录下的plugin…