内容是根据B站上果冻公开课的老师讲的整理的,目的是为了让自己巩固加深一下。
1.什么是BFC,为什么会有BFC
2.BFC解决了哪些问题
3.BFC解决的问题还有其他的解决办法吗?
1. 什么是BFC:
BFC:block formatting context:块级格式上下文。
MDN解释:是Web页面的可视CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。
大白话解释:形成BFC的区域会形成一个完全独立的空间,让空间的子元素不会影响其到外面元素的布局,同时外边元素的布局也不会影响到内部元素的布局。
2。触发BFC的条件都有哪些?
给父元素设置一些css属性
1)float 不为 none
2)position:不为relative和static
3)overflow:为auto,hidden或者scroll
4)display:table-cell或者inline-block
3. BFC怎么用,解决了哪些存在的问题
1)解决了浮动元素让父元素的高度塌陷的问题
假设页面中有一个父元素和n个子元素
<div id = "parent">
<div class = "child">child</div>
<div class = "child">child</div>
<div class = "child">child</div>
<div class = "child">child</div>
</div>
#parent{
background-color: aqua;
}
.child{
background-color:chartreuse;
width: 200px;
height: 100px;
border:1px solid black
}
不设置浮动的时候,页面的布局显示的是,没有给父元素设置高度,父元素的高度完全由子元素撑开
此时如果给子元素增加一个浮动的属性
#parent{
background-color: aqua;
}
.child{
float:left;
background-color:chartreuse;
width: 200px;
height: 100px;
border:1px solid black;
}
我们发现 父元素的高度没了。这种现象就是由于浮动导致的父元素高度塌陷。这是因为浮动的元素脱离了文档流,形成了一个新的VIP队列,这样父元素就没办法触碰到这些子元素,从而导致子元素无法去撑开父元素的高度,因为父元素找不到子元素了。
这时候为了解决这个问题,我们可以给父元素设置一些css属性让他触发BFC,从而形成一个独立的空间。
#parent{
background-color: aqua;
overflow: hidden;//可以用上面说的任意一个条件来触发BFC
}
.child{
float:left;
background-color:chartreuse;
width: 200px;
height: 100px;
border:1px solid black;
}
同样的结局父元素高度塌陷还可以有其他办法
(1).比如说直接给父元素添加一个大于等于子元素的高度,只适用于已知子元素的高度
#parent{
background-color: aqua;
height:200px;
}
.child{
float:left;
background-color:chartreuse;
width: 200px;
height: 100px;
border:1px solid black;
}
(2).在浮动的元素后面添加一个新的空元素,设置clear:both用来清除浮动
缺点是会增加无意义的标签
#parent{
background-color: aqua;
}
.child{
float:left;
background-color:chartreuse;
width: 200px;
height: 100px;
border:1px solid black;
}
.clear{ clear: both; }
<div id = "parent">
<div class = "child">child</div>
<div class = "child">child</div>
<div class = "child">child</div>
<div class = "child">child</div>
<div class="clear"></div>
</div>
(3)给父元素添加一个伪类
#parent{
background-color: aqua;
}
.child{
float:left;
background-color:chartreuse;
width: 200px;
height: 100px;
border:1px solid black;
}
#parent::after{
clear: both;
content: '';
display: block;
}
2)。利用BFC还可以解决的事情是:
实现自适应的布局方式
比如左边定宽右边自适应。
.container{
overflow: hidden;
width: 800px;
}
.left{
float: left;
width: 200px;
background-color:yellow;
height: 300px;
margin-right: -100%;
}
.right{
float: left;
background-color:blue;
width: 100%;
height: 300px;
margin-left: 200px;
}
<div class="container">
<div class="left"></div>
<div class="right"></div>
</div>
右边定宽左边自适应
.container{
overflow: hidden;
width: 800px;
padding-right: 200px;
}
.left{
float: left;
width: 100%;
background-color:yellow;
height: 300px;
}
.right{
float: left;
background-color:blue;
width: 200px;
height: 300px;
margin-left: -200px;
}
3).解决外边距垂直方向重合
兄弟元素的外边距,在垂直方向上会取最大值,而不是取和。
相邻的两个元素在垂直方向上的外边距都设置了外边距是20,本来希望在垂直方向上会有40像素的边距,但是最后却只有20像素,这就是垂直方向外边距重合问题
.top{ width: 200px; margin-bottom: 20px; background-color: chartreuse; height: 200px; } .bottom{ width: 200px; margin-top: 20px; background-color: chartreuse; height: 200px; }
<div class="top">上面的盒子</div> <div class="bottom">下面的盒子</div>
解决方法是在其中的一个盒子上添加一个父元素,让他触发BFC
<div class="top">上面的盒子</div>
<div class="wrap">
<div class="bottom">下面的盒子</div>
</div>
.top{
width: 200px;
margin-bottom: 20px;
background-color: chartreuse;
height: 200px;
}
.bottom{
width: 200px;
margin-top: 20px;
background-color: chartreuse;
height: 200px;
}
.wrap{ overflow: hidden; }