BFC到底是啥?

卐儿
• 阅读 2197

前言

在面试中,我们经常会遇到一个常见的面试题,什么是BFC?于是我就去查阅了相关资料:

css规范中是这样描述BFC的

  • 9.4.1 块格式化上下文
  • 浮动,绝对定位元素,非块盒的块容器(例如,inline-blocks,table-cells和table-captions)和'overflow'不为'visible'的块盒会为它们的内容建立一个新的块格式化上下文
  • 在一个块格式化上下文中,盒在竖直方向一个接一个地放置,从包含块的顶部开始。两个兄弟盒之间的竖直距离由'margin'属性决定。同一个块格式化上下文中的相邻块级盒之间的竖直margin会合并
  • 在一个块格式化上下文中,每个盒的left外边(left outer edge)挨着包含块的left边(对于从右向左的格式化,right边挨着)。即使存在浮动(尽管一个盒的行盒可能会因为浮动收缩),这也成立。除非该盒建立了一个新的块格式化上下文(这种情况下,该盒自身可能会因为浮动变窄)

mdn是这样描述的

  • 一个块格式化上下文(block formatting context) 是Web页面的可视化CSS渲染出的一部分。它是块级盒布局出现的区域,也是浮动层元素进行交互的区域。
  • 一个块格式化上下文由以下之一创建:

    1)根元素或其它包含它的元素
    2)浮动元素 (元素的 float 不是 none)
    3)绝对定位元素 (元素具有 position 为 absolute 或 fixed)
    4)内联块 (元素具有 display: inline-block)
    5)表格单元格 (元素具有 display: table-cell,HTML表格单元格默认属性)
    6)表格标题 (元素具有 display: table-caption, HTML表格标题默认属性)
    7)具有overflow 且值不是 visible 的块元素,
    8)display: flow-root
    9)column-span: all 应当总是会创建一个新的格式化上下文,即便具有 column-span: all 的元素并不被包裹在一个多列容器中。
  • 一个块格式化上下文包括创建它的元素内部所有内容,除了被包含于创建新的块级格式化上下文的后代元素内的元素。
  • 块格式化上下文对于定位 (参见 float) 与清除浮动 (参见 clear) 很重要。定位和清除浮动的样式规则只适用于处于同一块格式化上下文内的元素。浮动不会影响其它块格式化上下文中元素的布局,并且清除浮动只能清除同一块格式化上下文中在它前面的元素的浮动。

看到这的我表示理解无能,只好去找一下张鑫旭的文章看看:

  • BFC全称”Block Formatting Context”, 中文为“块级格式化上下文”。啪啦啪啦特性什么的,一言难尽,大家可以自行去查找,我这里不详述,免得乱了主次,总之,记住这么一句话:BFC元素特性表现原则就是,内部子元素再怎么翻江倒海,翻云覆雨都不会影响外部的元素。所以,避免margin穿透啊,清除浮动什么的也好理解了。

于是我又去查阅了相关资料,最终整理如下,如有纰漏欢迎指正。

BFC的作用

这个世界上有许多不能通过文字去定义的东西,如椅子,笔之类的,那我们是如何让别人知道我们在说什么呢?我们是通过描述它的主要功能来形容它的,例如椅子可以用来放东西可以用来坐,笔可以用来写等,BFC也是如此。既然我们不能通过文字准确描述它,那我们就通过其功能来概述一下,那它到底有什么用呢?

  1. 父元素管子元素
<body>
  <div class="parent">
    <div class="child"></div>
  </div>
</body>
<style>
.parent{
  border:1px solid red;
}
.child{
  background-color: #ccc;
  height: 100px;
  width: 100px;
  float:left;
}
</style>

BFC到底是啥?

显而易见,子元素浮动之后父元素是包不住子元素的,也就是管不住了,那为了能管住它,我们可以在以下代码任选其一增加:

 1)增加浮动
.parent{
 float:left;
}
 2)绝对定位元素
.parent{
 position:absolute;
}
 3)非块盒的块容器(如,inline-block,table-cell和table-caption 等)
.parent{
 display:inline-block;
//display:table-cell;
//display:table-caption;
}

以上几种做法效果如图:
BFC到底是啥?

 4)'overflow'不为'visible'的块盒
.parent{
 overflow:auto;
}
 5)display:flow-root(仅仅触发BFC,不给元素增加额外的功能)
.parent{
 display:flow-root;
}

效果如图:
BFC到底是啥?

就这样,我们在无形之中已经形成了BFC。

2.合并margin

<body>
  <div class="parent">
    <div class="child"></div>
    <div class="child"></div>
  </div>
</body>
<style>
.parent{
  border:1px solid red;
  display:inline-block;
}
.child{
  background-color: #ccc;
  height: 100px;
  width: 100px;
  margin: 10px;
}
</style>

按照我们的思路来看,两个child盒子之间的margin应该为20px,但是你会发现,由于触发了BFC,margin会被合并,如图:
BFC到底是啥?

