BFC,即Block Format Context,块级格式化做用域,咱们先无论它的目的是什么,先来了解下格式化做用域的相关类型。css
文档流中的行内元素和块级元素,都属于格式化做用域,因此格式化做用域有两种类型:html
格式化做用域,规定了当前节点内部的文档流不受外界文档流的影响。 (缘由很简单啊,由于除了正常文档流还有其余形式的文档流,好比float、fixed、absolute等方式会脱离当前正常文档流)
说白了就是,html和css的一种约定,若是没有这种约定,浏览器去解析下面的代码浏览器
// html
<div class="normal">
<div class="absolute">
<div class="son"></div>
</div>
</div>
//css
.normal {
position: relative;
}
.absolute {
position: absolute;
}
.son {
position: relative;
}
复制代码
对于normal和absolute两个div能够进行正常的解析,那son这个div应该怎么解析这个div?是属于noraml内部的仍是absolute内部的?浏览器就不知道怎么办了,而 有了这种约定,就能够讲son解析为absolute的节点,对文档进行更好的解析,而后呈如今浏览器上面。bash
外边距折叠也不是必定会发生的,下面两种状况就不会发生折叠:app
总结起来,就是margin可能会在图中3个地方发生折叠: this
既然外边距折叠发生在图中三个位置,那么咱们就看看三个位置不发生折叠的状况spa
若是子节点中有浮动元素,而且其余节点具有clear:both/left/right,那么就会把兄弟元素放在浮动元素的边界下方,可是依然会发生外边距折叠。code
行内元素,好比span等等orm
从左到右,不会发生外边距折叠cdn
宽度取决于包含内容的宽度,若是屏幕足够宽,就会把全部的内容一行展现,若是设置了宽度,可能还有overflow,举个例子:
<P>Several <EM>emphasized words</EM> appear
<STRONG>in this</STRONG> sentence, dear.</P>
复制代码
浏览器在解析的时候,会解析为下面的几个元素:
Anonymous: "Several"
EM: "emphasized words"
Anonymous: "appear"
STRONG: "in this"
Anonymous: "sentence, dear."
复制代码
可是可能会解析为一个或者几个line-box,浏览器会作对应的分割,
多是一个line-box:
Several emphasized words appear in this sentence, dear.
复制代码
多是两个line-box:
Several emphasized words appear
in this sentence, dear.
复制代码
也多是三个line-box:
Several emphasized
words appear in this
sentence, dear.
复制代码
具体的分割原理是取决于对应的line-height能不能相互平衡。 固然若是你设置了具体宽度,能够设置换行等其余属性,好比white-space/word-break等,这里就不作赘述了。
inline的高度取决于line-height,可是inline-block类别的(还有table-cell等),取决于margin等。总结起来一句话就是,line-height的高度是盒子顶点到底部之间的距离。
在line-box里面,vertical-align,其中的baseline,就是经过line-height计算得来的,主要包括下面三个部分: