CSS布局之BFC

158 阅读2分钟

image.png

介绍

BFC全称为Block Formatting Context,翻译为块级格式化上下文,BFC目的是形成一个相对外界的独立空间,内部任凭翻江倒海都不会影响外部元素.

块级上下文根据块布局规则,布局子元素,每个块级上下文都有其特定规则

如图:

图来源于 yachen168

规则:

  1. 内部盒子会在垂直方向上一个接着一个的放置

  2. 对同一BFC的两个相邻的盒子的margin会发生重叠,与方向无关

  3. BFC区域不会与float区域重叠

  4. 每个元素的左外边距与包含块的左边界相接触(从左到右),即使浮动元素也是如此

  5. 计算BFC的高度时,浮动子元素也参与计算

  6. BFC就是页面上的一个隔离独立容器,容器里面子元素不会影响外面的元素,反之亦然

常见的触发条件:

  • 根元素
  • 开启float,不为none
  • 绝对定位,粘性定位
  • 开启overflow,不为visible
  • display的值为,inline-block,table-cell,table-caption

她们都有个共同特点:脱离文档流

块格式化上下文对浮动定位(参见 float)与清除浮动(参见 clear)都很重要

应用场景:

  1. 自适应两栏布局

原理:为了避免重叠,需要元素放在不同的bfc上,所以就可以把侧边栏固定宽度且左浮动,而对右侧内容触发 BFC,使得它的宽度自适应该行剩余宽度。

<div class="contain">
  <div class="box1-contain">
      <div class="box1"></div>
  </div>
  <div class="box2-contain">
      <div class="box2"></div>
  </div>
</div>
.contain{
  width:300px;
  border:1px solid red;
}

.box1{
  width:100px;
  height:100px;
  border:1px solid black;
  margin:10px;
  float:left;
}

.box2{
  width:100px;
  height:100px;
  margin:10px;
  border:1px solid black;
}

.box2-contain{
  overflow:hidden;
}

image.png

  1. 防止margin合并

原理:在同一BFC下垂直的margin会发生合并,需要两个元素处在不同的BFC下,可防止margin合并。

<div class="layout">
    <div class="a">a</div>
    <div class="b">b</div>
</div>
.a,
.b {
    width:100px;
    border: 1px solid #999;
    margin: 30px;
}

image.png

<div class="contain-b">
    <div class="b">b</div>
</div>
.contain-b {
    overflow: auto;
}

image.png

  1. 清除浮动

原理:当父元素开启overflow时,子元素如果开启浮动,相应的父元素将其包裹住,就会清除浮动

<div class="contain">
  <div class="box1 box"></div>
  <div class="box2 box"></div>
</div>

image.png

.contain{
  width:300px;
  border:1px solid red;
/*   overflow:auto; */
}
.box{
  width:100px;
  height:100px;
  border:1px solid black;
  float:right;
}

image.png 4. 阻止元素被浮动元素覆盖

原理:根据BFC区域不会与float区域重叠规则,可以给兄弟元素开启BFC,使其分隔开

<div class="contain">
  <div class="box1"></div>
  <div class="box2"></div>
</div>  
.contain{
  width:400px;
  border:1px solid red;
}

.box1{
  width:100px;
  height:100px;

  background:#bfc;
  float:left;
}

.box2{
  width:300px;
  height:300px;

  background:#ffa;
/*   overflow:auto; */
}

image.png

**解决:**在兄弟元素加上overflow

image.png

参考链接

根据规则解释BFC

MDN

十分钟理解BFC

深入理解BFC

张鑫旭BFC