⚠️特别注意的是,如果触发了BFC的父元素里包含了子元素和后代元素(也可以简单理解为孙子以及更往后的元素),而子元素刚好也触发了BFC,父元素是管不住后代元素的。

3.子元素之间互不影响

<body>
  <div class="child1">1234</div>
  <div class="child2">5678</div>
</body>
<style>
  .child1{
    border:3px solid red;
    min-height: 100px;
    width: 100px;
    float: left;
  }
  .child2{
    border:5px solid green;
    min-height: 100px;
  }
</style>

BFC到底是啥?
你会发现,child2的文字由于child1盒子所以没办法从最左端开始,这样两个盒子之间互相影响是我们不希望的,这时候只要我们触发BFC就能解决这个问题,如新增:

.child2{
   overflow:auto;
}

效果如图:
BFC到底是啥?


总结

说了这么久,BFC到底是什么?每个人的理解都不一样,但是我们也不必强求去用文字描述清楚,理解能用便可。

点赞
收藏
评论区
推荐文章
LinMeng LinMeng
4年前
小记面试题-2021
CSS类1.解释浮动及其工作原理浮动的元素可以向左或者向右移动,直到它的外边缘碰到包含元素(父元素)或另一个浮动元素的边框为止。要想使元素浮动,必须为元素设置一个宽度。虽然浮动的元素已不在文档流中,但是它浮动后所处的位置依然在浮动之前的水平方向上。因为浮动元素不在文档流中,所以文档流中的块元素表现的就像浮动元素不存在一样,下面的元素会填补原来的位置。有些
good123 good123
3年前
浅谈BFC格局~
1.BFC含义💳BFC全称:BlockFormattingContexts块级元素格式化上下文W3CCSS2.1规范中的一个概念,它是一个独立容器,决定了块级元素如何对它的内容进行布局,以及与其他元素的关系和相互关系一个页面是由很多个Box组成的,元素的类型和display属性,决定了这个Box的类型,不同类型的Box,会参与不
菜园前端 菜园前端
2年前
你真的了解的CSS3盒模型和CSS3特性知识吗
原文链接:什么是CSS3?CSS3是CSS一个新的标准,直接理解为是CSS的升级版,里面新增了很多样式(特性)。CSS3盒子模型:::warningCSS3盒子模型必须要掌握,否则你在实际开发中遇到样式错乱很难排查问题。:::旧版的IE浏览器与其它浏览器解
Wesley13 Wesley13
3年前
CSS定位规则之BFC
技术改变世界!学习改变人生!1. BFC(block formatting context,中文常译为块级格式化上下文)是W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用。 在进行盒子元素布局的时候,BFC提供了一个环境,在这个环境中按照一定规则进行布局不会影响到其它环境中的布局。比如浮动元素
Stella981 Stella981
3年前
Python+Selenium练习篇之5
前面介绍了,XPath,id,class,linktext,partiallinktext,tagname,name七大元素定位方法,本文介绍webdriver支持的最后一个方法:by\_css。css和XPath类似,也需要掌握一些语法,才能写出正确的,完整的css选择表达式。相关脚本代码如下:codingu
Stella981 Stella981
3年前
RobotFramework自动化测试之元素定位
前言:最近在做基于RF框架的Web自动化测试,其中涉及到元素的定位,主要用到id、name、xpath、css四中定位方法,尤其后面的两种方法特别有效,可以解决大部分的定位问题。
Wesley13 Wesley13
3年前
BFC清除浮动
BFC就是清除浮动用来处理文档脱离文档流的问题清除浮动的方法:a、父元素也添加一个浮动    产生弊端就是:margin不能使用b、给父元素添加一个:display:inlineblock     弊端同a一样:无法使用marginc、给父元素添加高     
Wesley13 Wesley13
3年前
CSS中清除浮动的作用以及如何清除浮动
1.什么是浮动,浮动的作用“浮动”从字面上来理解就是“悬浮移动、非固定”的意思。块级元素(div、table、span…)是以垂直方向排列,而在前端界面中往往要使用水平布局块级元素使界面更美观。这就要用到浮动了。被设置浮动的元素会脱离标准流(竖直排列),从而达到水平排列的效果。例如.未设置浮动时图1中的两张图片竖直排列在父级元素(橙色区域)
Stella981 Stella981
3年前
CSS的相对定位和绝对定位(position)
什么是定位呢?定位(position),故名思议,就是确定元素在页面中的位置。CSS的常用定位有两种,一种是相对定位,一种是绝对定位。下面我们看例子1.<html2.<head3.<style4.div0{5./设置背景色为黄色/6.backgrou
Stella981 Stella981
3年前
CSS 分类 (Classification)
★★CSS分类属性(Classification)★★⑴CSS分类属性允许你控制如何显示元素,设置图像显示于另一元素中的何处,相对于其正常位置来定位元素,使用绝对值来定位元素,以及元素的可见度。⑵下面是常用的属性以及描述:!(https://oscimg.oschina.net/oscnet/00cb565
卐儿
卐儿
Lv1
乡国真堪恋,光阴可合轻。
文章
4
粉丝
0
获赞
0