BFC定义
在解释BFC之前,先说一下文档流。我们常说的文档流其实分为定位流、浮动流和普通流三种。而普通流其实就是指BFC中的FC。FC是formatting context的首字母缩写,直译过来是格式化上下文,它是页面中的一块渲染区域,有一套渲染规则,决定了其子元素如何布局,以及和其他元素之间的关系和作用。常见的FC有BFC、IFC,还有GFC和FFC。BFC是block formatting context,也就是块级格式化上下文,是用于布局块级盒子的一块渲染区域。
个人理解是:BFC就是一个有特定规则的区域,这块区域内的元素只遵循特定规则,不受外部影响。
BFC内部规则。
- 内部的Box会在垂直方向,一个接一个地放置。PS:感觉不是废话么
- Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠。
- 每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
- BFC的区域不会与float box重叠。
- BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
计算BFC的高度时,浮动元素也参与计算。
相信这5个东西都看得有点懵~~所以接下来浓缩介绍最常用的规则整理。
规则一:BFC是一块独立规则的区域,不受外部影响,而内部元素也不会影响到外部。
规则二:清楚浮动。触发BFC后能感知得到浮动元素的存在。
规则三:BFC感知得到浮动元素的高度。
如何触发BFC
- 根元素
- float属性不为none
- position为absolute或fixed
- display为inline-block, table-cell, table-caption, flex, inline-flex
- overflow不为visible(常用)
接下来是一些经典的应用场景。
-
布局的浮动清除:规则二
未触发BFC前:
触发BFC后:
HTML:
<body>
<div class="header"></div>
<div class="content">
<div class="aside">这是设置浮动的元素</div>
<div class="main"></div>
</div>
<div class="footer"></div>
</body>`
CSS:
.header,.footer{
height:50px;
background:red;
}
.aside{
height:400px;
width:200px;
background:#09f;
font-size:30px;
float:left;
}
.main{
height:200px;
margin-left:200px;
background:pink
}
.content{
overflow:auto;//在父元素触发BFC,也可以试试其他的触发方式。ps:不过处理起来会比较麻烦。
//
}
这里我们介绍一下使用BFC清除浮动和用clear清除浮动的区别:
clear清除浮动:
<style>
.header,.footer{
height:50px;
background:red;
}
.aside{
height:400px;
width:200px;
background:#09f;
font-size:30px;
float:left;
}
.main{
height:200px;
margin-left:200px;
background:pink
}
.clear{
clear:both;
}
</style>
<div class="header"></div>
<div class="content">
<div class="aside">这是设置浮动的元素</div>
<div class="main"></div>
<div class="clear"></div>/*在这里添加一个clear的空div*/
</div>
<div class="footer"></div>
二者都能达到浮动的效果,不同的是,BFC清除浮动是因为触发到BFC能感知得到浮动元素,计算高度时候浮动元素。而clear清除浮动时候,父元素只计算到.clear的div的高度,但是.clear感知得到浮动元素。当我们添加clear:both的时候,.clear的就被浮动元素挤下去了。规则三
-
清除外边距。规则二
未清除边距合并前:
给其中一个添加一个warp并且触发warp的BFC:
html:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<div class="content">
<div class="box1"></div>
<div class="warp">
<div class="box2"></div>
</div>
</div>
</body>
</html>`
CSS:
`.box1,.box2{
width:100px;
height:100px;
}
.box1{
background:#09f;
margin-bottom:100px;
}
.box2{
margin-top:100px;
background:pink;
}
.warp{
overflow:auto;
}
PS:对比的话可以把Html里面的warp去掉试试。
再再PS:外边距合并有2种,垂直margin的合并,还有父子margin的合并,在这里后者就不演示了可以点击这里
结论:
BFC主要就是围绕这3个主要规则去使用。如果对W3C的理解很困难的话,只需要记住这3个规则和触发BFC的条件就行~~~