BFC(Block Formatting Context)基础分析
W3C官方对于BFC的描述只有3小段,强烈建议想理解BFC的朋友先去看看,链接见文末。
常见的文档流分为:定位流、浮动流、普通流3种。BFC是普通流中的一种。
本文提出3个问题并给出使用BFC来解决这些问题的方法,这3个问题是:
- 外边距折叠(Collapsing Margins)
 - 让一个没有设置高度的容器包含浮动元素
 - 阻止文字环绕
 
什么是BFC
根据W3C对BFC的描述,可以总结出:BFC是一个具有特殊CSS样式的HTML盒子,比如div
标签就经常用来当盒子用。
这些特殊样式如下,下面的样式只要满足一项,就说明这个盒子是BFC
- float: left | right
 - position: fixed | absolute
 - display: inline-block | table-cell | table-caption | flex | inline-flex
 - overflow: hidden | scroll | auto
 
外边距折叠
外边距折叠有很多种情况,最简单的就是上下两个盒子,上面的设置了margin-bottom,
下面的设置了margin-top,这时候总的外边距并不是两者相加,而是取最大的外边距作
为总的外边距。(假设外边距的设置为正值)
下面的代码发生了外边距折叠。
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>外边距折叠</title>
	<style>
	.container { background-color: red; width: 200px; }
	p { background-color: lightgreen; margin: 10px 0; }
	</style>
</head>
<body>
<div class="container">
	<p>Sibling 1</p>
	<p>Sibling 2</p>
</div>
</body>
</html>
下面的代码通过使用overflow: hidden;新创建一个BFC,从而实现阻止外边距折叠。
(overflow: hidden;本来的含义是:如果盒子的内容超出盒子,则这部分内容隐藏。)
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>使用BFC阻止外边距折叠</title>
	<style>
	.container { background-color: red; width: 200px; }
	p { background-color: lightgreen; margin: 10px 0;}
	.newBFC {overflow: hidden; /* 这条样式专门用来创建BFC */}
	</style>
</head>
<body>
<div class="container">
	<p>Sibling 1</p>
	<div class="newBFC">
		<p>Sibling 2</p>
	</div>
</div>
</body>
</html>
发生了外边距折叠(左),使用BFC阻止外边距折叠(右)。
 
容器无高度包含浮动元素
先看以下无BFC,容器无高度包含浮动元素会发生什么。
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>无BFC容器无高度包含浮动元素</title>
	<style>
	.container {
		width: 200px;
		background-color: green;
		outline: 1px dashed red;
	}
	.container div {
		float: left;
		background-color: lightgreen;
		margin: 10px;
	}
	</style>
</head>
<body>
<div class="container">
	<div>Sibling 1</div>
	<div>Sibling 2</div>
</div>
</body>
</html>
上述代码运行效果如下:

可以看到,由于浮动元素是脱离普通文档流的,所以.container盒子发生了塌陷,高度
变为0。如何阻止这种情况发生呢,请看下面的代码:
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>有BFC容器无高度包含浮动元素</title>
	<style>
	.container {
		width: 200px;
		background-color: blueviolet;
		outline: 1px dashed red;
		overflow: hidden; /* 创建BFC */
	}
	.container div {
		float: left;
		background-color: lightgreen;
		margin: 10px;
	}
	</style>
</head>
<body>
<div class="container">
	<div>Sibling 1</div>
	<div>Sibling 2</div>
</div>
</body>
</html>
上面的代码给.container盒子添加了一条样式overflow: hidden;,解决了容器盒子
塌陷的问题。运行效果图如下:

阻止文字环绕
左图右文,文字环绕图片,代码实现如下:
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>左图右文 - 文字环绕图片</title>
	<style>
	.container {
		background-color: gainsboro;
		width: 500px;
  		min-height: 400px;
		padding: 10px
	}
	.pic {
		float: left;
		margin-right: 10px;
	}
	</style>
