深入理解BFC与IFC

深入理解BFC与IFC

正常的流中就是如何把文档中的元素呈现出来 ,而布局呈现的规则就是BFC、IFC和相对位移,而BFC与IFC简单来说就是一个规则,BFC用于块级元素,IFC用于行内元素。

所谓BFC就是块级格式化上下文, Block Formatting Context,在常规流中竖着排列
IFC就是行内格式化上下文, Inline Formatting Content,在常规流中横着排列

除了常规流会影响布局外,还有浮动和绝对定位

要理解BFC与IFC,首先要理解盒子模型

1. 盒子模型

盒子分为行盒、块盒、匿名行盒、匿名块盒

结构

  • content box
  • padding box
  • border box
  • margin box
1.1 IE盒子模型

[图片上传失败...(image-5b18b9-1518507503208)]

width = content-width + padding-width + border-width
height = content-height + padding-height + border-height
1.2 标准盒子模型

[图片上传失败...(image-7d7f12-1518507503208)]

width = content-width
height = content-height
1.3 box-sizing切换IE与标准盒子模型

box-sizing 可以设置盒子模型的类型, IE8+
box-sizing:

  • content-box 默认值使用标准盒子模型
  • border-box 使用IE盒子模型
  • inherit 继承父元素的属性
1.4 行级盒子

例子:https://codepen.io/limomo/pen/PQGdXG
css:
[图片上传失败...(image-994127-1518507503208)]

html:
[图片上传失败...(image-637e21-1518507503208)]

效果:
[图片上传失败...(image-b975d9-1518507503208)]

宽度等于其子行级盒子的外宽度
html:
[图片上传失败...(image-fe891c-1518507503208)]
效果:
[图片上传失败...(image-3ecfc-1518507503208)]
当行盒的宽度大于父宽度时会被拆分为多个行盒,一个成语形容就是五马分尸
html:
[图片上传失败...(image-625c49-1518507503208)]
效果:
[图片上传失败...(image-b53f62-1518507503208)]

行级盒子高度是由font-size决定的
宽度等于其子行级盒子的外宽度,但是当行盒的宽度大于父宽度时会被拆分为多个行盒,一个成语形容就是五马分尸。

  • 行内元素的padding-top,padding-bottom和margin-top,margin-bottom是真的是无效???为啥 不懂???
  • 行内元素的padding-left、padding-right、margin-left、margin-bottom属性设置是有效的
  • 行内元素的padding-top、padding-bottom从显示的效果上是增加的,但其实设置的是无效的。并不会对他周围的元素产生任何影响

2. IFC

先看一个例子
html:
[图片上传失败...(image-456d21-1518507503208)]
css:
[图片上传失败...(image-fc38f4-1518507503208)]
效果:
[图片上传失败...(image-ac8c12-1518507503208)]

  • 根据规则,span.parent所在行的line box的高度受span.parent、span.child、span.inline-block元素对应的inline-level box"高度"的影响。其中span.parent的"高度"为其line-height实际值,span.child的"高度"为其line-height实际值,而span.inline-block的"高度"为其margin box的高度。由于设置line-height:1,因此span.parent和span.child的content box高度等于line-height实际值;

  • 根据vertical-align属性垂直对齐,造成各“高度”间并不以上边界或下边界对齐;

  • span.inline-block红色的上边框(border top)到span.child蓝色的下边框(border bottom)的距离再减去1px即为line box的高度。(line box的下界其实是span.child的content box的下限的,你看"其他元素"的上边框不是和span.child的下边框重叠了吗?如果那是line box的下界,那怎会出现重叠呢)

如何计算行级盒子的高度:

  • 位于该行上的所有in-flow的inline-level box均参与该行line box高度的计算;(注意:是所有inline-level box,而不仅仅是子元素所生成的inline-level box)

  • 各inline-level box根据vertical-align属性值相对各自的父容器作垂直方向对齐;

  • 最上方的box的上边界到最下方的下边界则是line box的高度。

IFC的规则

  • 盒子是水平一个接一个的排列,水平的margin,内边距,边框是可以有的。

  • 垂直方向的对齐,可能是底部对齐,顶部对齐,也可能是基线对齐(这个是默认的);ps.这里的盒子应该是指的内联元素的盒子(span,strong等)和匿名内联盒子(只有文本,没有内联元素包含,自动创建的),他们合称内联盒子,一个或者多个内联盒子组成一个行框,行框的宽度由包含块和出现的浮动决定的(为什么有浮动呢,后面解释)

  • 行框中的内联盒子的高度小于行框的高度时,内联盒子的垂直方向的对齐方式取决于vertical-align属性

  • 当一个行框水平不能容纳内联盒子时,他们将会在垂直方向上产生多个行框,他们上下一个挨着一个,但是不会重叠

  • 一般来说,行框的左边界紧挨着包含容器的左边界,行框的右边界紧挨着包含容器的右边界,(是两个边都紧挨着)。然而,浮动盒子可能存在于包含边框边界和行框边界之间(后面解释这种情况);

  • 多个内联盒子的宽度小于包含他们的行框时,他们在水平方向的分布取决于text-align属性(默认是left)

