这是我参与更文挑战的第17天,活动详情查看:更文挑战
BFC的定义
BFC(Block formatting context)直译为”块级格式化上下文”。它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。
也就是当BFC起作用的时候,其元素内部无论怎么翻江倒海都不会影响到外部元素。同样,外部元素的变化也不会影响到BFC内部元素,这就跟结界一样。可以理解为有一个很强的护盾在包裹着BFC元素,这也是为什么BFC元素不会发生margin重叠的原因。
BFC的布局规则
- 内部的Box会在垂直方向,一个接一个地放置。
- Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠。
- 每个盒子(块盒与行盒)的margin box的左边,与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
- BFC的区域不会与float box重叠。
- BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
- 计算BFC的高度时,浮动元素也参与计算。
引起BFC的条件
BFC起作用不需要特别多的条件,满足以下情况都会引起BFC:
- html根元素
- float不为none的元素
- overflow为auto、hidden或scroll的元素,即不是visible的元素
- position不为relative、none或static的元素
- display为inline-block、table-cell、table-row、table-caption、flex或者inline-flex元素
在清除浮动的时候,只要元素满足以上这些情况,就不需要再加clear属性。
BFC的作用
- 利用BFC避免margin重叠。
- 根据规则第二条:属于同一个BFC的两个相邻Box的margin会发生重叠。所以我们可以设置,两个不同的BFC。
<body>
<p>查看我的margin是多少</p>
<div>
<p>查看我的margin是多少</p>
</div>
</body>
复制代码
- 自适应两栏布局
- 根据第三条:每个盒子的margin box的左边,与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
html:
<body>
<div class="left">LEFT</div>
<div class="right">RIGHT</div>
</body>
复制代码
css:
.left {
width: 100px;
height: 150px;
float: left; // 此处
background: pink;
text-align: center;
line-height: 150px;
font-size: 24px;
font-weight: bold;
color: #fff;
}
.right {
eight: 300px;
background: cornflowerblue;
text-align: center;
line-height: 300px;
font-size: 40px;
font-weight: bold;
color: #fff;
}
复制代码
又因为第四条:BFC的区域不会与float box重叠。
所以让right单独成为一个BFC。
.right {
overflow: hidden; //增加
}
复制代码
right会自动的适应宽度,形成了一个两栏自适应的布局。
- 清楚浮动。
当我们不给父节点设置高度,子节点设置浮动的时候,会发生高度塌陷,这个时候我们就要清楚浮动。
- 根据第六条:计算BFC的高度时,浮动元素也参与计算
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END