BFC 即块级格式上下文(Block Formatting Context),它是指一个独立的块级渲染区域,只有block-level的box参与,该区域拥有一套渲染规则来约束块级盒子的布局,且与区域外部无关。
BFC的生成
- 根元素
- float的值不为none
- overflow的值不为visible 常见的overflow为hidden
- position的值为fixed或absolute
- display的值为table-cell / table-caption / inline-block / flex / inline-flex
BFC的布局规则
1.内部的盒子会在垂直方向,一个个地放置。
2.BFC是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素
3.属于同一个BFC的两个相邻BOx的上下margin会发生重叠
4.计算BFC的高度时,浮动元素也参与计算
5.每个元素的左边,与包含的盒子的左边相接触,即使存在浮动也是如此;
6.BFC的区域不会与float重叠;
BFC能解决哪些问题
1.解决margin重叠问题
2.解决浮动高度塌陷问题
3.解决侵占浮动元素的问题
1:margin重叠问题
.box{
width: 200px;
height: 50px;
margin: 30px 0;
background: black;
}
<div class="box"></div>
<div class="box"></div>
明显的看到了出现了 margin的重叠问题
满足于BFC规则的第三条 : 属于同一个BFC的两个相邻BOx的上下margin会发生重叠
说明两者属于同一个BFC,所以我们将两个div放到不同的BFC中,为第二个div套上一个父元素,然后通过设置overflow hidden来激活BFC
.box{
width: 200px;
height: 50px;
margin: 30px 0;
background: black;
}
.content{
overflow: hidden;
}
<div class="box"></div>
<div class="content">
<div class="box"></div>
</div>
2:浮动后高度塌陷问题
.content1{
width:300px;
border:1px solid black;
}
.box1{
float:left;
width:100px;
height:100px;
border:1px solid red;
}
<div class="content1">
<div class="box1"></div>
</div>
能够看到父元素没有被撑开,BFC规则第四条:
计算BFC的高度时,浮动元素也参与计算
所以我们要将父元素触发BFC
.content1{
width:300px;
border:1px solid black;
overflow:hidden;
}
.box1{
float:left;
width:100px;
height:100px;
border:1px solid red;
}
<div class="content1">
<div class="box1"></div>
</div>
3:侵占浮动元素的问题
.left{
width: 100px;
height: 100px;
background: salmon;
float: left;
}
.right{
width: 300px;
height: 200px;
background: black;
}
<div class="left"></div>
<div class="right"></div>
满足了规则第五点:
每个元素的左边,与包含的盒子的左边相接触,即使存在浮动也是如此
所以我们要将红色区域撑到黑色区域的左边,就需利用规则第六条
BFC的区域不会与float重叠
我们给黑色区域right设置一个 overflow: hidden; 属性来触发BFC;
.right{
width: 300px;
height: 200px;
background: black;
overflow: hidden;
}