请描述BFC、及其如何工作

1.背景介绍

BFC全称是Block Formatting Context,是CSS2.1规范定义的,关于CSS渲染定位的一个概念。它的定位体系属于常规文档流。BFC(Block formatting context)直译为"块级格式化上下文"。它是一个独立的渲染区域,只有Block-level box参与,它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。要理解BFC,先了解视觉格式化模型。

视觉格式化模型(visual formatting model),是CSS中的一个概念,用来处理文档并将它显示在视觉媒体上的机制。 我们常说的盒模型只是CSS视觉格式化的一部分。Box 是 CSS 布局的对象和基本单位,一个页面可以想象成由很多个 Box 组成的。元素的类型和 display 属性,决定了这个 Box 的类型。 不同类型的 Box, 会参与不同的 Formatting Context(格式化上下文),   因此Box内的元素会以不同的方式渲染。BFC是页面中的一块渲染区域,并且有一套渲染规则,  它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。

最常见的 Formatting context 有 Block fomatting context (简称BFC)和 Inline formatting context (简称IFC)。

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;

2.知识剖析

BFC( Block formatting contexts)的布局规则

1. 在BFC中的盒子是block-level box,其排列方式是从包含块顶部开始,垂直向下排列。

2.相邻两个盒子之间的垂直间距由margin决定,在一个BFC内部的两个block-level box之间的垂直margin是折叠的。

3. BFC的区域不会与float box重叠。内部元素不受外部元素影响

4.计算BFC的高度时,考虑BFC所包含的所有元素,连浮动元素也参与计算。

5.浮动的BOX区域不会叠加到BFC上。

6.参与BFC的布局的只有普通文档流normal flow中的块级盒,而float、position值不为relative\static的元素不参与BFC的布局。

BFC的范围

MDN 对BFC范围的描述是:

A block formatting context contains everything inside of the element

creating it that is not also inside a descendant element that creates a new block formatting

context.

意思一个BFC包含创建该上下文元素的所有子元素,但不包括创建了新BFC的子元素的内部元素。就是说一个BFC中,如果一个子元素触发了BFC 那么这个子元素内部的元素不受外部BFC的影响。这就是BFC的一个重要属性,让处于BFC内部的元素与外部的元素相互隔离,使内外元素的定位不会相互影响。BFC的这个特性通常用于清除浮动元素的影响

3.常见问题

3.1 如何触发BFC?

3.2 BFC的作用

4 解决方案

4.1创建BFC

BFC的创建方法

1.根元素;

2.浮动 (元素的float不为none);

3.绝对定位元素 (元素的position为absolute或fixed);

4.行内块inline-blocks(元素的 display: inline-block);

5.表格单元格(元素的display: table-cell,HTML表格单元格默认属性);

6. overflow的值不为visible的元素;

7.弹性盒 flex boxes (元素的display: flex或inline-flex);

其中,最常见的就是overflow:hidden; float:left/right; position:absolute。也就是说,当这些属性出现的时候,表示该元素创建了一个BFC。

4.2 BFC的作用

1、消除浮动元素对非非浮动元素的影响

2、清除内部浮动

3、防止垂直 margin 重叠。

相邻块盒子的垂直外边距折叠只有他们是在同一BFC时才会发生。如果他们属于不同的BFC,他们之间的外边距将不会折叠

5.编码实战

1、消除浮动元素对非非浮动元素的影响,看下面的例子,没有创建BFC的情况

main{

/*position:absolute;*/

/*display: inline-block;*/

/*display: table;*/

/*display: flex;*/

/*overflow: hidden;*/

width:1000px;

margin:0auto;

background-color:gainsboro;

border:solid1px;

}

.left{

float:left;

/*margin: 50px 0;*/

width:200px;

height:200px;

background-color:rgba(86,251,166,.5);

}

.right{

/*overflow: hidden;*/

/*float: left;*/

/*margin: 50px 0;*/

width:500px;

background-color:#fff965;

}

.collapse{

/*overflow: hidden;*/

}

我是测试文字我是测试文字我是测试文字我是测试文字我是测试文字我是测试文字我是测试文字我是测试文字

