# BFC 介绍和解决的问题

# 什么是 BFC?

它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。

# BFC 的渲染规则?

  • 1 内部元素会在垂直方向上一个接一个放置。
  • 2 块级元素垂直方向距离由 margin 决定。属于同一个 BFC 的两个相邻元素 margin 会发生重叠。
  • 3 BFC 的区域不会与浮动元素重叠。
  • 4 BFC 是一个隔离的区域,容易内子元素和容器外的元素互不影响。
  • 5 浮动元素也参与计算 BFC 高度

# 如何产生 BFC?

只要元素满足以下任一条件即可触发 BFC 特性:

  • 浮动元素 float 除 none 以外的值
  • 绝对定位元素 position (absolute fixed)
  • display 为 inline-block table-cell flex
  • overfow 除 visible 以外的值(hidden auto scroll

# 问题 1 同一个 BFC 下外边距会发生折叠(margin 重叠问题)

<style>
*{
    margin: 0;
    padding: 0;
}

div {
    width: 100px;
    height: 100px;
    background-color: #42b983;
    margin: 10px;
}
</style>

//因为有body根元素会产生一个块级格式化上下文(BFC)
<body>
    <div>test1</div>
    <div>test2</div>
</body>

# 问题 2 BFC 解决高度塌陷

当为子元素设置浮动的时候,子元素就会完全脱离文档流,此时将会导致子元素无法撑开父元素,导致父元素的高度塌陷

由于浮动,容器内元素脱离了文档流 所以容器只剩下 10px 边距对象,如果触发 BFC,BFC 可以包裹浮动元素。

<div style="border: 5px solid red;overfow:hidden">
    <div style="width: 100px ;height: 100px;background-color: #42b983;float: left"></div>
</div>

# 问题 3 BFC 可以阻止元素被浮动元素覆盖

原因:因为 float 浮起的元素会脱离文档流,不占用文档流,自然就会遮挡其他盒子。

div style="width: 100px ;height: 100px;background-color: #42b983;float: left">浮动元素</div>
<div style="width: 200px;height: 200px;background-color: orangered;overflow:hidden"></div>