1、BFC(Block formatting context)"块级格式化上下文"
它是一个独立的与外界隔离的渲染区域, 它规定了内部的盒子如何布局
2.并不是所有的元素模式都能产生BFC,w3c 规范,参考资料:
https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Block_formatting_context
3、块格式化上下文(Block Formatting Context,BFC) 是Web页面的可视化CSS渲染的一部分,是布局过程中生成块级盒子的区域,也是浮动元素与其他元素的交互限定区域。
下列方式会创建块格式化上下文:
- 根元素或包含根元素的元素
- 浮动元素(元素的
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](https://drafts.csswg.org/css-display/#valdef-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)。
块格式化上下文包含创建它的元素内部的所有内容.
块格式化上下文对浮动定位(参见 float
)与清除浮动(参见 clear
)都很重要。浮动定位和清除浮动时只会应用于同一个BFC内的元素。浮动不会影响其它BFC中元素的布局,而清除浮动只能清除同一BFC中在它前面的元素的浮动。外边距折叠(Margin collapsing)也只会发生在属于同一BFC的块级元素之间。
4、具备生产BFC元素的特点:
有宽度高度, 有外边距margin, 有内边距padding, 有边框border
5、4.BFC布局规则:
5.1.计算BFC的高度时,自然也会检测浮动或者定位的盒子高度。
5.2 内部盒子会在垂直方向, 一个接一个地排列.
5.3.盒子垂直方向的距离由margin决定。属于同一个BFC的两个相邻盒子的margin会发生重叠
5.4.BFC区域不会和float区域重叠
6、BFC应用场景
- 应用一: 清除浮动
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin: 0;
padding: 0;
}
.father1{
border: 1px solid #000;
overflow: hidden;
}
.son01{
float: left;
width: 200px;
height: 200px;
background: red;
}
</style>
</head>
<body>
<!--1.-->
<div class="father1">
<div class="son01"></div>
</div>
</body>
</html>
注意:如果未清除浮动父盒子不会有高度
- 应用二:清除margin层叠
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin: 0;
padding: 0;
}
.father2{
border: 1px solid #000;
}
.son1{
width: 200px;
height: 200px;
background: red;
margin-bottom: 50px;
}
.son2{
margin-top: 150px;
width: 200px;
height: 200px;
background: blue;
}
.test{
overflow: hidden;
}
</style>
</head>
<body>
<div class="father2">
<div class="test">
<div class="son1"></div>
</div>
<div class="son2"></div>
</div>
</body>
</html>
注意:如果没有产生BFC,会有垂直方向外边距塌陷的现象,即margin层叠
- 应用三:清除字围现象
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin: 0;
padding: 0;
}
.father{
width: 500px;
height: 200px;
border: 1px solid #000;
}
.father img{
float: left;
}
.father div{
/*display: inline-block;*/
overflow: hidden;
}
</style>
</head>
<body>
<div class="father">
<img src="images/dog.jpg" alt="">
<div>我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字我是一段文字</div>
</div>
</body>
</html>
字围现象原图对比: