块格式化上下文(Block Formatting Context,BFC) 是Web页面的可视CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。
块格式化上下文对浮动定位与清除浮动都很重要。浮动定位和清除浮动时只会应用于同一个BFC内的元素。浮动不会影响其它BFC中元素的布局,而清除浮动只能清除同一BFC中在它前面的元素的浮动。外边距折叠(Margin collapsing)也只会发生在属于同一BFC的块级元素之间。
1. BFC的作⽤(这块其实就是在阐述在实际⼯作⾥的应⽤)
◦ 清除浮动
.box {
background-color: rgb(224, 206, 247);
border: 5px solid rebeccapurple;
}
.float {
float: left;
width: 200px;
height: 150px;
background-color: white;
border:1px solid black;
padding: 10px;
}
<div class="box">
<div class="float">I am a floated box!</div>
<p>I am content inside the container.</p>
</div>
我们可以使用overflow:hidden在box属性中,产生一个BFC,如下所示
.box {
background-color: rgb(224, 206, 247);
border: 5px solid rebeccapurple;
overflow: auto;
}
.float {
float: left;
width: 200px;
height: 150px;
background-color: white;
border:1px solid black;
padding: 10px;
}
<div class="box">
<div class="float">I am a floated box!</div>
<p>I am content inside the container.</p>
</div>
◦ 外边距折叠
<head>
div{
width: 100px;
height: 100px;
background: lightblue;
margin: 100px;
}
</head>
<body>
<div></div>
<div></div>
</body>
因为两个 div 元素都处于同一个 BFC 容器下 (这里指 body 元素) 所以第一个 div 的下边距和第二个 div 的上边距发生了重叠,所以两个盒子之间距离只有 100px,而不是 200px。
<div class="container">
<p></p>
</div>
<div class="container">
<p></p>
</div>
.container {
overflow: hidden;
}
p {
width: 100px;
height: 100px;
background: lightblue;
margin: 100px;
}
下面我们设置container属性为overflow为hidden可以创建两个BFC容器他们都脱离文档流
**
**
这下他们之间的间距为200px
◦ 解决边距塌陷等问题
<div class="container">
<div class="box box1"></div>
</div>
.box {
width: 20px;
height: 50px;
float: left; // 脱离了文档流形成了一个BFC
border: 4px solid green;
}
我们在外部增加属性overflow
.container {
overflow: hidden; // 外层容器产生BFC
}
2.产生BFC
-
根元素(
<html>) -
浮动元素(元素的
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计算值(Computed)不为visible的块元素 -
display值为[flow-root](https://drafts.csswg.org/css-display/#valdef-display-flow-root)的元素 -
contain值为layout、content或paint
的元素
-
弹性元素(
display为flex或inline-flex元素的直接子元素) -
网格元素(
display为grid或inline-grid元素的直接子元素) -
多列容器(元素的
column-count或column-width不为 `auto,包括
``column-count
为1`) -
column-span为all的元素始终会创建一个新的BFC,即使该元素没有包裹在一个多列容器中(标准变更,Chrome bug)。
讲到这里我想你差不多对BFC有一定了解了,正对外边距折叠和****清除浮动,
BFC原理
◦三种⽂档定位⽅式:普通流 浮动 绝对定位
◦ 具体产⽣原因:BFC是上⾯三种布局⽅式中的普通流,BFC会产⽣⼀个独⽴的容器,该容器内部 的元素不会在布局上影响到外部的元素,在外部的普通流看来它和其他普通流元素⽆差别,⽂ 档最终会按照上⾯说的普通流计算布局。
◦ 注意事项:块格式化上下⽂对浮动定位与清除浮 动都很重要。
参考文献
===