一.块级格式化上下文(block formatting context)
1.元素的显示模式
BFC是一个独立的渲染区域,只有Block-level box参与,它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干
值(display: ;) | 描述 |
none | 此元素不会被显示 |
block | 此元素将显示为块级元素,前后会带有换行符 |
inline | 默认值:此元素将显示为内联元素,元素前后没有换行符 |
inline-block | 行内块元素 |
list-item | 此元素会作为列表显示 |
run-in | 此元素会根据上下文作为块级元素或内联元素显示 |
compact | CSS中有值compact,由于缺乏广泛支持,现已从CSS2.1中删除 |
market | CSS中有值mark,由于缺乏广泛支持,现已从CSS2.1中删除 |
table | 此元素会作为块级元格来显示(类似<table>),表格前后带有换行符 |
inline-table | 此元素会作为内联表格来显示(类似<table>),表格前后没有换行符 |
table-row-group | 此元素会作为一个或多个行的分组来显示(类似<tbody>) |
table-header-group | 此元素会作为一个或多个行的分组来显示(类似<thead>) |
table-footer-group | 此元素会作为一个或多个行的分组来显示(类似<tfoot>) |
table-row | 此元素会作为一个表格行显示(类似<tr>) |
table-column-ground | 此元素会作为一个或多个列的分组来显示(类似<colgroup>) |
table-column | 此元素会作为一个单元格显示(类似<col>) |
table-cell | 此元素会作为一个表格单元格显示(类似<td>和<th>) |
table-caption | 此元素会作为一个表格标题显示(类似<caption>) |
inherit | 规定应该从父元素继承display的值 |
①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.具有BFC的条件
display属性为block、list-item、table的元素,会产生BFC
3.会生成BFC的元素
①根元素 html
②浮动元素(元素的float不是none)
③绝对定位元素(元素的position为absolute或fixed)
④display为inline-block、table-cell、table、inline-table、flex或inline-block、grid或inline-grid
⑤overflow值不为visible的块元素
⑥contain值不为layout、content、paint的元素
⑦多列容器(元素的column-count或column-width不为auto,包括column-count为1)
4.BFC布局规则
①内部的Box会在垂直方向,一个接一个地放置。
②Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠
③每个元素的margin box的左边, 与包含块的左边缘相接触(对于从左往右的格式化,否则相反),即使存在浮动也是如此
④BFC的区域不会与float box重叠
⑤BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此
⑥计算BFC的高度时,浮动元素也参与计算
5.BFC的主要用途
5.1.清除元素内部浮动
①只要把父元素设为BFC就可以清理子元素的浮动了,最常见的用法就是在父元素上设置overflow: hidden样式
②计算BFC的高度时,自然也会检测浮动盒子的高度
5.2.解决外边合并问题
盒子垂直方向的距离由margin决定,属于同一个BFC的两个相邻盒子的margin会发生重叠
5.3.阻止元素被浮动元素覆盖
①BFC的区域不会与浮动盒子产生交集,而是紧贴浮动边缘
②普通流体元素BFC后,为了和浮动元素不产生任何交集,顺着浮动边缘形成自己的封闭上下