在讲BFC之前先来了解一下FC
FC-Formatting Context
FC全称Formatting Context(格式化上下文),元素在标准流里面都属于一个FC的
官网解释:
Boxes in the normal flow belong to a formatting context,which may be block or inline, but not both simultaneously Block-level boxes participate in a block formatting context(BFC). Inline-level boxes participate in an inline formatting context(IFC)
大意就是:元素在标准流中属于一个FC,可能是block FC也可能是inline FC,但不可能是同时属于它俩,块级元素属于BFC 行内元素数据IFC
- 块级元素的布局属于 Block Formatting Context (BFC)
- 行内元素的布局属于Inline Formatting Context(IFC)
BFC-Block Formatting Context
块级元素所在的那个布局环境就是BFC
MDN上有整理哪些具体情况会创建BFC:以下只是一部分
- 根元素<html>
- 浮动元素(元素的float值不是none)
- 绝对定位或fixed定位元素(元素的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为flex或inline-flex元素的直接子元素)
- 网格元素(display为grid或inline-grid元素的直接子元素)
- display为flow-root的元素
BFC有什么用?
在BFC中,
元素从顶部开始在垂直方向一个接着一个排列,
相邻的两个元素之间的距离由margin指定。
在同一个BFC中,相邻的两个元素,在垂直方向上的margin会合并折叠
每个元素的左边缘是紧挨着包含块的左边缘的
那么这个东西有什么用呢?
- 解决margin的折叠问题
- 解决浮动导致的高度塌陷问题
1如何解决margin折叠问题?产生一个新的BFC,就不会折叠了
<html>
<head>
<style>
.class1 {
height: 100px;
width: 300px;
background-color: orange;
margin-bottom: 50px;
overflow: auto;
}
.class2 {
height: 100px;
width: 200px;
background-color: red;
margin-top: 50px;
}
</style>
</head>
<body>
<div class="class1">盒子1</div>
<div class="class2">盒子2</div>
</body>
</html>
上面盒子1和盒子2同属于html这个BFC
盒子1高100px, margin-bottom:50px
盒子2也是高100px, margin-top:50px;
看图所示,两个盒子之间的间距只有50px,margin折叠了
要解决这个问题 就要让两个盒子不属于同一个BFC
给盒子1或者2加属性overflow:auto只是让盒子内部产生了新的BFC,并没有改变两个盒子同属于一个BFC的问题,所以这样改行不通
给盒子1包裹一层div 然后设置div的overflow:auto,这样盒子1属于外层div产生的BFC,而盒子2属于html的BFC,它们属于不同的BFC,就不会出现margin折叠的问题了
2 如何解决高度塌陷问题
<head>
<style>
.class2 {
height: 100px;
width: 100px;
background-color: red;
}
.class3 {
float: left;
background-color: blueviolet;
height: 300px
}
.container {
background-color: aquamarine;
/* overflow: auto; */
}
</style>
</head>
<body>
<div class="container">
<span>span1</span>
<span>span2</span>
<div class="class3">盒子3浮动元素</div>
</div>
<div class="class2">盒子2</div>
</body>
如图所示,container内有三个元素,两个span 一个div盒子3是浮动元素,由于container自身没有高度,盒子3浮动 导致container高度塌陷,
与container平级的盒子2也被覆盖,看不到
解决container高度塌陷,也会同时清浮动,一举两得
给container加overflow:auto
使container内部产生BFC,就会解决高度塌陷的问题,同时盒子2也会显现出来
注意:BFC只能解决浮动导致的塌陷问题,而绝对定位导致的塌陷是解决不了的
如果盒子3是绝对定位,那是无法解决conatiner高度塌陷的问题
BFC的高度在没设置或者auto的情况下 是如何计算高度的呢?
-
如果只有行内元素,则行高的距离,行内元素的高度
-
如果只有块级元素,则是块级元素的高度
-
如果有绝对定位元素,将被忽略
-
如果有浮动元素,那么会增加自身高度以包裹这些浮动元素