一、BFC概念
BFC就是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。具有 BFC 特性的元素可以看作是隔离了的独立容器,容器里面的元素不会在布局上影响到外面的元素,并且 BFC 具有普通容器所没有的一些特性。通俗一点来讲,可以把 BFC 理解为一个封闭的大箱子,箱子内部的元素无论如何翻江倒海,都不会影响到外部。
二、触发 BFC
只要元素满足下面任一条件即可触发 BFC 特性:
- body 根元素
- 浮动元素:float 除 none 以外的值
- 绝对定位元素:position (absolute、fixed)
- display 为 inline-block、table-cells、flex
- overflow 除了 visible 以外的值 (hidden、auto、scroll)
三、BFC布局规则
- 在BFC中,盒子从顶端开始垂直地一个接一个地排列.
- 盒子垂直方向的距离由margin决定。属于同一个BFC的两个相邻盒子的margin会发生重叠
- 在BFC中,每一个盒子的左外边缘(margin-left)会触碰到容器的左边缘(border-left)(对于从右到左的格式来说,则触碰到右边缘)。
- BFC的区域不会与浮动盒子产生交集,而是紧贴浮动边缘。
- BFC计算高度时,也会检测内部浮动或者定位的盒子高度。
四、BFC应用
应用一:清除元素内部浮动
清除元素内部浮动其实就是消除内部元素浮动产生的影响,如因内部元素浮动导致外部元素高度为0。
只要把父元素设为BFC就可以清理子元素的浮动了,最常见的用法就是在父元素上设置overflow: hidden样式。只要触发了父元素的BFC,那么父元素就会包裹着浮动的元素。
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
.father {
width: 300px;
border: 1px solid red;
float: left;
/* 给father 创建了BFC */
}
.son1,
.son2 {
width: 100px;
height: 100px;
background-color: pink;
float: left;
}
.son2 {
background-color: purple;
}
</style>
</head>
<body>
<div class="father">
<div class="son1"></div>
<div class="son2"></div>
</div>
</body>
</html>
应用二、解决外边距合并问题
属于同一个BFC的两个相邻盒子的margin会发生重叠,那么我们创建不属于同一个BFC,就不会发生margin重叠了。
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
.father {
width: 300px;
height: 500px;
border: 1px solid red;
}
.son1, .son2 {
width: 100px;
height: 100px;
background-color: pink;
}
.son1 {
margin-bottom: 50px;
}
.over {
overflow: hidden;
}
.son2 {
background-color: purple;
margin-top: 100px;
}
</style>
</head>
<body>
<div class="father">
<div class="over"> <!--over隔开,那么 son1 就和son1 不是同一BFC-->
<div class="son1"></div>
</div>
<div class="son2"></div>
</div>
</body>
</html>
应用三、制作右侧自适应的盒子,如实现文字环绕效果
普通流体元素BFC后,为了和浮动元素不产生任何交集,会顺着浮动边缘形成自己的封闭上下文。
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
.father {
width: 400px;
height: 500px;
border: 1px solid #000;
margin: 0 auto;
}
.box {
width: 100px;
height: 100px;
background-color: pink;
float: left;
}
.txt {
height: 300px;
background-color: purple;
overflow: hidden;
/*给txt创建BFC区域,使其不和浮动元素产生交集,紧贴制浮动的边缘 */
}
</style>
</head>
<body>
<div class="father">
<div class="box"></div>
<div class="txt">我可以制作右侧自适应的盒子我可以制作右侧自适应的盒子我可以制作右侧自适应的盒子 我可以制作右侧自适应的盒子我可以制作右侧自适应的盒子我可以制作右侧自适应的盒子我可以制作右侧自适应的盒子 我可以制作右侧自适应的盒子我可以制作右侧自适应的盒子我可以制作右侧自适应的盒子 我可以制作右侧自适应的盒子我可以制作右侧自适应的盒子我可以制作右侧自适应的盒子
</div>
</div>
</body>
</html>