什么是BFC?
BFC(Block formatting context)直译为“块级格式化上下文”。它是一个独立的渲染区域,只有Block-level box(块)参与, 它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。
BFC 的布局规则
一、内部的Box会在垂直方向,一个接一个地放置。
二、Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠(按照最大margin值设置)
三、每个元素的margin box的左边, 与包含块border box的左边相接触四、BFC的区域不会与float box重叠。
五、BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。
六、计算BFC的高度时,浮动元素也参与计算
依据BFC布局规则第二条:
Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠 注意:发生重叠后,外边距的高度等于两个发生重叠的外边距的高度中的较大者
案例:
<style type="text/css">
div{ width: 100px;
height: 100px;
}
.box1{
background: #f00;
margin-bottom: 20px;
}
.box2{
background: #0f0;
margin-top: 50px;
}
</style>
</head>
<body>
<div class="box1"></div>
<div class="box2"></div>
</body>
依据BFC布局规则第三条:
每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。 我们可以看到,虽然有浮动的元素box1,但是的左边依然与包含块的左边相接触
案例
<style type="text/css">
div{ width: 100px;
height: 100px;
}
.box1{
float: left;
background: #f00;
}
.box2{
width: 200px;
height: 200px;
background: #0f0;
}
</style>
</head>
<body>
<div class="box1"></div>
<div class="box2"></div>
</body>
依据BFC布局规则第四条:
BFC的区域不会与float box重叠。 看代码和效果图,可以看出,这次的代码比上面的代码多了一行overflow:hidden;用这行代码触发新的BFC后,由于这个新的BFC不会与浮动的box1重叠,所以box2的位置改变了
案例
<style type="text/css">
.box1{
width: 100px;
height: 100px;
float: left;
b ackground: #f00;
}
.box2{
width: 100px;
height: 100px;
overflow: hidden;
background: #0f0;
}
</style>
</head>
<body>
<div class="box1"> </div>
<div class="box2"></div>
</body>
依据BFC布局规则第六条:
计算BFC的高度时,浮动元素的高度也参与计算。
案例
<style type="text/css">
.box1{
border: 2px solid red;
background: #f00;
}
.box2{ width: 100px;
height: 100px;
float: left;
background: #0f0;
}
</style>
</head>
<body>
<div class="box1">
<div class="box2"></div>
</div>
</body>
当div增加 overflow:hidden; 时 效果如下
哪些元素和属性能触发BFC?
根元素(html)
float属性不为none
position为absolute或fixed
display为inline-block, table-cell, table-caption, flex, inline-flex
overflow不为visible
BFC的应用
1、自适应两栏布局
2、清除内部浮动
3、防止margin上下重叠
2020/3/1