BFC --- Block Formatting Context --- 块级格式化上下文
虽然知道块级格式化上下文是什么东西,但要我把这个东西给说清楚,还真的不是一件容易的事儿,所以这篇文章我就要说说清楚到底什么使传说中的BFC,即块级格式化上下文。
一、BFC的通俗理解
通俗的理解 --- 布局的时候,BFC提供了一个环境,一些HTML元素在这个环境中按照一定规则进行布局,而这个BFC提供的环境中的元素不会影响到其它环境中的布局。为了让我们有个感性的认识,举个不太合适的例子。你可以把一个BFC想象成大的集装箱,这个集装箱里装的货物就是一些HTML元素。在现实生活中为了避免不同人的货物相互混淆(代码不要乱),都是把货物包装好(一个一个的元素)再装入集装箱,这样的话无论你包装里面的货物(集装箱中的元素)怎么摆放(布局),都不会影响到其他人的货物(其他的集装箱和其中的货物)。那么这个集装箱就可以被想象成Block Formatting Context。来源
BFC的三个作用(使用Overflow: hidden;触发BFC):
- 自适应的两栏布局。 (BFC不会和float的元素重叠, 因为BFC元素不会影响到外部,所以说如果覆盖了float,实际上就是BFC在影响同级的外部元素了)
- 清楚浮动。 (父元素触发BFC,那么BFC内的float元素高度也会参与计算。因为BFC内部不能影响到外部,所以触发BFC之后会形成包裹。如果不包裹,那么显然BFC会影响外部元素的布局的。)
- 消除margin重叠。 两个div,如果在数值方向上使用了margin,则重叠;但是,如果我们使用overflow触发这两个div的BFC,那么这两个div就不会相互相应了。
核心:BFC元素不会影响外部,外部也不会影响BFC元素。
二、Formatting Context
Formatting context 是 W3C CSS2.1 规范中的一个概念。它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。最常见的 Formatting context 有 Block fomatting context (简称BFC)和 Inline formatting context (简称IFC)。
三、BFC定义
BFC(Block formatting context)直译为"块级格式化上下文"。它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。
补充:
block-level box:display 属性为 block, list-item, table 的元素,会生成 block-level box。并且参与 block fomatting context;
inline-level box:display 属性为 inline, inline-block, inline-table 的元素,会生成 inline-level box。并且参与 inline formatting context;
四、 BFC的布局规则
刚刚我们已经介绍了BFC是什么,并且说BFC内部的Block-Level Box都会按照相应的规则进行布局,那么这个规则是什么呢?
1.内部的Box会在垂直方向,一个接一个地放置。
2.Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠(例子:梦想天空)
3.每个元素(所有元素)的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此(例子:梦想天空)。
4.BFC的区域不会与float box重叠。
5.BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
6.计算BFC的高度时,浮动元素也参与计算(例子梦想天空)。
红色部分,我认为是BFC的三大特性。
五、怎么样会触发BFC
BFC 由下列情况之一创建:
7.display: inline-block、flex都可以触发BFC、
8.overflow : hidden、auto、scrool都可以触发BFC
在我的博文《深入理解margin-top》也对此有一定的介绍, 主要是用于解决margin-top的塌陷问题。
六、BFC的作用和原理
1. 自适应两栏布局
2. 清楚内部浮动
这一部分就看梦想天空的博文吧! 讲的是在太好,是我模仿不来的啊~
七、更详细的解释。
我们知道BFC,即Block Formatting Context,即块级格式化上下文,它会独立渲染一个元素, 这个BFC里的元素按照一定的规则排列,BFC内部的元素不会影响到外部的元素,外部的元素也不会影响到内部的元素。
比如,我们两个div,分别设置高度和宽度,按照文档流的规则,一定是换行的形式,上下排列的,但是,如果我们把上面的div的float属性设置为float: left; 那么下面的div就会向上移动,并且float在上面覆盖。
如果我们在上面的div外层再添加一个div,并把这个div添加属性 overflow: hidden; 这时候就会触发外层div的BFC,根据BFC的计算高度要包括内部的float元素的高度,这时就可以清除浮动了。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>block formatting context</title>
<style>
div.wrap {
overflow: hidden;
}
div.first {
float: left;
width: 300px;
height: 300px;
background: red;
}
div.second {
width: 500px;
height: 400px;
background: pink;
}
</style>
</head>
<body>
<div class="wrap">
<div class="first"></div>
</div>
<div class="second"></div>
</body>
</html>
注意: overflow共有5个值,分别是 hidden、 scroll、 visible、inherit、 auto,其中除了 visible和inherit,其他的几个值都可以触发 BFC。
BFC --- Block Formatting Context --- 块级格式化上下文的更多相关文章
- BFC(Box,Formatting,Context) —— 块级格式化上下文
Box:CSS布局的基本单位 Formatting context是页面中的一块渲染区域,最常见的是BFC和IFC,CSS3增加了GFC和FFC BFC定义:块级格式化上下文,它是一个独立的渲染区域, ...
- Block formatting context(块级格式化上下文)
今天看到豆瓣面试官的一篇文章,讲到关于CSS中的一个知识点:Block formatting context ,感觉这个确实挺有用,同时我也挺赞同作者的一些观点的,这里就不展开谈我的感受了, 此文只 ...
- 详说 Block Formatting Contexts (块级格式化上下文)
在上文<详说清除浮动>中,Kayo 较为详细地介绍了 BFC ,也就是本文的主角 Block Formatting Contexts (块级格式化上下文),本文会基于上文关于 BFC 的部 ...
- Block Formatting Contexts (块级格式化上下文) 使用参考
转自:http://kayosite.com/block-formatting-contexts-in-detail.html 在上文<详说清除浮动>中,Kayo 较为详细地介绍了 BFC ...
- Block Formatting Contexts (块级格式化上下文) 详解
最近在学习BootStrap框架,发现里面清除浮动的类 .clearfix 跟平时自己用的不太一样.它的样式是这样的: .clearfix:before { content: " ...
- BFC 详说 Block Formatting Contexts (块级格式化上下文)
定位方案是控制元素的布局,在 CSS 2.1 中,有三种定位方案——普通流 (Normal Flow) .浮动 (Floats) 和绝对定位 (Absolute Positioning) ,下面分别对 ...
- css中margin重叠和一些相关概念(包含块containing block、块级格式化上下文BFC、不可替换元素 non-replaced element、匿名盒Anonymous boxes )
平时在工作中,总是有一些元素之间的边距与设定的边距好像不一致的情况,一直没明白为什么,最近仔细研究了一下,发现里面有学问:垂直元素之间的margin有有互相重叠的情况:新建一个BFC后,会阻止元素与外 ...
- 块级格式化上下文(block formatting context)
在CSS2.1中,有三种定位方案--普通流.浮动和绝对定位: 普通流:元素按照先后位置自上而下布局,inline元素水平排列,直到行被占满后换行,block元素则被渲染为完整的一行,除非指定,所有元素 ...
- 块级格式化上下文(block formatting context)、浮动和绝对定位的工作原理详解
CSS的可视化格式模型中具有一个非常重要地位的概念——定位方案.定位方案用以控制元素的布局,在CSS2.1中,有三种定位方案——普通流.浮动和绝对定位: 普通流:元素按照先后位置自上而下布局,inli ...
随机推荐
- 加载 页面 中js 方法
js 文件中 var mingchen= mingchen|| { init: function (){ } }; 文件中 mingchen.init(); 注意问题: 在新加载 页面中 ...
- ABP源码uml类图
陆陆续续学习ABP框架有一段时间了,阳光铭睿的入门教程和HK Zhang的源码分析文章对我的学习帮助都很大.之所以会花这么大工夫去学习ABP.看ABP的源代码,一是因为本人对于DDD也非常有兴趣,AB ...
- delphi XE7 在Android编译SharedActivity时出错
delphi XE6 在Android编译SharedActivity时正常,但xe7下编译出错,在uses添加Androidapi.Helpers就可以.
- 排序算法汇总(java实现,附源代码)
整理系统的时候发现了原来写的各种算法的总结,看了一下,大吃一惊,那时候的我还如此用心,具体的算法,有的已经模糊甚至忘记了,看的时候就把内容整理出来,顺便在熟悉一下,以后需要的时候就可以直接过来摘抄了. ...
- ubuntu没有权限(不能)创建文件夹(目录)
可以在终端直接运行 sudo nautilus,弹出来的nautilus可以直接GUI操作,中途别关终端.如果遇到需要输入root密码,则输入root密码就可以启动这个图形界面了.
- JDK、JRE、JVM三者关系
一.JDK.JRE.JVM三者的关系 JDK包含了JRE和JVM,JRE包含了JVM,其中JRE中没有javac 附一张官网的详细图: 二.RIA RIA(富客户端):能完成浏览器无法完成的功能,它是 ...
- 洛谷P1963 [NOI2009]变换序列(二分图)
传送门 我可能真的只会网络流……二分图的题一点都做不来…… 首先每个位置有两种取值,所以建一个二分图,只要有完美匹配就说明有解 考虑一下每一个位置,分别让它选择两种取值,如果都不能形成完美匹配,说明无 ...
- 使用Lazy对构造进行重构后比较
用于测试在是否使用Lazy 的情况下,服务器负载,及服务提供情况对比. 服务器环境: 在此机器上安装了1 Hyper-V ,分配走1G内存,同时在本地上安装 SQLServer , 在 ...
- django中给ajax提交加上csrf
代码来自djangoproject网站 在html中的script标签下插入下面代码 在html文档加载时候运行下面代码,并且使用$.ajaxSetup设置ajax每次调用时候传入的数据,$.ajax ...
- STM32F0 中 ADC 多通道转换结果相同的问题
前言 前段时间调试 STM32F030 的 ADC,在多通道转换时遇到了奇怪的问题,使用官方的例程和库函数连续转换多个 ADC 通道,得到的几个通道的结果是一样的,解决办法参考了 关于STM32F0系 ...