0

0

盒模型与BFC的深入讲解

不言

不言

发布时间:2018-11-14 09:30:21

|

3238人浏览过

|

来源于segmentfault

转载

本篇文章给大家分享的内容是关于盒模型以及BFC,有需要的朋友可以参考一下,希望可以帮助到有需要的朋友

标准盒模型与IE盒模型

开发者们都知道,由于历史遗留问题与既定标准的发展,存在着两个css盒模型。即W3C的标准盒模型以及IE的怪异盒模型。在css中,可以用box-sizing去定义元素的盒模型。

比较这两个盒模型的差异之前,我们先来看一张图:

1367336290-55cf27554e5e4_articlex.png

先不讨论宽高,我们把一个元素的组成分为:content、padding、border、margin。

标准盒模型(box-sizing: content-box),即W3C标准中默认的盒模型。它规定,一个元素的宽高并不包含padding和border,那么它在渲染时的宽高计算公式如下:

width = content width;
height = content height;

IE盒模型(box-sizing: border-box),则恰恰相反,它的宽高实际上是包含padding和border的,所以

width = content width + padding + border;
height = content height + padding + border;

24990183-5beb00a42c895_articlex.jpg

至此,两种盒模型的区别应该挺明白的了吧。接下来我们讲讲有关BFC的东西。

什么是BFC

BFC,即 Block Formatting Context 直译为 “块级格式化上下文”。MDN上的定义为:

A block formatting context is a part of a visual CSS rendering of a Web page. It is the region in which the layout of block boxes occurs and in which floats interact with other elements.

其是Web页面的可视化CSS渲染的一部分,是布局过程中生成块级盒子的区域,也是浮动元素与其他元素的交互限定区域

深入了解 BFC 之前,我们看看,什么是 “外边距重叠”。

外边距重叠(Collapsing margins),指的是毗邻的两个或多个外边距 (包括父子元素) 会合并成一个外边距。其中所说的 margin 毗邻,可以归结为以下两点:

  1. 这两个或多个外边距没有被非空内容、padding、border 或 clear 分隔开

  2. 这些 margin 都处于普通流中。

BFC原理

  • 浮动定位和清除浮动时只会应用于同一个BFC内的元素

  • 浮动不会影响其它BFC中元素的布局,而清除浮动只能清除同一BFC中在它前面的元素的浮动

  • 外边距折叠也只会发生在属于同一BFC的块级元素之间

    PHP高级程序设计 模式 框架与测试(中文高清PDF版)
    PHP高级程序设计 模式 框架与测试(中文高清PDF版)

    享有盛誉的PHP高级教程,Zend Framework核心开发人员力作,深入设计模式、PHP标准库和JSON 。   今天,PHP已经是无可争议的Web开发主流语言。PHP 5以后,它的面向对象特性也足以与Java和C#相抗衡。然而,讲述PHP高级特性的资料一直缺乏,大大影响了PHP语言的深入应用。   本书填补了这一空白。它专门针对有一定经验的PHP程序员,详细讲解了对他们最为重要的主题

    下载

因此,我们常常通过建立BFC来防止外边距重叠的发生。

建立BFC

通过以下方式可以使元素成为一个BFC:

  • 浮动(float的值不为none)

  • 绝对定位元素(position的值为absolute或fixed)

  • 行内块(display为inline-block)

  • 表格单元(display为table、table-cell、table-caption等HTML表格相关属性)

  • 弹性盒(display为flex或inline-flex)

  • overflow不为visible

984218723-5beb00a3dafe7_articlex.png

BFC其他应用场景

1、由于BFC在计算高度时,其所包含的所有元素,包括浮动元素都是参与计算的。所以甚至可以使用BFC来达到清除浮动的效果。

2326640383-5beb00a3d282f_articlex.png

创建BFC之后:

2405935527-5beb00a3d5e4c_articlex.png

2、由于BFC与float元素是不会发生重叠的,根据这个特性,可以做到自适应两栏布局。由于左边元素浮动,造成右边元素的背景沾满了整个容器。

376697016-5beb00a3d844a_articlex.png

将右边元素改成BFC之后:

1087506809-5beb00a3d8689_articlex.png

相关专题

更多
C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

10

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

29

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

21

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

21

2026.01.22

宝塔PHP8.4相关教程汇总
宝塔PHP8.4相关教程汇总

本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

13

2026.01.22

PHP特殊符号教程合集
PHP特殊符号教程合集

本专题整合了PHP特殊符号相关处理方法,阅读专题下面的文章了解更多详细内容。

11

2026.01.22

PHP探针相关教程合集
PHP探针相关教程合集

本专题整合了PHP探针相关教程,阅读专题下面的文章了解更多详细内容。

8

2026.01.22

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

55

2026.01.22

Golang 性能分析与pprof调优实战
Golang 性能分析与pprof调优实战

本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

9

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 2万人学习

swoole进程树解析
swoole进程树解析

共4课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号