3. 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.

3.1 规则

  • 如果给一个元素创建了一个BFC,就相当于创建了一个新的容器,容器内和容器外中的元素不会相互影响。外边的BFC规则,不会对容器里的BFC产生影响,而容器里面的BFC也不会对容器外的BFC产生影响,也就是相互隔绝,互不影响。
  • 盒子的布局开始是从包含容器的顶部开始的。
  • BFC内部的盒子会在内部一个接着一个在垂直方向排列
  • 盒子的垂直方向的距离由margin决定,但是在同一个BFC中,在两个相邻的块级元素中,垂直margin会发生折叠
  • BFC的区域不会和float重叠
  • 每个盒子的左边界都要紧靠包含容器的左边界(这也就解释了为什么块级元素都是单独成一行的,如果不单独成行,第二个盒子的左边界怎么紧靠包含容器的左边界)

3.2 如何产生新的BFC

  • float的值不为none。
  • overflow的值不为visible。
  • display的值为table-cell, table-caption, inline-block中的任何一个。
  • position的值不为relative和static。
  • 根元素或者其他包含它的元素

当一个元素设置了新的BFC后,就和这个元素外部的BFC没有关系了,这个元素只会去约束自己内部的子元素

4. 换行的css属性

  white-space
    normal: 忽略/合并空白
    pre: 保留空白,如同<pre>的行为
    nowrap: 忽略/合并空白,文本不会换行,直到遇到<br/>
    pre-wrap: 保留空白,但是会正常地进行换行
     pre-line: 忽略/合并空白,但是会正常地进行换行
    inherit: 从父元素继承。
  word-wrap
    normal: 只在允许的断字点换行
    break-word: 在长单词或URL地址内部进行换行
  word-break
    normal:依照亚洲和非亚洲语言的文本规则,允许在单词内换行。
    keep-all:让亚洲语言文本如同非亚洲语言文本那样不允许在任意单词内换行。
    break-all:允许非亚洲语言文本行如同亚洲语言文本那样可以在任意单词内换行。

对于我们而言,常用的是word-break:break-all;word-wrap:break-word;,从而时间中英文换行的效果

5. 实际应用

5.1 清除浮动
html
[图片上传失败...(image-cf8fd7-1518507503208)]
css
[图片上传失败...(image-3abac0-1518507503208)]
效果
[图片上传失败...(image-75fbe9-1518507503208)]
通过bfc清除浮动 修改css为:
[图片上传失败...(image-aeec5c-1518507503208)]
效果
[图片上传失败...(image-9e8bc9-1518507503208)]

5.2 margin折叠问题
html
[图片上传失败...(image-23a9ee-1518507503208)]
css
[图片上传失败...(image-b91584-1518507503208)]

效果
[图片上传失败...(image-be32ec-1518507503208)]
[图片上传失败...(image-723999-1518507503208)]

修改html和css后效果:

[图片上传失败...(image-4bb262-1518507503208)]
[图片上传失败...(image-e40d6-1518507503208)]
[图片上传失败...(image-2db00e-1518507503208)]

5.3 左边固定,右边自适应布局
html:
[图片上传失败...(image-3070c7-1518507503208)]
css:
[图片上传失败...(image-7d7613-1518507503208)]
效果:
[图片上传失败...(image-71c0b5-1518507503208)]

使用bfc后效果
[图片上传失败...(image-956def-1518507503208)]
[图片上传失败...(image-39bb30-1518507503208)]

5.4 双飞翼布局
双飞翼布局也叫圣杯布局
使用较多的有flex布局还有利用BFC和负边距
flex布局:

[图片上传失败...(image-31b949-1518507503208)]
[图片上传失败...(image-6e16e9-1518507503208)]
[图片上传失败...(image-9f18a6-1518507503208)]

使用BFC和负边距:
[图片上传失败...(image-7d7071-1518507503208)]
[图片上传失败...(image-2c2d85-1518507503208)]
[图片上传失败...(image-5852df-1518507503208)]
[图片上传失败...(image-dea7e8-1518507503208)]
其中对于块元素的位移用的是绝对定位,除了这个之外,还可以使用负边距
[图片上传失败...(image-fb0477-1518507503208)]

6. 参考资料

https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Visual_formatting_model

https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Block_formatting_context

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

//www.greatytc.com/p/5b5505fcc486

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

推荐阅读更多精彩内容

  • 前端开发者丨http请求 https:www.rokub.com 前言见解有限, 如有描述不当之处, 请帮忙指出,...
    麋鹿_720a阅读 10,896评论 11 31
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,734评论 1 92
  • 1. 前言 前端圈有个“梗”:在面试时,问个css的position属性能刷掉一半人,其中不乏工作四五年的同学。在...
    YjWorld阅读 4,428评论 5 15
  • 文/杨先生 学历真的很重要,对于一个人来说,关系以后的发展,有时候也关系着爱情! 01. 故事还得从中学说起。 那...
    杨先生i阅读 662评论 6 14
  • typealias 是用来为已经存在的类型重新定义名字的,通过命名,可以使代码变得更加清晰。 //给Int64起了...
    fordring2008阅读 1,040评论 0 0