理解BFC

BFC 的全称是 Block Formating Context,译为“块级格式化上下文”,是 CSS 规范中的一个概念,规定了一套渲染规则,规定了内部的子元素如何布局,以及他们和其他元素的关系等。
除了 BFC 之外,规范中还有 IFC 的概念,也就是 Inline Formating Context,译为“内联格式化上下文”。
BFC 和 IFC 都是 CSS 2.1 中的规范,在 CSS3 中,还有 GFC、FFC 等。
本文的重点是对 BFC 的理解,理解了 BFC 之后,就对 CSS 中的很多东西有了原理化的认知,更加明白 CSS 中的一些难点特性,如浮动、定位等。

你要知道的

在学习 BFC 之前,你需要知道下面几个要点:

  • BFC 规定了浏览器对于元素和子元素渲染方式
  • BFC 是需要触发条件的
  • 只有触发了 BFC 的元素才能应用 BFC 的规则
  • BFC 元素和 display:block 的元素没有半毛钱关系

BFC 的一些特性

BFC 包含以下一些常用特性:

  • BFC 容器会阻止外边距叠加
  • BFC 容器会阻止其被浮动元素覆盖
  • 计算 BFC 容器的高度时,会包含浮动元素

这三个特性可以算是 BFC 中最常用的几个特性了,可以帮助我们理解浮动、清浮动等知识。

触发 BFC