</head>
<body>
<div class="container">
	<div class="pic">
		<img src="5.jpg" alt="小王子">
	</div>
	<div class="text">
		《小王子》是法国作家安托万·德·圣·埃克苏佩里于1942年写成的著名儿童文学短篇小说。
		本书的主人公是来自外星球的小王子。书中以一位飞行员作为故事叙述者,讲述了小王子
		从自己星球出发前往地球的过程中,所经历的各种历险。作者以小王子的孩子式的眼光,
		透视出成人的空虚、盲目,愚妄和死板教条,用浅显天真的语言写出了人类的孤独寂寞、
		没有根基随风流浪的命运。同时,也表达出作者对金钱关系的批判,对真善美的讴歌。
		《小王子》是法国作家安托万·德·圣·埃克苏佩里于1942年写成的著名儿童文学短篇小说。
		本书的主人公是来自外星球的小王子。书中以一位飞行员作为故事叙述者,讲述了小王子
		从自己星球出发前往地球的过程中,所经历的各种历险。作者以小王子的孩子式的眼光,
		透视出成人的空虚、盲目,愚妄和死板教条,用浅显天真的语言写出了人类的孤独寂寞、
		没有根基随风流浪的命运。同时,也表达出作者对金钱关系的批判,对真善美的讴歌。
	</div>
</div>
</body>
</html>
运行效果如下:

有时候我们不需要文字环绕,就想让文字老老实实待在右边。
左图右文,文字不环绕图片代码实现如下:
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>左图右文 - 文字不环绕图片</title>
	<style>
	.container {
		background-color: gainsboro;
		width: 500px;
  		min-height: 400px;
		padding: 10px
	}
	.pic {
		float: left;
		margin-right: 10px;
	}
	.text {
		overflow: hidden;
	}
	</style>
</head>
<body>
<div class="container">
	<div class="pic">
		<img src="5.jpg" alt="小王子">
	</div>
	<div class="text">
		《小王子》是法国作家安托万·德·圣·埃克苏佩里于1942年写成的著名儿童文学短篇小说。
		本书的主人公是来自外星球的小王子。书中以一位飞行员作为故事叙述者,讲述了小王子
		从自己星球出发前往地球的过程中,所经历的各种历险。作者以小王子的孩子式的眼光,
		透视出成人的空虚、盲目,愚妄和死板教条,用浅显天真的语言写出了人类的孤独寂寞、
		没有根基随风流浪的命运。同时,也表达出作者对金钱关系的批判,对真善美的讴歌。
		《小王子》是法国作家安托万·德·圣·埃克苏佩里于1942年写成的著名儿童文学短篇小说。
		本书的主人公是来自外星球的小王子。书中以一位飞行员作为故事叙述者,讲述了小王子
	</div>
</div>
</body>
</html>
运行效果如下:

总结
- BFC就是页面上的一个隔离的独立容器,容器里面的子元素是不会影响到外面的元素。
 - BFC的区域不会与其它float的元素区域重叠。
 - 计算BFC的高度时,浮动子元素也参与计算。
 
如果有帮助,亲,点个赞奥!不胜感激。
参考资料
https://www.w3.org/TR/CSS22/visuren.html#block-formatting
https://www.sitepoint.com/understanding-block-formatting-contexts-in-css/
http://www.cnblogs.com/xiaohuochai/p/5248536.html#undefined
BFC(Block Formatting Context)基础分析的更多相关文章
- BFC --- Block Formatting Context  --- 块级格式化上下文
		
虽然知道块级格式化上下文是什么东西,但要我把这个东西给说清楚,还真的不是一件容易的事儿,所以这篇文章我就要说说清楚到底什么使传说中的BFC,即块级格式化上下文. 一.BFC的通俗理解 通俗的理解 -- ...
 - CSS BFC(Block Formatting Context)
		
BFC是 W3C CSS 2.1 规范中的一个概念Block Formatting Context的缩写即格式化上下文,它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用.简单讲,它是提 ...
 - BFC (Block formatting context)
		
一:BFC 是什么 MDN解释: A block formatting context is a part of a visual CSS rendering of a Web page. ...
 - BFC(Box Formatting Context)的原理
		
