今天我们来聊聊BFC吧

一、BFC是什么?
在解释 BFC 是什么之前,我们先来了解下Box、Formatting Context是什么?
1、Box: CSS布局的基本单位
Box 是 CSS 布局的对象和基本单位, 直观点来说,就是一个页面是由很多个 Box 组成的。元素的类型和 display 属性,决定了这个 Box 的类型。不同类型的 Box, 会参与不同的 Formatting Context(一个决定如何渲染文档的容器),因此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。

2、Formatting context
  Formatting context 是页面中的一块渲染区域,有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。最常见的 Formatting context 有 Block fomatting context (简称BFC)和 Inline formatting context (简称IFC)。

3、BFC
BFC(全称Block Formatting Context)块级格式化上下文,它是指一个独立的块级渲染区域,只有block-level box参与,该区域拥有一套渲染规则来约束块级盒子的布局,且与区域外部无关。

  • 此处引用一简友举出的例子对BFC做一个形象说明
    可以把页面想象成一个大的集装箱,这个集装箱里装的货物就是html元素。在现实生活中为了避免不同人的货物相互混淆,都是把货物打包好再装入集装箱,这样处理后无论你包装里面的货物怎么摆放,都不会影响到其他人的货物。那么这个包装就可以想象成Block Formatting Context

二、BFC的生成
生成BFC的元素决定了BFC的位置与大小!

  • 当一个HTML元素满足下面条件的任何一点,都可以产生BFC
    根元素
    float的值不为none
    overflow的值不为visible
    position的值为asolute,fixed
    display的值为inline-block,table-cell,table-caption,flex,inline-flex(后两个为CSS3属性)
  • 常用的用于触发BFC的CSS样式
    float:left/right
    overflow:hidden/scroll
    position:absolute
    display:inline-block/flex

三、BFC的布局规则?

  • 浏览器对于BFC这块区域的约束规则如下:
    1、内部元素会在垂直方向一个接一个的排列,可以理解为BFC中的一个常规流
    2、垂直方向上的距离由margin决定。即属于同一个BFC的两个相邻Box的margin会发生重叠。
    3、每个元素的左外边距与包含块的左边界相接触(从左向右),即使浮动元素也是如此。(这说明BFC中子元素不会超出他的包含块,而position为absolute的元素可以超出他的包含块边界)
    4、BFC的区域不会与float的元素区域重叠
    5、计算BFC的高度时,浮动子元素也参与计算
    6、BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面元素,反之亦然

四、BFC的应用
1、自适应两栏布局
正常情况下布局如下:虽然存在浮动元素aside,但是main的左边依然与包含块的左边接触,原因可见BFC布局规则第三条,即:每个元素的左外边距与包含块的左边界相接触(从左向右),即使浮动元素也是如此。

但是可以将main生成BFC,来实现自适应两栏布局,原因可参考BFC布局规则第四条,即:BFC的区域不会与float的元素区域重叠。注意main会根据包含块的宽度、aside的宽度自动调整宽窄

2、清除内部浮动
正常情况下布局如下:父容器高度为自适应时,子元素浮动会导致父容器高度坍塌。

原因:
为元素添加浮动后,会导致元素脱离文档流,导致该浮动元素内容在父容器中被抽离出来。由于父容器高度为自适应,即父容器高度依赖于子元素内容将其撑开,那么子元素消失势必会造成父容器高度坍塌。
解决方法:
(1)利用父元素形成BFC,从而开辟出独立空间
根据BFC布局规则第五条,即:计算BFC的高度时,浮动子元素也参与计算。为了清除内部浮动,可以将父元素box生成BFC,那么在计算box的高度时,box内部的浮动元素child也会参与计算。

(2)在父元素中添加伪元素,代码如下:

.box::after{
            content:'';
            display:block;
            clear:both;
        }

(3)在子元素末尾生成一个空元素clearfix

.clearfix{
            clear:both;
        }

3、防止margin重叠
(1)同时满足以下三点会导致margin重叠:
这些margin都处于普通流中,且属于同一个BFC中
这些margin没有被非空内容、padding、border或clear分隔开
这些margin在垂直方向上是毗邻的
(2)重叠边距计算:
当两个margin都为正值或负值时,取两者中绝对值的最大值
当多个margin毗邻且既有正又有负时,取正负margin中各自绝对值最大的相加
(3)解决办法:
法一:给其中一个元素加border或padding
法二:通过overflow:hidden生成BFC
如图所示:

[参考资料]
//www.greatytc.com/p/35e3b3374c26
http://www.cnblogs.com/dojo-lzz/p/3999013.html#undefined
http://www.cnblogs.com/lhb25/p/inside-block-formatting-ontext.html

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

推荐阅读更多精彩内容

  • 这两天咪蒙发了篇《你绝对没想到 丑小鸭逆袭 照片有多劲爆》。我去 那个励志!迅速转发几个女生群和朋友圈,结果...
    燕子貓貓阅读 750评论 2 2
  • 他们都说我是个傻子,因为我除了吃以外,什么都不知道。就连爸爸,也是这么认为的。我没有妈妈,所以,妈妈怎么认为,我不...
    丛铭阅读 1,649评论 10 10
  • 职场打拼的女性何时退休合适?这个话题总是不惑阶段女性的茶余饭后讨论主题。 女友们陆续55岁进入退休生活,或迈入“知...
    怡跃阅读 387评论 2 3
  • 我在这里,等你。 我在这里,很安静很安静的注视着黑夜,你可知道,我在想你。 我在这里,很认真很认...
    寒予陌阅读 203评论 0 1
  • 夜深人静,自己一个人躲在小黑屋里听弗兰克老师的语音资料, 也许正如弗兰克老师说得,你为什么要写作,你多渴望写作, ...
    geecoo阅读 185评论 0 0