什么是 BFC
简单的说,BFC就是一个块级容器,就好比一个div中装着其他东西:更多的div或者a标签、p标签等。
一些常见情况
Case1:浮动问题
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test</title>
<style>
.container {
background-color: cornflowerblue;
}
.child {
width: 50px;
height: 50px;
background-color: lightgreen;
border: solid 1px gray;
box-sizing: border-box; /*让width的宽度加上border的宽度是50px*/
float: left;
}
.otherDiv{
width: 150px;
height: 100px;
background-color: lightpink;
}
</style>
</head>
<body>
<div class="container">
<div class="child"></div>
<div class="child"></div>
</div>
<div class="otherDiv">
</div>
</body>
</html>
container应该包裹两个绿色盒子,而container和otherDiv应该是同级别的,却被接到了绿色盒子开始位置。
说明container的高度应该是0,也就是绿色盒子的容器高度并没有被绿色盒子撑开,我们一般给container设置
一些别的属性来清除浮动
1.给container里面再加一个元素,并设置clear:both
2.让container生成BFC,其高度让子元素参与计算
我们这里这么做,设置container的样式添加一句
.container {
background-color: cornflowerblue;
overflow: hidden;
}
然后container被撑开,高度有了,也不需要往里面加一个元素来清除浮动,设置overflow为hidden就可以了
(宽度很长是因为继承的是100%)
Case2:margin重叠,发生在垂直方向上
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test</title>
<style>
.container {
width: 100px;
height: 100px;
background-color: cornflowerblue;
margin-bottom: 100px;
}
.otherDiv {
width: 100px;
height: 100px;
background-color: lightpink;
margin-top: 50px;
}
</style>
</head>
<body>
<div class="container"></div>
<div class="otherDiv"></div>
</body>
</html>
蓝色块块的底部外边距为100px,粉色的顶部外边距为50px
我们想要的是他们相隔150px,但是效果确实只有100px,
他们两个的最大值成为了最终结果
我们给粉色块块套一个div并让这个div生成BFC(恩。。。就是设置一些overflow为hidden)
结果编程这样了,因为BFC内部的元素和外部的元素互不干扰
继续
那么说了这两种情况和解决方式之后,我们继续说BFC。
就是一个容器,让他里面的东西和外面的东西不干扰。
生成BFC的情况:
- 元素是根元素(html这个标签)
- float不为none
- 定位(position)是绝对定位(absolute)或者固定定位(fixed)
- display为inline-block, table-cell, table-caption, flex, inline-flex(就是块级盒子啦)
- overflow不为visible(这个我们刚才一直在用的呀)
BFC的布局规则:
- 内部的Box会在垂直方向,一个接一个地放置。
- Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠
- 每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
- BFC的区域不会与float box重叠。
- BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
- 计算BFC的高度时,浮动元素也参与计算
内容来源
(前端精选文摘:BFC 神奇背后的原理)http://www.cnblogs.com/lhb25/p/inside-block-formatting-ontext.html
作者:梦想天空