BFC

来源 https://www.thinktxt.com/web-front/2017/02/18/css-bfc-layout-model.html 

也许你已经掌握了HTML、CSS的基本布局技能,但是有可能还有一些难以琢磨透的专业名词还不是很清楚,比如BFC。今天我们就来聊聊对BFC的理解,以便我们在布局的过程中能够更加得心应手。

概念

BFC(Block Formatting Context),块级格式化上下文,一个创建了新的BFC的盒子是独立布局的,盒子里面的子元素的样式不会影响到外面的元素。

BFC是Web页面中盒模型布局的一种CSS渲染模式。它的定位体系属于 常规文档流

W3C规范定义:

浮动元素和绝对定位元素,非块级盒子的块级容器(例如 inline-blocks, table-cells, 和 table-captions),以及overflow值不为“visiable”的块级盒子,都会为他们的内容创建新的BFC(块级格式上下文)。

在BFC中,盒子从顶端开始垂直地一个接一个地排列,两个盒子之间的垂直的间隙是由他们的margin 值所决定的。在一个BFC中,两个相邻的块级盒子的垂直外边距会产生折叠。

在BFC中,每一个盒子的左外边缘(margin-left)会触碰到容器的左边缘(border-left)(对于从右到左的格式来说,则触碰到右边缘)。

行成要素

W3C中提到:

一些元素,如float,绝对定位元素,inline-blocktable-celltable-caption,和overflow的值不为visible的元素,(除了这个值已经被传到了视口的时候)将创建一个新的块级格式化上下文。

归纳形成BFC的几个要点:

  • float的值不为none;
  • position的值不为static或者relative;
  • display的值为 table-celltable-captioninline-blockflex, 或者 inline-flex中的其中一个;
  • overflow的值不为visible

详细可参考:MDN-块格式化上下文

创建一个BFC

创建一个新的BFC模式,只要满足上面所述要素中的任何一个条件即可,添加相关的CSS属性。

示例:

<div class="container"> Some Content here </div>

给容器.container 添加诸如:overflow: scrolloverflow: hiddendisplay: flexfloat: left,或者 display: table等任何一个属性,就可以形成一个新的BFC。尽管这些条件都能形成一个BFC,但是它们各自却有着不一样的表现:

  • display: table; —— 在响应式布局中会有问题
  • overflow: scroll; —— 可能会出现你不想要的滚动条
  • float: left; —— 使元素左浮动,并且其他元素对其环绕
  • overflow: hidden; —— 隐藏溢出部分

总的说来,建立BFC最好的方式也许就是overflow:hidden了,如下:

.container {
  overflow: hidden;
}

特点

  • 在同一个 BFC 中的两个毗邻的块级盒在垂直方向(和布局方向有关系)的 margin 会发生折叠。
  • 所有属于BFC中的Box都默认左对齐,并且它们的左边距可以触及到容器container的左边。最后一个Box,尽管它是浮动的,但它依然遵循这个原则。

用途

说了这么多规则与概念,那么我们运用BFC能做些什么呢?

消除外边距合并

根据BFC布局规则第二条:

Box垂直方向之间的距离由margin决定,属于同一个BFC的两个相邻Box的margin会发生重叠。

由此规则体现为:相邻的两个盒子(可能是兄弟关系也可能是祖先关系)的外边距可以结合成一个单独的外边距。这种合并外边距的方式被称为重叠,并且因而所结合成的外边距称为重叠外边距

产生折叠的必备条件:margin必须是邻接的!

折叠的结果

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

示例:

<style>
  .wrap {
    width:330px;
    background: #08c;
    overflow: hidden;
  }
  .item {
    width: 300px;
    height: 50px;
    margin: 15px;
    line-height: 50px;
    text-align: center;
    color: #fff;
    background: #6c0;
  }
</style>
<div class="wrap">
  <div class="item">aaa</div>
  <div class="item">bbb</div>
  <div class="item">ccc</div>
</div>

如图所示:

margin-collapse-01

