BFC详解

BFC定义


在解释BFC之前,先说一下文档流。我们常说的文档流其实分为定位流、浮动流和普通流三种。而普通流其实就是指BFC中的FC。FC是formatting context的首字母缩写,直译过来是格式化上下文,它是页面中的一块渲染区域,有一套渲染规则,决定了其子元素如何布局,以及和其他元素之间的关系和作用。常见的FC有BFC、IFC,还有GFC和FFC。BFC是block formatting context,也就是块级格式化上下文,是用于布局块级盒子的一块渲染区域。

个人理解是:BFC就是一个有特定规则的区域,这块区域内的元素只遵循特定规则,不受外部影响。

BFC内部规则。

  1. 内部的Box会在垂直方向,一个接一个地放置。PS:感觉不是废话么
  1. Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠。
  2. 每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
  3. BFC的区域不会与float box重叠。
  4. BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
    计算BFC的高度时,浮动元素也参与计算。

相信这5个东西都看得有点懵~~所以接下来浓缩介绍最常用的规则整理。

规则一:BFC是一块独立规则的区域,不受外部影响,而内部元素也不会影响到外部。
规则二:清楚浮动。触发BFC后能感知得到浮动元素的存在。
规则三:BFC感知得到浮动元素的高度。

如何触发BFC

  1. 根元素
  2. float属性不为none
  3. position为absolute或fixed
  4. display为inline-block, table-cell, table-caption, flex, inline-flex
  5. overflow不为visible(常用)

接下来是一些经典的应用场景。

  • 布局的浮动清除:规则二

未触发BFC前:
2.png
触发BFC后:
3.png

HTML:

<body>
<div class="header"></div>
  <div class="content">
    <div class="aside">这是设置浮动的元素</div>
    <div class="main"></div>
  </div>
<div class="footer"></div>
</body>`
CSS:
.header,.footer{
  height:50px;
  background:red;
}
.aside{
  height:400px;
  width:200px;
  background:#09f;
  font-size:30px;
  float:left;
}
.main{
  height:200px;
  margin-left:200px;
  background:pink
}
.content{
  overflow:auto;//在父元素触发BFC,也可以试试其他的触发方式。ps:不过处理起来会比较麻烦。
  //
}

点击代码演示

这里我们介绍一下使用BFC清除浮动和用clear清除浮动的区别:

clear清除浮动:

<style>
.header,.footer{
  height:50px;
  background:red;
}
.aside{
  height:400px;
  width:200px;
  background:#09f;
  font-size:30px;
  float:left;
}
.main{
  height:200px;
  margin-left:200px;
  background:pink
}
.clear{
  clear:both;
}
</style>
<div class="header"></div>
  <div class="content">
    <div class="aside">这是设置浮动的元素</div>
    <div class="main"></div>
    <div class="clear"></div>/*在这里添加一个clear的空div*/
  </div>
<div class="footer"></div>

二者都能达到浮动的效果,不同的是,BFC清除浮动是因为触发到BFC能感知得到浮动元素,计算高度时候浮动元素。而clear清除浮动时候,父元素只计算到.clear的div的高度,但是.clear感知得到浮动元素。当我们添加clear:both的时候,.clear的就被浮动元素挤下去了。规则三

  • 清除外边距。规则二

未清除边距合并前:

4.png

给其中一个添加一个warp并且触发warp的BFC
5.png

html:
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
<div class="content">
  <div class="box1"></div>
  <div class="warp">
    <div class="box2"></div>
  </div>
</div>
</body>
</html>`
CSS:
`.box1,.box2{
  width:100px;
  height:100px;
}
.box1{
  background:#09f;
  margin-bottom:100px;
}
.box2{
  margin-top:100px;
  background:pink;
}
.warp{
  overflow:auto;
}

代码演示点这里

PS:对比的话可以把Html里面的warp去掉试试。

再再PS:外边距合并有2种,垂直margin的合并,还有父子margin的合并,在这里后者就不演示了可以点击这里

结论:

BFC主要就是围绕这3个主要规则去使用。如果对W3C的理解很困难的话,只需要记住这3个规则和触发BFC的条件就行~~~

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 10,719评论 1 91
  • relative:生成相对定位的元素,通过top,bottom,left,right的位置相对于其正常位置进行定位...
    zx9426阅读 466评论 0 2
  • 浮动元素有什么特征?对父容器、其他浮动元素、普通元素、文字分别有什么影响? 浮动元素的特征,对普通元素的影响:一个...
    饥人谷_LEO阅读 139评论 0 0
  • BFC 定义 BFC 全称 Block Formatting Context,块级格式化上下文。 一个 BFC 是...
    shadow123阅读 217评论 1 1
  • 1.在什么场景下会出现外边距合并?如何合并?如何不让相邻元素外边距合并?给个父子外边距合并的范例 概念:在CSS当...
    饥人谷_任磊阅读 233评论 0 3