满足下列任意条件,就可以触发 BFC:

  • float 设置为 none 以外的值(leftright
  • overflow 设置为 visible 以外的值(hiddenautoscroll
  • position 设置为 relative 以外的值(absolutefixed
  • display 设置为 inline-blocktabletable-celltable-caption

需要注意的是,display:table 本身并不会创建BFC,但是它会产生匿名框(anonymous boxes),而匿名框中的display:table-cell可以创建新的BFC,换句话说,触发块级格式化上下文的是匿名框,而不是display:table。所以通过display:table和display:table-cell创建的BFC效果是不一样的。

上面的文字引用于那些年我们一起清除过的浮动

应用

了解了 BFC 的常用特性以及触发条件后,我们可以使用 HTML+CSS 来对这些理论进行验证。下面依次验证这几个特性:

BFC 容器会阻止外边距叠加

外边距叠加是在元素在垂直方向上margin值的叠加效应,我在这篇文章中也做了一些总结,您可以进行查看。
1.设置元素的 float 属性
HTML 代码:

<div>
    <p></p>
    <p></p>
</div>

CSS 代码:

div{
    height: 20em;
    border: .1em dashed #ccc;
}
p{
    margin: 0;
    width: 5em;
    height: 5em;
    background: red;
}
p:first-of-type{
    margin-bottom:5em ;
}
p:last-of-type{
    float: left;
    background: blue;
    margin-top: 5em;
}

效果如下:

BFC阻止外边距叠加01.png

2.设置元素的 overflow 属性
HTML 代码:

<div>
    <p></p>
</div>
<p></p>

CSS 代码:

div{
    overflow: hidden;
}
p{
    margin: 0;
    width: 5em;
    height: 5em;
    margin-top: 5em;
    background: red;
}
div > p{
    margin-bottom:5em ;
    margin-top: 0;
    background: blue;
}

效果展示:

BFC阻止外边距叠加02.png

3.设置元素的 display 属性
HTML 代码:

<div>
    <p></p>
</div>
<p></p>

CSS 代码:

div{
    display: table-cell;
}
p{
    margin: 0;
    width: 5em;
    height: 5em;
    margin-top: 5em;
    background: red;
}
div > p{
    margin-bottom:5em ;
    margin-top: 0;
    background: blue;
}

效果预览:

BFC阻止外边距叠加03.png

4.设置元素的 position 属性
使用绝对定位固定定位的元素脱离了标准文档流,并且有了层级的概念,因此其边距不会和其他元素的边距产生叠加效应(因为不在同一个层级),这个效果不好演示,这里就略过了~

BFC 容器会阻止其被浮动元素覆盖

我们知道浮动元素是一个 BFC 容器,其脱离了标准的文档流,其后面元素就好像这个元素不存在一样。浮动元素会一直想或者向右移动,直到其碰到了父级元素或者其他元素的边缘才停止。
先看一个简单的 Demo:
HTML 代码:

<div>
    <p></p>
    <p></p>
</div>

CSS 代码:

div{
    width: 20em;
    height: 5em;
    border: 1px dashed #ccc;
}
p{
    width: 5em;
    height: 5em;
    margin: 0;
}

div >p:first-of-type{
    background: red;
    float: left;
}

div >p:last-of-type{
    background: blue;
    width: 10em
}

展示效果:

BCF元素阻止浮动元素对齐覆盖01.png

可见,由于第一个段落采用了浮动,便脱离了标准文档流,其后面的元素就好像这个浮动元素不存在一样,直接挨着父级元素排列,所以视觉效果上,后面的那一个段落被覆盖掉了。
由于BFC 容器会阻止其被浮动元素覆盖,因此我们只需要让后面的段落触发 BFC 就可以阻止浮动元素的覆盖啦。
1.设置元素的 float 属性
CSS 代码:

div{
    width: 20em;
    height: 5em;
    border: 1px dashed #ccc;
}
p{
    width: 5em;
    height: 5em;
    margin: 0;
}

div >p:first-of-type{
    background: red;
    float: left;
}

div >p:last-of-type{
    background: blue;
    width: 10em;
    float: left;
}

运行效果:

BCF元素阻止浮动元素对齐覆盖02.png

2.设置元素的 overflow 属性
CSS 代码:

div{
    width: 20em;
    height: 5em;
    border: 1px dashed #ccc;
}
p{
    width: 5em;
    height: 5em;
    margin: 0;
}

div >p:first-of-type{
    background: red;
    float: left;
}

div >p:last-of-type{
    background: blue;
    width: 10em;
    overflow: hidden;
}

运行效果:

BCF元素阻止浮动元素对齐覆盖03.png

3.设置元素的 display 属性
CSS 代码:

div{
    width: 20em;
    height: 5em;
    border: 1px dashed #ccc;
}
p{
    width: 5em;
    height: 5em;
    margin: 0;
}

div >p:first-of-type{
    background: red;
    float: left;
}

div >p:last-of-type{
    background: blue;
    width: 10em;
    display: inline-block;
}

运行效果:

BCF元素阻止浮动元素对齐覆盖04.png

4.设置元素的 position 属性
CSS 代码:

div{
    width: 20em;
    height: 5em;
    border: 1px dashed #ccc;
}
p{
    width: 5em;
    height: 5em;
    margin: 0;
}

div >p:first-of-type{
    background: red;
    float: left;
}

div >p:last-of-type{
    background: blue;
    width: 10em;
    position: absolute;
}

运行效果:

BCF元素阻止浮动元素对齐覆盖04.png

这个最霸道,不仅阻止了浮动元素对其自身进行覆盖,反而还把浮动元素给覆盖了,666

计算 BFC 容器的高度时,会包含浮动元素

这也就是清除浮动的原理了,因为浮动会将元素的 inline-box 设置为0,而我们知道 containing-box 的高度本质上是由 inline-box 决定的(您可以参考这篇文章,里面进行了一些总结),所以如果一个元素中的元素都进行了浮动,那么这个完成元素的高度就塌陷了。为了解决这个问题,我们只需要“找回”外层元素的高度就可以了,运用到的就是 BFC 的这个特性:计算 BFC 容器的高度时,会包含浮动元素。
关于浮动这一块,里面又有很多概念,需要再用一片文章来写,这里就不再往下写了。后面会出一篇和浮动有关的文章,再进行说明。

总结

本文主要讲解了 BFC 的概念,BFC 是 CSS 2.1 中的一项规范,规定了其和子元素的一些呈现方式。BFC 需要一些触发条件,和浮动、定位、行内块等知识点关系紧密,需要我们去深入理解。

附:参考资料
那些年我们一起清除过的浮动
理解 BFC (Block Formatting Model)
CSS之BFC详解
深度理解现代浏览器中的BFC和IE下的haslayout

完。

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

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,725评论 1 92
  • 前言 css一直不是我的强项,这也是我第一篇css相关的文章,虽然我平时css写的比较少,但其中比较重要的基础...
    ITgecko阅读 387评论 0 7
  • 先前在学习CSS float时,有同学提到了BFC这个词,作为求知好问的好学生,哪里不懂查哪里,那么今天就来研究一...
    这名字真不对阅读 6,542评论 3 19
  • 1、心情:很好 2、体重:172.3斤 3、血压:高压183、低压113 4、吃饭:今天早餐面窝加米巴、中餐盖饭、...
    沐沐满阅读 442评论 0 0
  • 凡梦!今天天气很好呀~
    哑觅阅读 190评论 0 0