item元素垂直方向之间的margin值合并了,原本应该是30px,目前只有15px。

解决方案

建立新的BFC元素包裹起来:

<div class="wrap">
  <div class="item">aaa</div>
  <div class="item">bbb</div>
  <div class="new-BFC">
    <div class="item">ccc</div>
  </div>
</div>

添加CSS属性:

.new-BFC {
  overflow: hidden;
}

这样被新BFC元素隔离出来的item就不受外部影响了,离第二个盒子之间的垂直margin距离达到30px,如图:

margin-collapse-02

但是个人觉得没必要这么做,其实一般情况下设置单方向的margin值就好了,比如给item都设置margin-top:30px;, 如果觉得第一个元素顶部边距太多可以单独添加.item:first-child {margin-top:15px;},如果大家还有更好的见解也可以提出来讨论。

容纳内部浮动元素

根据BFC布局规则第六条:

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

由BFC的独立区域特性体现,BFC内部的元素不会影响到外部元素。

示例:

<style>
  .content {
    width:360px;
    padding: 10px;
    background: #08c;
  }
  .child {
    float: left;
    width: 150px;
    height: 50px;
    margin: 0 15px;
    line-height: 50px;
    text-align: center;
    color: #fff;
    background: #6c0;
  }
</style>
<div class="content">
  <div class="child">child 01</div>
  <div class="child">child 02</div>
</div>

由于子元素浮动导致的父元素高度塌陷,如图:

float-01

解决方案

清除浮动的方法有很多,更多方法可参考:你必须懂得的CSS清除浮动方法,4种清除浮动方法

这里我们可以根据W3C的规则触发父元素content形成BFC,让内部的浮动元素也参与计算,给父元素添加:

.content {
    overflow: hidden;
}

如图,父级高度由子元素撑开了:

float-02

自适应两栏布局

BFC布局规则第三条与第四条:

  • 每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反),即使存在浮动也是如此。
  • BFC的区域不会与float box重叠。

了解以上规则后,我们可以利用BFC来实现自适应两栏布局。

示例代码:

<style>
  .wrap {
    width:300px;
    background: #08c;
  }
  .side {
    float: left;
    width: 120px;
    height: 200px;
    background: #6c0;
  }
  .main {
    height: 300px;
    background: #66c;
  }
</style>
<div class="wrap">
  <div class="side"></div>
  <div class="main"></div>
</div>

根据BFC规则第三条体现为:紫色的main元素以及绿色的 浮动 元素side都会紧贴 wrap的左边 border(由于浮动元素脱离文档流会盖在紫色盒子上面),如图:

column-layout-01

根据BFC布局规则第四条,我们可以采用给main添加overflow: hidden;来触发新的BFC,这样新的BFC元素不会与浮动的side重叠。

.main {
    overflow: hidden;
}

因此会根据父级元素的宽度以及side的宽度,自动变窄,形成侧栏固定,主体自适应宽度布局。如图所示:

column-layout-02

利用BFC阻止文本环绕

我们经常见到的“左图+右文本”的布局方式,根据以上原理我们也可以利用BFC来解决文字环绕的问题,让文字隔离图片并自适应排版。

如下结构:

<style>
  .content {
    width:300px;
    background: #08c;
  }
  .img {
    float: left;
    width: 100px;
    height: 80px;
    background: #fd0;
  }
  .info {
    background: #f66;
  }
</style>
<div class="content">
  <div class="img"></div>
  <p class="info">一些信息一些信息一些信息一些信息一些信息一些信息一些信息一些信息一些信息一些信息一些信息一些信息一些信息一些信息一些信息一些信息一些信息一些信息</p>
</div>

如图所示:

image-text-01

有时候我们不想要上面的展示,而是下面的效果:

image-text-02

那么根据上面所了解的知识,我们可以触发p元素的BFC来形成新的BFC独有区域,不与浮动的图片元素重叠,因此给.info添加能触发BFC模式的CSS属性属性即可,这里采用overflow:hidden;,你也可以试试别的能够触发BFC的属性:

