BFC
BFC:块级格式化上下文,是一个独立容器,容器里面的元素不会影响到外面的元素,并且 BFC 具有普通容器所没有的一些特性。
如何触发BFC?
只要元素满足下面任意一个条件都可触发BFC
- 根元素(<html>)
- 浮动元素(元素的float不是none)
- 绝对定位(元素的position为absolute或fixed)
- display为inline-block、table-cell、flex、table-caption、inline-flex ...
- overflow值不为visible
BFC的特性:
- 内部的盒子(Box)会在垂直方向上一个接一个的放置
- 垂直方向上的距离由
margin
决定,同一个BFC下相邻两个盒子的margin会发生重叠 - BFC的区域不会与
float的元素区域
重叠 - 计算BFC的高度时,浮动元素也参与计算
- BFC是页面上的一个独立容器,容器里面的子元素不会影响到外面的元素
案例1:
1 <template> 2 <div class="index"> 3 <div class="box" /> 4 <div class="box" /> 5 </div> 6 </template> 7 8 9 <style scoped lang='scss'> 10 .index { 11 padding: 50px; 12 .box { 13 width: 100px; 14 height: 100px; 15 background: pink; 16 margin: 20px; 17 } 18 } 19 </style>
由上图结合css样式可以看出,明明给两个盒子都设置了margin上下左右都是20px,但是上面盒子的底部和下面盒子的顶部margin高度重合只有20px,按css逻辑应该是两个盒子上下间距为40px才对,但是块的上外边距和下外边距会合并为单个边距,取最大值,如果margin相等,则仅为一个,这就是外边距重叠。
解决方案:
如果想要避免外边距的重叠,可以将其放在不同的 BFC 容器中,分别给两个div外层再包裹一层div,并给每个父盒子设置overflow: hidden
1 <template> 2 <div class="index"> 3 <div class="container"> 4 <div class="box" /> 5 </div> 6 <div class="container"> 7 <div class="box" /> 8 </div> 9 </div> 10 </template> 11 12 <style scoped lang='scss'> 13 .index { 14 padding: 50px; 15 .container { 16 overflow: hidden; 17 } 18 .box { 19 width: 100px; 20 height: 100px; 21 background: pink; 22 margin: 20px; 23 } 24 } 25 </style>
案例2:
1 <template> 2 <div class="index"> 3 <div class="container"> 4 <div class="box" /> 5 </div> 6 </div> 7 </template> 8 9 <style scoped lang='scss'> 10 .index { 11 padding: 50px; 12 .container { 13 border: 1px #000 solid; 14 } 15 .box { 16 width: 100px; 17 height: 100px; 18 background: pink; 19 float: left; 20 } 21 } 22 </style>
上图由于子盒子设置了浮动,浮动元素是脱离文档流的,因此子元素脱离了文档流,此时给父盒子设置的border边框没有被子盒子撑开导致高度坍塌
解决方案:
由于计算BFC的高度时,浮动元素也参与计算,所以给父盒子container设置overflow: hidden即可
1 <template> 2 <div class="index"> 3 <div class="container"> 4 <div class="box" /> 5 </div> 6 </div> 7 </template> 8 9 <style scoped lang='scss'> 10 .index { 11 padding: 50px; 12 .container { 13 border: 1px #000 solid; 14 overflow: hidden; 15 } 16 .box { 17 width: 100px; 18 height: 100px; 19 background: pink; 20 float: left; 21 } 22 } 23 </style>
案例3:
1 <template> 2 <div class="index"> 3 <div class="leftBox">我是左边的盒子,浮动了</div> 4 <div class="rightBox">我是右边的盒子,没有浮动;我是右边的盒子,没有浮动;我是右边的盒子,没有浮动;我是右边的盒子,没有浮动;我是右边的盒子,没有浮动,hhh...</div> 5 </div> 6 </template> 7 8 <style scoped lang='scss'> 9 .index { 10 padding: 50px; 11 .leftBox { 12 width: 100px; 13 height: 100px; 14 background: pink; 15 float: left; 16 } 17 } 18 </style>
由上图可以看到rightBox盒子被leftBox盒子因为浮动导致部分区域被覆盖,导致rightBox盒子的内容展示成图片上的样子
解决方案:
由于BFC的区域不会与float的元素区域
重叠,所以给rightBox盒子设置overflow: hidden即可
1 <template> 2 <div class="index"> 3 <div class="leftBox">我是左边的盒子,浮动了</div> 4 <div class="rightBox">我是右边的盒子,没有浮动;我是右边的盒子,没有浮动;我是右边的盒子,没有浮动;我是右边的盒子,没有浮动;我是右边的盒子,没有浮动,hhh...</div> 5 </div> 6 </template> 7 8 <style scoped lang='scss'> 9 .index { 10 padding: 50px; 11 .leftBox { 12 width: 100px; 13 height: 100px; 14 background: pink; 15 float: left; 16 } 17 .rightBox { 18 overflow: hidden; 19 } 20 } 21 </style>