本文转载(https://segmentfault.com/a/1190000013647777

一.BFC的概念


1.规范解释

  块格式化上下文(Block Formatting Context,BFC)是Web页面的可视化CSS渲染的一部分,是布局过程中生成块级盒子的区域,也是浮动元素与其他元素的交互限定区域。

2.通俗解释:

  • BFC 是一个独立的布局环境,可以理解为一个容器,在这个容器中按照一定规则进行物品摆放,并且不会影响其它环境中的物品
  • 如果一个元素符合触发BFC的条件,则该元素中的布局不受外部影响。
  • 浮动元素会创建BFC,所以浮动元素内部子元素主要受浮动元素影响,两个浮动元素之间是互不影响的。

二.创建BFC


  1. 根元素或包含根元素的元素
  2. 浮动元素 float = left | right 或 inherit(≠ none)
  3. 绝对定位元素 position = absolute 或 fixed
  4. display = inline-block | flex | inline-flex | table-cell 或 table-caption
  5. overflow = hidden | auto 或 scroll (≠ visible)

三.BFC的特性


  1. BFC 是一个独立的容器,容器内子元素不会影响容器外的元素。反之亦如此。
  2. BFC盒子之间垂直的间距是由 margin 决定的。
  3. 在同一个 BFC 中,两个相邻的块级盒子的垂直外边距会发生重叠。
  4. BFC 区域不会和 float box 发生重叠。
  5. BFC 能够识别并包含浮动元素,当计算其区域的高度时,浮动元素也可以参与计算了。

四.BFC的作用


1.包含浮动元素 (清除浮动)

  • 浮动元素会脱离文档流(绝对定位元素也会脱离文档流),导致无法计算准确的高度,这种问题称为高度塌陷
  • 解决高度塌陷问题的前提是能够识别并包含浮动元素,也就是清除浮动

问题举例:如上左图所示,容器(container)没有高度或者 height = auto ,并且其子元素(sibling)是浮动元素,所以该容器的高度是不会被撑开的,即高度塌陷。

解决方法:在容器(container)中创建 BFC。

HTML:

  1. <div class="container">
  2. <div class="Sibling"></div>
  3. <div class="Sibling"></div>
  4. </div>

CSS:

  1. .container {
  2. overflow: hidden; /* creates block formatting context */
  3. background-color: green;
  4. }
  5. .container .Sibling {
  6. float: left;
  7. margin: 10px;
  8. background-color: lightgreen;
  9. }

特别提示:

  • 通过 overflow:hidden 创建 BFC,固然可以解决高度塌陷的问题,但是大范围应用在布局上肯定不是最合适的,毕竟 overflow:hidden 会造成溢出隐藏的问题,尤其是与 JS 的交互效果会有影响。
  • 我们可以使用 clearfix 实现清除浮动,这里就不多介绍了。想了解 清楚浮动请参看另一篇文章(https://www.cnblogs.com/lauzhishuai/p/10953608.html

2.BFC中的元素会产生外边距折叠

  相邻的两个盒子(可能是兄弟关系也可能是祖先关系)的垂直边距相遇时, 它们将形成一个外边距。这个外边距的高度等于两个发生折叠的外边距的高度中的较大者

HTML

  1. <div class="Container">
  2. <p>Sibling 1</p>
  3. <p>Sibling 2</p>
  4. </div>

CSS

  1. .Container {
  2. background-color: red;
  3. overflow: hidden; /* creates a block formatting context */
  4. }
  5. p {
  6. background-color: lightgreen;
  7. margin: 10px 0;
  8. }

如上图所示:红色盒子(Container)中包含两个绿色的兄弟元素(P),并且红色盒子设置 overflow: hidden; 则一个BFC 已经被创建,即导致外边距折叠。

理论上两个兄弟元素之间的边距应该是两个元素的边距之和(20px),但实际是 10px。这就是外边距折叠导致的。

2.1 折叠外边距的取值

  • 两个相邻的外边距都是 正数 时,折叠外边距是两者中较大的值。
  • 两个相邻的外边距都是 负数 时,折叠外边距是两者中绝对值较大的值。
  • 两个相邻的外边距是 一正一负 时,折叠外边距是两者相加的和。

2.2 折叠外边距产生的条件是margin必须相邻

3.避免外边距折叠

  这一听起来可能有些困惑,因为我们在前面讨论了 BFC 导致外边距折叠的问题。但我们必须记住的是外边距折叠(Margin collapsing)只会发生在属于同一BFC的块级元素之间。如果它们属于不同的 BFC,它们之间的外边距则不会折叠。所以通过创建一个不同的 BFC ,就可以避免外边距折叠。

修改前面的例子并添加第三个兄弟元素,CSS不变。

HTML:

  1. <div class="Container">
  2. <p>Sibling 1</p>
  3. <p>Sibling 2</p>
  4. <p>Sibling 3</p>
  5. </div>

结果不会改变,还会折叠外边距,三个兄弟元素(P)将会以垂直距离为 10px 的距离分开。原因是三个兄弟元素都属于同一个 BFC。

创建一个不同的 BFC ,就可以避免外边距折叠。

HTML:

  1. <div class="Container">
  2. <p>Sibling 1</p>
  3. <p>Sibling 2</p>
  4. <div class="newBFC">
  5. <p>Sibling 3</p>
  6. </div>
  7. </div>

CSS:

  1. .Container {
  2. background-color: red;
  3. overflow: hidden; /* creates a block formatting context */
  4. }
  5. p {
  6. background-color: lightgreen;
  7. margin: 10px 0;
  8. }
  9. .newBFC {
  10. overflow: hidden; /* creates new block formatting context */
  11. }

当第二和第三个兄弟元素属于不同的 BFC 时,它们之间就没有外边距折叠。

BFC(块级 格式化上下文)的理解的更多相关文章

  1. CSS2系列:BFC(块级格式化上下文)IFC(行级格式化上下文)

    BFC 块级格式化上下文,不好理解,我们暂且把她理解成"具有特殊的一类元素" 哪些元素会生成BFC? 根元素 float属性不为none position为absolute或fix ...

  2. BFC块级格式化上下文

    BFC块级格式化上下文 触发条件 overflow 值不为 visible 的块元素 根元素 html 元素 浮动元素(元素的 float 不是 none) 绝对定位元素(元素的 position 为 ...

  3. BFC——块级格式化上下文

    BFC(块级格式化上下文) 一.BFC是什么? 从样式上看,具有BFC的容器和普通的容器没有区别.从功能上看,具有BFC的容器可以看作是隔离了的容器,容器里面的元素不会影响到外面的元素,并且BFC具有 ...

  4. 我理解的BFC(块级格式化上下文)

    BFC(Block formatting context) 直译为"块级格式化上下文". BFC它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Bl ...

  5. BFC块级格式化上下文简述

    做过页面编写的各位应该对定位不陌生了,这个样式表中的重头戏,也是最难把控的元素之一,今天在这里我们要讲到的就是与浮动与清除浮动相关的定位元素,对于定位有很多种,有绝对定位,还有相对定位,固定定位,静态 ...

  6. BFC(块级格式化上下文)

    转载自:https://www.cnblogs.com/asheng2016/p/7281784.html https://blog.csdn.net/jiaojsun/article/details ...

  7. BFC(块级格式化上下文)笔记

    BFC特性: 1.BFC是一个独立的布局容器,内部元素不会影响BFC外面的元素,反之亦然. 2.计算BFC高度时,会计算内部的浮动元素. 3.BFC会阻止外边距的合并. 4.BFC的区域不会与外部浮动 ...

  8. css中margin重叠和一些相关概念(包含块containing block、块级格式化上下文BFC、不可替换元素 non-replaced element、匿名盒Anonymous boxes )

    平时在工作中,总是有一些元素之间的边距与设定的边距好像不一致的情况,一直没明白为什么,最近仔细研究了一下,发现里面有学问:垂直元素之间的margin有有互相重叠的情况:新建一个BFC后,会阻止元素与外 ...

  9. 详解块级格式化上下文(BFC)

    相信大家和我一样,第一次听到别人说CSS 块级格式化上下文(block formatting context,简称:BFC)的时候一头雾水,为了帮助大家弄清楚块级格式化上下文,我翻阅了W3C的CSS规 ...

  10. BFC --- Block Formatting Context --- 块级格式化上下文

    虽然知道块级格式化上下文是什么东西,但要我把这个东西给说清楚,还真的不是一件容易的事儿,所以这篇文章我就要说说清楚到底什么使传说中的BFC,即块级格式化上下文. 一.BFC的通俗理解 通俗的理解 -- ...

随机推荐

  1. UML统一建模语UML2和EnterpriseArchitect

    其实前面的UML统一建模语言(一)所描述的都是UML1的内容,现在咱们聊一聊UML2. UML2.x完全建立在UML1.x基础之上,大多数的UML1.x模型在UML2.x中都可用.但UML2.x在结构 ...

  2. wpf Datagrid 的全选

    在我的一个datagrid的一列中需要全选框,所以我在样式中是这样写的: <DataGridTemplateColumn.Header> <CheckBox> <i:In ...

  3. c# 鼠标点击控件即拖动窗体

    在编程中,有时打开的窗体没有边框,但是我们仍然想在鼠标放在窗体上就能拖动窗体,这样我们只需要以窗体中的一个控件为参考,我们在这里以panel为例子: public class PanelNew : P ...

  4. java之装箱拆箱

    参考http://how2j.cn/k/number-string/number-string-wrap/22.html 封装类 所有的基本类型,都有对应的类类型 比如int对应的类是Integer ...

  5. UVaLive 3530 Martian Mining (简单DP)

    题意:给定一个n*m的网格,每个格子里有A矿和B矿数量,A必须由右向左运,B只能从下向上运,中间不能间断,问最大总数量. 析:一个简单DP,dp[i][j] 表示 从 (0, 0) 到 (i, j) ...

  6. JS中map list 数组的迭代

    后台传给前台一个map 前台如何迭代呢 $.post("getSys.jhtml", function(data){ var temp = ""; $.each ...

  7. [51nod] 1007 正整数分组 dp

    将一堆正整数分为2组,要求2组的和相差最小. 例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的.   Input 第1行:一个数N,N为正整数的数量 ...

  8. TSubclassOf的一些说明

    注:补充下SpawnActor的用法 TSubclassOf<AActor> TS = LoadClass<AActor>(NULL, TEXT("Blueprint ...

  9. RenderTexture

    https://docs.unity3d.com/Manual/class-RenderTexture.html Size: 图片像素尺寸,这个size可以直接在脚本里通过width和height动态 ...

  10. 2014-10-5 NOIP模拟赛

    祖孙询问 (tree.pas/c/cpp) [问题描述] 已知一棵n个节点的有根树.有m个询问.每个询问给出了一对节点的编号x和y,询问x与y的祖孙关系. [输入格式] 输入第一行包括一个整数n表示节 ...