BFC 已经是一个耳听熟闻的词语了,网上有许多关于 BFC 的文章,介绍了如何触发 BFC 以及 BFC 的一些用处(如清浮动,防止 margin 重叠等).虽然我知道如何利用 BFC 解决这些问题, ...
 - 对于BFC(block format context)理解
		
目录 前言 Box: CSS布局的基本单位&盒模型 什么是BFC?(Block formatting contexts) 元素与盒 正常流 块级与行内级 产生垂直外边距合并的必备条件 前言 什 ...
 - 【转】关于Block Formatting Context--BFC和IE的hasLayout
		
转自穆乙 http://www.cnblogs.com/pigtail/ 一.BFC是什么? BFC(Block Formatting Context)直译为“块级格式化范围”. 是 W3C CSS ...
 - 关于Block Formatting Context--BFC和IE的hasLayout
		
转文请标明 --- 出处:穆乙 http://www.cnblogs.com/pigtail/ 一.BFC是什么? BFC(Block Formatting Context)直译为"块级格式 ...
 - css Block formatting context BFC
		
w3c关于BFC解释: http://www.w3.org/TR/CSS21/visuren.html#block-formatting Mdn描述: A block formatting conte ...
 - 什么是BFC(Block Formatting Context)
		
原文:https://segmentfault.com/a/1190000012221820 https://www.w3.org/TR/CSS2/visuren.html#block-formatt ...
 - 关于Block Formatting Context--BFC和IE的hasLayout(转)
		
转文请标明 --- 出处:穆乙 http://www.cnblogs.com/pigtail/ 一.BFC是什么? BFC(Block Formatting Context)直译为“块级格式化范围”. ...
 
随机推荐
- Unity中的特殊文件夹
			
看了雨松MOMO的 Unity3D研究院之手游开发中所有特殊的文件夹学习了,做个笔记. 1.Editor Editor文件夹可以在根目录下,也可以在子目录里,只要名子叫Editor即可.不过我比较喜欢 ...
 - 简单而直接的Python web 框架:web.py
			
web.py 是一个Python 的web 框架,它简单而且功能强大.web.py 是公开的,无论用于什么用途都是没有限制的. 先让大家感受一下web.py 的简单而强大: import web ur ...
 - 【Python】Webpy 源码学习
			
那么webpy是什么呢? 阅读它的源码我们又能学到什么呢? 简单说webpy就是一个开源的web应用框架(官方首页:http://webpy.org/) 它的源代码非常整洁精干,学习它一方面可以让我们 ...
 - MapReduce机制
			
1. MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题.2. MR由两个阶段组成:Map和Reduce,用户只需要实现map()和reduce()两 ...
 - HTML5课程
			
1.新语义化标签:section.header.footer.nav.article.aside.figure.dialog.time.meter.mark.progress.video 2.最新的属 ...
 - 64位系统下,一个32位的程序究竟可以申请到多少内存,4GB还是更多?(一)
			
前言: cpu的位是指一次性可处理的数据量是多少,1字节=8位,32位处理器可以一次性处理4个字节的数据量,依次类推.32位操作系统针对的32位的CPU设计.64位操作系统针对的64位的CPU设计.操 ...
 - 微软公布带外安全更新MS14-068
			
 11月19日,微软公布了带外更新MS14-068以解决Windows 系统中的一个安全漏洞,该补丁安全等级为"严重". MS14-068 | Kerberos 中的漏洞可能同 ...
 - std::function(3)
			
#include <functional> #include <string> #include <iostream> using namespace std; v ...
 - 查询excel中共多少个工作表,绝对好使
			
用宏表函数:具体做法如下: CTLT+F3,定义一个名称,名字随便起,比如AA,公式=GET.WORKBOOK(4),确认. 然后随便一个单元格输入=AA就可以了显示有几个工作表了.
 - python的三元运算
			
python的三元运算是先输出结果,再判定条件.其格式如下: >>> def f(x,y): return x - y if x>y else abs(x-y) #如果x大于y ...