是Web页面的可视化CSS渲染的一部分,是布局过程当中生成块级盒子的区域,也是浮动元素与其余元素的交互限定区域。html
下列方式会建立块格式化上下文:布局
根元素或包含根元素的元素flex
- 浮动元素(元素的 float 不是 none)
- 绝对定位元素(元素的 position 为 absolute 或 fixed)
- 行内块元素(元素的 display 为 inline-block)
- 表格单元格(元素的 display为 table-cell,HTML表格单元格默认为该值)
- 表格标题(元素的 display 为 table-caption,HTML表格标题默认为该值)
- 匿名表格单元格元素(元素的 display为 table、table-row、 table-row-group、table-header-group、table-footer-group(分别是HTML table、row、tbody、thead、tfoot的默认属性)或 inline-table)
- overflow 值不为 visible 的块元素
- display 值为 flow-root 的元素
- contain 值为 layout、content或 strict 的元素
- 弹性元素(display为 flex 或 inline-flex元素的直接子元素)
- 网格元素(display为 grid 或 inline-grid 元素的直接子元素)
- 多列容器(元素的 column-count 或 column-width 不为 auto,包括 column-count 为 1)
- column-span 为 all 的元素始终会建立一个新的BFC,即便该元素没有包裹在一个多列容器中(标准变动,Chrome bug)。
块级元素的上外边距和下外边距有时会合并(或折叠)为一个外边距,其大小取其中的最大者,这种行为称为外边距折叠(margin collapsing),有时也翻译为外边距合并spa
毗邻的两个元素之间的外边距会折叠(除非后一个元素须要清除以前的浮动)。翻译
若是在父元素与其第一个子元素之间不存在边框、内边距、行内内容,也没有建立块格式化上下文、或者清除浮动将二者的 margin-top 分开;或者在父元素与其最后一个子元素之间不存在边框、内边距、行内内容、height、min-height、max-height将二者的 margin-bottom 分开,那么这两对外边距之间会产生折叠。此时子元素的外边距会“溢出”到父元素的外面。3d
若是一个块级元素中不包含任何内容,而且在其 margin-top 与 margin-bottom 之间没有边框、内边距、行内内容、height、min-height 将二者分开,则该元素的上下外边距会折叠。code
一些须要注意的地方:orm
- 上述状况的组合会产生更复杂的外边距折叠。
- 即便某一外边距为0,这些规则仍然适用。所以就算父元素的外边距是0,第一个或最后一个子元素的外边距仍然会“溢出”到父元素的外面。
- 若是参与折叠的外边距中包含负值,折叠后的外边距的值为最大的正边距与最小的负边距(即绝对值最大的负边距)的和。
- 若是全部参与折叠的外边距都为负,折叠后的外边距的值为最小的负边距的值。这一规则适用于相邻元素和嵌套元素。
是指没有被非空内容、padding、border 或 clear 分隔开,说明其位置关系。cdn
注意一点,在没有被分隔开的状况下,一个元素的 margin-top 会和它普通流中的第一个子元素(非浮动元素等)的 margin-top 相邻; 只有在一个元素的 height 是 "auto" 的状况下,它的 margin-bottom 才会和它普通流中的最后一个子元素(非浮动元素等)的 margin-bottom 相邻。htm
<div style="border:1px solid red; width:100px;height: 200px;">
<div style="background-color:green; width:50px; margin: 0 auto;">
<div style="margin-top:100px; ">
<div style="height: 50px"></div>
</div>
</div>
</div>
复制代码
效果如图
更改成建立块格式化上下文之后
<div style="border:1px solid red; width:100px;height: 200px;">
<div style="background-color:green; width:50px; margin: 0 auto;display: inline-block;">
<div style="margin-top:100px; ">
<div style="height: 50px"></div>
</div>
</div>
</div>
复制代码