一直都知道overflow可以清除浮动,但是却不知道这背后的原理。查了众多资料后才发现有BFC这么个东西,写这篇文章一是为了加深记忆,二是为了加深理解。
什么是BFC?
BFC的全称是Block Formatting Context 块级格式化上下文。
一般情况下BFC只存在于根级元素,但有时我们在设置某些CSS属性时也会产生BFC。但是前提是必须是块级元素。
以下属性声明会产生BFC:
1、float不为none
2、overflow不为visible
3、position不为static和relative
4、display为inline-block table-cell table-caption
5、flex、inline-flex布局
BFC布局规则
1、内部元素会垂直排列
2、垂直方向的间隔由margin决定,同一个BFC里同级别的两个元素之间的margin会产生坍塌
3、元素会靠在外层元素的左边或者右边,float同理
4、BFC不会与float重叠(absolute,fixed除外)
5、BFC计算高度时,float元素的高度也参与计算
6、BFC是隔离的,它里面元素就算翻江倒海也不会影响外层,外层的各种变化也不会影响BFC。
BFC应用
解决margin坍塌
<div>
<div class="elementA" style="margin: 10px"></div>
<div class="elementB" style="margin: 10px"></div>
</div>
elementA与elementB之间的实际margin为10px;
在elementB的外层添加一个div设置BFC属性,此时elementA, elementB的间隔为20px,代码如下:
<div>
<div class="elementA" style="margin: 10px"></div>
<div style="overflow:hidden">
<div class="elementB" style="margin: 10px"></div>
</div>
</div>
解决float覆盖
<div>
<div class="elmentA" style="float:left;width:100px;height:100px;"></div>
<div class="elementB" style="height:200px">123</div>
</div>
以上代码中,elmentA会覆盖到elementB上。
解决方案如下,给elementB添加一个BFC属性elementB便会避开elementA:
<div>
<div class="elmentA" style="float:left;width:100px;height:100px;"></div>
<div class="elementB" style="height:200px;overflow:hidden">123</div>
</div>
计算内层float元素的高度。
<div class="wrapper">
<div style="float:left;height:100px"></div>
</div>
上述代码中,wrapper是没有高度的,虽然子元素设置了高度为100px,但是由于子元素是float所以父元素没有高度。
解决方案如下,给wrapper添加一个BFC属性,这时wrapper的高度就为子元素的高度:
<div class="wrapper" style="overflow:hidden">
<div style="float:left;height:100px"></div>
</div>
对overflow:hidden的额外说明
当设置了一个元素为样式为:
overflow:hidden
height:auto
元素首先会计算出自己的高度才知道应该裁剪哪一部分,当生成BFC时会首先计算里面元素的高度,当里面有float元素时会计算float元素的高度,并把float元素的高度加到自身高度中。但如果高度有具体的值时,float高度超过时还是会被裁剪。
对position:absolute以及position:fixed的额外说明
在本文前面提到过 BFC的区域不会和float区域重叠,但是absolute和fixed布局有例外。absolute和fixed会覆盖到float元素上,因为absolute和fixed已经脱离文档流。