1.什么是BFC?
BFC(Block Formatting Context):块级格式化上下文。可以把它理解成一个独立的区域。只有Block-level box参与, 它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。
Block-level Box:
块级盒block-level box是这种参与了块级排版上下文的一种盒子,每个块级元素都生成了一个包含后代盒子和生成的内容的主要块级盒,并且这个盒子参与了任何定位的计算
2.BFC的定义
BFC是 W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用。当涉及到可视化布局的时候,Block Formatting Context提供了一个环境,HTML元素在这个环境中按照一定规则进行布局。一个环境中的元素不会影响到其它环境中的布局。比如浮动元素会形成BFC,浮动元素内部子元素的主要受该浮动元素影响,两个浮动元素之间是互不影响的。这里有点类似一个BFC就是一个独立的行政单位的意思。也可以说BFC就是一个作用范围。可以把它理解成是一个独立的容器,并且这个容器的里box的布局,与这个容器外的毫不相干。
3.BFC的布局规则
-
内部的Box会在垂直方向,一个接一个地放置
-
Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠
-
每个元素的margin-box的左边, 与包含块border-box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
-
BFC的区域不会与float box重叠。
-
BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
-
计算BFC的高度时,浮动元素也参与计算
4.哪些元素会产生BFC?
- 根元素
- float属性不为none
- position为absolute或fixed
- display为inline-block, table-cell, table-caption, flex, inline-flex
- overflow不为visible
5.BFC的作用以及原理
1.自适应两栏布局:
代码:
<style>
body{
width: 300px;
position: relative;
}
.aside{
width: 100px;
height: 150px;
float: left;
background: rgb(5, 91, 250);
}
.main{
height: 200px;
background: rgb(124, 22, 207);
/* 清除浮动 */
/* overflow: hidden; */
}
</style>
</head>
<body>
<div class="aside"></div>
<div class="main"></div>
</body>
页面:
每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。因此,虽然存在浮动的元素aslide,但main的左边依然会与包含块的左边相接触。BFC
的区域不会与float box
重叠。
我们可以通过通过触发main生成
BFC
, 来实现自适应两栏布局。上面代码的.main里面的overflow: hidden; 解开注释。
当触发main生成
BFC
后,这个新的BFC
不会与浮动的aside重叠。因此会根据包含块的宽度,和aside的宽度,自动变窄。
效果图:
2.清除内部浮动
代码:
<style>
.par{
border: 5px solid rgb(189, 3, 179);
width: 300px;
/* overflow: hidden; */
}
.child{
border: 5px solid rgb(70, 7, 218);
width: 100px;
height: 100px;
float: left;
}
</style>
</head>
<body>
<div class="par">
<div class="child"></div>
<div class="child"></div>
</div>
</body>
页面:
计算BFC
的高度时,浮动元素也参与计算
为达到清除内部浮动,我们可以触发par生成
BFC
,那么par在计算高度时,par内部的浮动元素child也会参与计算。代码就是上面的.par里面的overflow: hidden解开注释
效果图:
3. 防止垂直margin重叠
代码:
<style>
p{
color: rgb(225, 31, 243);
background: rgb(104, 10, 211);
width: 200px;
/* 定义行高 */
line-height: 100px;
text-align: center;
margin: 100px;
}
</style>
</head>
<body>
<p>Haha</p>
<p>Hehe</p>
</body>
页面:
两个p之间的距离为100px,发送了margin重叠。Box
垂直方向的距离由margin决定。属于同一个BFC
的两个相邻Box
的margin会发生重叠 。
我们可以在p外面包裹一层容器,并触发该容器生成一个
BFC
。那么两个P便不属于同一个BFC
,就不会发生margin重叠了。代码如下:
<style>
.wrap{
overflow: hidden;
}
p{
color: rgb(225, 31, 243);
background: rgb(104, 10, 211);
width: 200px;
/* 定义行高 */
line-height: 100px;
text-align: center;
margin: 100px;
}
</style>
</head>
<body>
<p>Haha</p>
<div class="wrap">
<p>Hehe</p>
</div>
效果图:
总结:
BFC
就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
因为BFC
内部的元素和外部的元素绝对不会互相影响,因此, 当BFC
外部存在浮动时,它不应该影响BFC
内部Box的布局,BFC
会通过变窄,而不与浮动有重叠。同样的,当BFC
内部有浮动时,为了不影响外部元素的布局,BFC
计算高度时会包括浮动的高度。避免margin重叠也是这样的一个道理。