我是测试文字我是测试文字我是测试文字我是测试文字我是测试文字我是测试文字我是测试文字我是测试文字


我们看到浮动盒子覆盖在非浮动盒子上,父元素高度塌陷(没有包围浮动元素)。如果给父元素一个overflow:hidden(创建BFC),看看什么情况

main{

/*position:absolute;*/

/*display: inline-block;*/

/*display: table;*/

/*display: flex;*/

overflow:hidden;

width:1000px;

margin:0auto;

background-color:gainsboro;

border:solid1px;

}


父元素将浮动元素包裹起来了,恢复了高度。

2、我们再给右边盒子创建BFC ,看看是什么情况

.right{

overflow:hidden;

/*float: left;*/

/*margin: 50px 0;*/

width:500px;

background-color:#fff965;

}


出现的效果是浮动元素不再覆盖非浮动元素。这就是BFC的一个重要特性,处于BFC内部的元素与外部的元素相互隔离,使内外元素的定位不会相互影响。我们可以用这个特性来消除浮动元素的字围效果。

3、BFC防止垂直 margin 重叠的作用。

没有BFC的情况下两个元素的上下外边距是折叠的,值取最大的一个。看下面例子:


.left{

/*float: left;*/

margin:50px0;

width:200px;

height:100px;

background-color:rgba(86,251,166,.5);

}

.right{

overflow:hidden;

/*float: left;*/

margin:50px0;

width:500px;

background-color:yellow;

}

我是测试文字我是测试文字我是测试文字我是测试文字我是测试文字我是测试文字我是测试文字我是测试文字

我是测试文字我是测试文字我是测试文字我是测试文字我是测试文字我是测试文字我是测试文字我是测试文字

我们看到类为right的元素也触发了BFC(overflow:hidden;)但是没有消除两个元素的外边距折叠。我们在回顾一下BFC的特性:处于BFC内部的元素与外部的元素相互隔离,使内外元素的定位不会相互影响。也就是BFC用于消除内部元素与外部元素的相互影响。处于同级的BFC就没有这个特性。如果在类为right元素外部包裹一个BFC元素,给类为collapse  的盒子一个overflow:hidden(创建BFC),看看什么情况

我是测试文字我是测试文字我是测试文字我是测试文字我是测试文字我是测试文字我是测试文字我是测试文字

我是测试文字我是测试文字我是测试文字我是测试文字我是测试文字我是测试文字我是测试文字我是测试文字

.collapse{

overflow:hidden;

}


现在另个盒子外边距分离了。

总结一下

元素创建BFC后有如下的效果

1、消除浮动元素对非非浮动元素的影响

2、清除内部浮动

3、防止垂直 margin 重叠。

6.扩展思考

不同条件触发BFC产生的效果是否一样?

display:flex,属性创建的BFC会让内部子元素也继承BFC,其他条件是一样的效果。

7.参考文献

参考1:http://www.cnblogs.com/lhb25/p/inside-block-formatting-ontext.html

参考2:http://web.jobbole.com/84808

参考3:http://www.cnblogs.com/elcarim5efil/p/4745796.html

参考4:http://www.cnblogs.com/lhb25/p/inside-block-formatting-ontext.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,725评论 1 92
  • 先前在学习CSS float时,有同学提到了BFC这个词,作为求知好问的好学生,哪里不懂查哪里,那么今天就来研究一...
    这名字真不对阅读 6,542评论 3 19
  • relative:生成相对定位的元素,通过top,bottom,left,right的位置相对于其正常位置进行定位...
    zx9426阅读 928评论 0 2
  • 大家好,我是IT修真院郑州分院,一枚正直、纯洁、善良的web程序员。 今天给大家分享一下,修真院官网 CSS任务中...
    初晨晒暖心阅读 392评论 0 0
  • 大家好 每日午豹来啦 听说留给创业者的颜色不多了,于是出现了…… 听说你受够了照骗的苦,于是出现了…… 1.联合国...
    玫瑰钻石婚恋阅读 234评论 0 0