1、BFC的定义
我们常说的文档流分为普通流、浮动流与定位流三种。
FC(formatting context格式化上下文),指的是一块渲染区域,依靠渲染规则,决定其子元素如何布局及与其他元素的关系和作用。
FC分为BFC、IFC、GFC和FFC,其中BFC(block formatting context)块级格式化上下文
BFC可以简单的理解为某个元素的一个css属性,只不过这个属性不能被开发者显式的修改,拥有这个属性的元素对内部元素和外部元素会表现出一些特性,这就是BFC。
2、BFC的特点
1.内部的box会在垂直方向上,一个接一个地放置
<header>我是header</header>
<div>我是div</div>
2.box垂直方向的距离由margin决定,属于同一个bfc的两个box相邻的margin会发生重叠
<style>
.one{
width: 100px;
height: 100px;
background-color: pink;
margin:10px;
}
.two{
width: 100px;
height: 100px;
background-color: yellow;
margin:10px;
}
</style>
<body>
<div class="one"></div>
<div class="two"></div>
</body>
3.BFC区域内部box的左边margin与BFC区域左边border相接触(如果是从右到左格式化则相反,即使浮动也一样)
<style>
aside{
width: 60px;
height: 40px;
background-color: pink;
float:left;
}
main{
width: 150px;
height: 150px;
background-color: blue;
}
</style>
<body>
<aside>有浮动块</aside>
<main>无浮动块</main>
</body>
4.bfc的区域不会与float box重叠,不存在层级,即永远在同一层
<style>
aside{
width: 60px;
height: 40px;
background-color: pink;
float:left;
}
main{
width: 150px;
height: 150px;
background-color: blue;
float:left;
}
</style>
<body>
<aside>有浮动块</aside>
<main>无浮动块</main>
</body>
5.bfc是一个隔离的独立容器,容器内的子元素不会影响外面的元素
6.计算高度时浮动元素也参与
<style>
.parent{
width: 300px;
border:1px solid red;
}
.one,
.two{
width: 50px;
height: 50px;
float: left;
background-color: orange;
margin-left: 10px;
}
</style>
<div class="parent">
<div class="one"></div>
<div class="two"></div>
</div>
当父元素本身不是BFC区域时,子元素的大小不会加入的父元素大小的计算中,因此出现了高度塌陷
而当我们把父元素设置为BFC渲染区域时(给父元素样式加float:left),则浮动子元素会参与父元素总体大小的计算
3、BFC的触发条件
1.根元素,即html
2.float不为none
3.position为absolute或fixed
4.display为inline-block、table-cell、table-caption、flex、inline-flex
5.overflow不为visible
4、BFC的作用
1.自适应两栏布局
2.可以阻止元素被浮动元素覆盖
3.可以包含浮动元素——内部清除浮动
给父div加上 overflow: hidden;清除浮动原理:触发父div的BFC属性,使下面的子div都处在父div的同一个BFC区域之内,此时已成功清除浮动。还可以向同一个方向浮动来达到清除浮动的目的,清除浮动的原理是两个div都位于同一个浮动的BFC区域之中。
4.属于不同的BFC时可以阻止margin重叠
当两个相邻块级子元素分属于不同的BFC时可以阻止margin重叠。操作方法:给其中一个div外面包一个div,然后通过触发外面这个div的BFC,就可以阻止这两个div的margin重叠。