CSS格式化上下文之BFC

一,可视化格式模型

盒子模型是CSS中元素产生的box的自身构成,就是我们平常所认知的包含边距、边框、内容的矩形区域。而可视化格式模型则是把这些box,按照规则摆放到页面上,也就是通常所说的布局。换句话说,可视化格式模型是整个页面的模型,这个模型规定了怎么在页面里摆放box,box相互作用等等,属于CSS的最为核心的概念之一。W3C标准的说法是,它规定了用户端(浏览器)在媒介(显示器)中如何处理文档树(document tree)。

在可视化格式模型中,每一个元素都会根据盒子模型产生0个或多个box,而这些box的布局受以下因素的影响:

● 1. box尺寸和类型

类型是指 display 特性所决定的元素类型,如:div 是块级元素,span 是行内元素等

● 2. 定位体系

元素在布局时,根据3种定位体系定位。分别是,常规流、浮动和绝对定位。

● 3. 在文档树中,元素之间的关系。

比如,一个块元素包含两个互为兄弟节点的浮动元素,后面那个浮动元素的布局,会受前面元素以及它包含块的影响。

● 4. 外部信息。

比如,可视窗口的大小,我们有时候会做页面自适应窗口大小的功能,就是因为,窗口大小对布局有影响。再如,图片的固有尺寸,会影响行内替换元素的尺寸,进而影响整个布局。

可视化格式模型(标准或者说规范),并不会规定所有格式的细节,用户端(浏览器)在处理本规范未包含的格式化情形时,表现可能会有所不同,在这部分,会涉及到很多新的概念:包含块,元素的类型,定位体系,块级格式化上下文(Block Formatting Contexts),行内格式化上下文(Inline Formatting Contexts),浮动,绝对定位,z序,以及可视化格式模型的细节部分,自动宽度高度的计算。在这里我们主要阐述下BFC,IFC、GFC(GridLayout Formatting Contexts,网格布局格式化上下文)、FFC(Flex Formatting Contexts,自适应格式化上下文)后续再阐述。其中GFC、FFC是CSS3新增的概念。

二,格式化上下文(Formatting Contexts)

FC是W3C CSS2.1规范中的一个概念。它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用,简单来说,FC就是一个决定如何渲染文档的容器。

盒子(Box)是CSS布局的对象和基本单位,可以这样说,一个页面就是由很多个Box组成的。元素的类型和dsiplay属性,决定了这个Box的类型,不同类型的Box,会参与不同的FC,因此Box内的元素会以不同的方式渲染。

三,块级格式化上下文(Block Formatting Contexts)

Block-level(块级盒子)会参与BFC,这里只是说参与,并不是所有都会。标准中是这么定义的:浮动元素和绝对定位元素,非块级盒子的块级容器(例如 inline-blocks, table-cells, 和 table-captions),以及overflow值不为“visiable”的块级盒子,都会为他们的内容创建新的块级格式化上下文。

BFC的主要特性:

● 1,内部的Box会在垂直方向,从顶部开始一个接一个地放置。

● 2,Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生叠加

● 3,每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。

● 4,BFC的区域不会与float box叠加。

● 5,BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然。

● 6,计算BFC的高度时,浮动元素也参与计算。

触发BFC的方式:

● 1,float 除了none以外的值

● 2,overflow 除了visible 以外的值(hidden,auto,scroll )

● 3,display (table-cell,table-caption,inline-block, flex, inline-flex)

● 4,position值为(absolute,fixed)

● 5,fieldset元素

在以上的情况里可以创建BFC。

BFC应用场景:

1,解决margin叠加问题

每个p之间的距离为50px,发生了外边距叠加,这是因为属于同一个BFC的两个相邻Box的margin会发生叠加,解决这个问题的方法是给p新加一个父元素,让它触发BFC。

2,用于布局

元素的左外边距会触碰到包含块容器的左外边框,就算存在浮动也会如此。BFC不会与浮动盒子叠加,因此我们可以创建一个新的BFC来解决这个问题,如下图设置类名为main的元素的overflow来触发它的BFC。

3.用于清除浮动,计算BFC高度。

我们发现由于里面两个子元素浮动的关系,两个box已经脱离了父元素的包含块,父元素高度已经塌陷,我们需要让父元素包含两个box子元素,这样计算高度时,两个浮动子元素就会参与,所以我们要闭合浮动,触发父元素的BFC,浮动元素也会参与计算。

可以结合BFC,解决其他场景的相关问题,这里就不一一列举了。

参考链接:

http://www.w3.org/TR/CSS2/visuren.html#block-formatting

http://www.w3cplus.com/css3/css3-grid-layout.html

http://www.w3.org/TR/css3-grid-layout

http://www.w3.org/TR/css3-flexbox/

http://www.fiffys.com/?p=23

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

推荐阅读更多精彩内容