.info {
  overflow: hidden;
  background: #f66;
}

总结

根据上面几个例子印证了BFC布局规则第五条:

BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。

因此我们可以利用这些特性来优化我们的margin、float元素、自适应布局等布局,希望今后在布局的过程中我们能够写出更加优雅的代码,深入地理解每一块布局结构原理

<think>好的,我需要回答用户关于BFC的问题。首先,用户想了解BFC的概念或含义,特别是在CSS或编程上下中。根据提供的引用,特别是引用[1]和[2],BFC是块级格式化上下,是CSS中的一个隐含属性。我需要先解释BFC的基本定义。 接下来,我应该说明BFC的作用和特点。根据引用[2],开启BFC的元素会变成一个独立的布局区域,具有防止浮动元素覆盖、避免外边距重叠、包含浮动子元素等特性。需要将这些特点分点列出,清晰易懂。 然后,要提到如何触发BFC。用户可能想知道如何实际应用,所以需要列举常用的方法,比如设置overflow: hidden、浮动元素、绝对定位等。这部分要结合引用中的内容,特别是引用[2]提到的overflow:hidden。 此外,用户可能关心BFC的应用场景,比如解决高度塌陷问题。引用[2]中详细说明了父元素高度塌陷的问题,以及使用BFC来包含浮动子元素。这部分需要具体举例,说明如何通过开启BFC来避免布局混乱。 还要注意引用来源的正确标注,在解释每个关键点时,末尾自然地添加引用标识,如[^1][^2]。同时,根据用户提供的示例,生成相关问题,可能需要包括BFC的触发方式、解决的问题、与层叠上下的关系等。 最后,确保回答结构清晰,分点说明,语言简洁,符合中表达习惯,并且避免使用任何Markdown格式。同时检查是否有遗漏的信息,比如BFC的其他特点或相关概念,如层叠上下(引用[3]),但用户主要关注BFC,所以可能不需要深入其他内容。</think>### BFC的概念与作用 BFC(Block Formatting Context,块级格式化上下)是 CSS 中的一个隐含属性,用于控制元素在页面中的布局规则。开启 BFC 的元素会形成一个独立的渲染区域,其内部布局与外部完全隔离,从而避免样式冲突或布局异常。 #### 核心特性 1. **避免浮动覆盖** 开启 BFC 的元素不会被相邻的浮动元素覆盖。例如,若左侧有浮动元素,BFC 容器会自动调整内容区域以避免重叠。 2. **防止外边距合并** 在普通流中,相邻块级元素的垂直外边距会合并(取最大值),但 BFC 内部的子元素与父元素的外边距不会合并[^2]。 3. **包含浮动子元素** 当父元素未设置高度且子元素浮动时,父元素可能因高度塌陷导致布局错乱。开启 BFC 后,父元素可以正确计算高度以包含浮动子元素。 #### 触发方式 通过为元素添加以下任一 CSS 属性即可开启 BFC: - `overflow: hidden`(最常用且无副作用) - `float: left/right`(元素会脱离档流) - `position: absolute/fixed` - `display: inline-block/flex/grid` #### 应用场景示例 ```html <div class="parent"> <div class="child" style="float: left;">浮动元素</div> </div> ``` 若未开启 BFC,父元素 `.parent` 高度会塌陷。通过添加 `overflow: hidden` 触发 BFC: ```css .parent { overflow: hidden; /* 包含浮动子元素 */ } ``` ### 相关问题 1. 如何通过 BFC 解决多个浮动元素导致的布局错乱? 2. BFC 与层叠上下(如 `z-index`)之间有何关联[^3]? 3. 为什么 `overflow: hidden` 是触发 BFC 的推荐方式? 4. BFC 在响应式布局中的典型应用场景有哪些? [^1]: BFC(Block Formatting Context)块级格式化环境,CSS隐含属性,形成独立布局区域。 : 浮动布局中BFC的作用:避免覆盖、防止外边距合并、包含浮动子元素。 : 层叠上下与z-index的关系,影响元素叠加顺序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值