BFC
- 含义: BFC(Block Formatting Context),即块级格式化上下文,是css视觉渲染的一部分;通常出现在一个块级元素中的浮动元素与其他元素的相互作用中,故对元素定位和清除浮动有重要意义;
- 块级格式化上下文触发条件:
- 文档根元素(
<html>
) - 值不为
none
的float
属性; - 值为
absolute
及fixed
的position
属性; - 值不为
visible
的overflow
属性的元素;(auto / scroll / hidden,visible
是默认值) - 具有
display: inline-block
的元素; - 具有
display: flex | inline-flex
的元素; - 具有
display: grid |inline-grid
的元素; - 具有
display: table-cell
或display: table-caption
元素(HTML标签中的table cell和table captIon默认为该值); - 具有属性
display: table | inline-table | table-row | table-row-group | table-header-group | table-footer-group
的元素; - 具有
display: flow-root
的元素;(与display: block
相似,但是会产生一个新的BFC); - 具有
contain: content | strict | layout
的元素;
- 文档根元素(
- 特性: 块级格式化上下文就像一个个独立的容器,作用域限于当前BFC内,彼此之间的元素不受影响;
应用
-
清除浮动
当一个元素包含浮动的子元素时,如果父元素没有其他子元素或者浮动子元素高度高于其他子元素,就会导致父元素的高度塌陷; 使用BFC特性,在父级元素添加属性oveflow: auto
或overflow: hidden
则可以清楚浮动的影响(对内部子元素及其他外部元素);<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> .float { float: left; background: lightblue; height: 100px; } #container { overflow: hidden; border: 1px solid green; } </style> </head> <body> <div id="container"> <div class="float">this is a float box</div> </div> </body> </html>
-
margin collapse(边距重叠)
- 边距重叠指的是两个相邻或者嵌套的块,之间没有任何非空元素的隔离而直接接触,会产生边距重叠的现象;
- 外边距重叠的规则:a. 两个边距均为正值或均为负值,取绝对值大的值(查看demo);b. 两个边距值符号相反,取两者的和(查看demo);
- 通过创建新的BFC可以避免两个相邻的
div
元素发生外边距重叠;
// 外边距重叠示例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> .container { margin: 0; padding: 0; border: 1px solid red; } .part1 { width: 100px; height: 100px; margin: 10px; background: orange; } .part2 { width: 100px; height: 100px; margin: 10px; background: lightblue; } </style> </head> <body> <div class="container"> <div class="part1"></div> <div class="part2"></div> </div> </body> </html>
可以看到,.part1
的下边距和.part2
的上边距发生了重叠;将两者放入不同的BFC中可以解决该问题;具体可以查看demo,结果如下:其实只要将其中一个part放到wrapper中产生BFC,就可以消除margin collapsing问题。
-
浮动元素与非浮动元素的布局问题——基于BFC的两栏布局
浮动元素非浮动元素相邻排列时,可能对非浮动元素的排版造成影响;可以查看demo,示意图如下,浮动的图片占据了非浮动div的左边区域;(float出现的初衷就是为了实现图片的文本环绕效果,因此float属性不会覆盖文本内容)
在div.desc
上加入overflow: hidden;
属性创建一个新的BFC,从而使之不被浮动元素覆盖;查看demo,结果示意图如下;借此实现了zuolankuanduguding左栏宽度固定,右栏宽度自适应的两列布局;