Glittering's blog Glittering's blog
Home
  • 学习手册

    • 《JavaScript教程》
    • 《ES6 教程》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • CSS
  • 技术文档
  • 算法
  • 工作总结
  • 实用技巧
  • collect
About
  • Classification
  • Label
GitHub (opens new window)

Glitz Ma

前端开发工程师
Home
  • 学习手册

    • 《JavaScript教程》
    • 《ES6 教程》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • CSS
  • 技术文档
  • 算法
  • 工作总结
  • 实用技巧
  • collect
About
  • Classification
  • Label
GitHub (opens new window)
  • CSS

    • CSS教程和技巧收藏
    • css块元素和行内元素
    • 盒子模型
    • BFC和IFC
      • 一、什么是 BFC?
      • 二、触发 BFC 的条件(非常重要 ⚡)
      • 三、BFC 的布局特性(记住这四条)
      • 四、BFC 的典型应用场景
        • ✅ 场景1:清除浮动(解决父容器高度塌陷)
        • ✅ 场景2:避免 margin 重叠
        • ✅ 场景3:防止浮动元素覆盖文本
      • 五、可视化理解:BFC 像“独立的小世界”
      • 六、常见面试题总结
      • 七、结构化总结(思维导图结构)
      • 一、什么是 IFC?
        • 💬 简单理解:
      • 二、哪些元素会生成 IFC?
      • 三、IFC 的布局规则
      • 四、可视化理解 IFC(行盒结构)
      • 五、IFC 常见属性表现
        • 🔸 vertical-align
        • 🔸 line-height
      • 六、IFC 的常见应用场景
        • 示例:行内文字与图标垂直对齐
      • 七、IFC 与 BFC 的对比总结
      • 八、面试常见问题
      • 🧭 九、思维导图结构总结
    • 字体font-weight相关知识
    • CSS-function汇总
    • CSS3之has函数的使用
    • CSS3之transition过渡
    • CSS3之animation动画
    • css动画性能优化
    • flex布局语法
    • flex布局案例
    • Grid布局语法
    • flex布局和grid布局的区别
    • 「布局技巧」图片未加载前自动撑开元素高度
    • 文字在一行或多行时超出显示省略号
    • 水平垂直居中的几种方式-案例
    • 如何根据系统主题自动响应CSS深色模式
    • 工作中遇到的css问题记录
    • 今天总结一下用到的css吧
  • 页面
  • CSS
mamingjuan
2015-06-13
目录

BFC和IFC

BFC(Block Formatting Context,块级格式化上下文)是 CSS 布局中一个非常重要的概念。 理解它可以帮助你解决很多经典问题:如浮动塌陷、外边距重叠、清除浮动、内部自适应布局等。

我们来系统讲清楚它👇


# 一、什么是 BFC?

BFC(Block Formatting Context)是一个独立的渲染区域,内部的元素布局不会影响外部元素。

简单来说: 元素在 BFC 中,会“自成一体”,它的布局规则独立于外部世界。


# 二、触发 BFC 的条件(非常重要 ⚡)

下列任意条件成立,元素就会创建一个 BFC:

触发条件 示例
根元素(<html>) 默认存在
float 值不是 none float: left; / float: right;
position 值为 absolute 或 fixed position: absolute;
display 值为 inline-block、table-cell、table-caption、flex、grid 等 display: flex;
overflow 值不是 visible overflow: hidden; / auto; / scroll;

✅ 常见触发方式:

.container {
  overflow: hidden; /* 最常用 */
}
1
2
3

# 三、BFC 的布局特性(记住这四条)

特性 说明
① 内部盒子垂直排列 像普通文档流一样按从上到下排列
② BFC 区域不会与浮动元素重叠 会自动环绕浮动元素的外边界
③ 计算高度时包含浮动元素 能“包裹”浮动的子元素(用于清除浮动)
④ 外边距(margin)不会与外部元素重叠 解决 margin 合并问题

# 四、BFC 的典型应用场景

# ✅ 场景1:清除浮动(解决父容器高度塌陷)

<div class="parent">
  <div class="child">浮动子元素</div>
</div>
1
2
3
.parent {
  /* 触发 BFC,使父元素包含浮动子元素 */
  overflow: hidden;
}
.child {
  float: left;
  width: 100px;
  height: 100px;
  background: #42b983;
}
1
2
3
4
5
6
7
8
9
10

📌 原理: 父元素形成 BFC 后,会把浮动的子元素计算进自身高度。


# ✅ 场景2:避免 margin 重叠

<div class="box1"></div>
<div class="box2"></div>
1
2
.box1 {
  margin-bottom: 20px;
  background: #eee;
}
.box2 {
  margin-top: 20px;
  background: #ccc;
}
1
2
3
4
5
6
7
8

👉 这两个 margin 会重叠为 20px。 解决方式:

.wrapper {
  overflow: hidden; /* 触发 BFC */
}
1
2
3

📌 原理: 不同 BFC 之间的外边距不会重叠。


# ✅ 场景3:防止浮动元素覆盖文本

<div class="float-box"></div>
<p>这段文字可能会被浮动元素覆盖</p>
1
2
.float-box {
  float: left;
  width: 100px;
  height: 100px;
  background: skyblue;
}
p {
  overflow: hidden; /* 触发 BFC,使文字环绕浮动元素 */
}
1
2
3
4
5
6
7
8
9

# 五、可视化理解:BFC 像“独立的小世界”

┌───────────────────────────────┐
│ 外层 BFC(document)         │
│   ┌───────────────────────┐  │
│   │ 内层 BFC(overflow) │  │ ← 内外互不干扰
│   └───────────────────────┘  │
└───────────────────────────────┘
1
2
3
4
5
6
  • 内部的浮动、margin 等规则只在当前 BFC 生效;
  • 外部不会受影响。

# 六、常见面试题总结

Q1:BFC 是什么?有什么作用? A:BFC 是一个独立的布局环境,内部的布局不会影响外部。 常用于:

  • 清除浮动;
  • 防止 margin 重叠;
  • 阻止文字环绕浮动;
  • 创建独立布局区域。

Q2:如何触发 BFC?

  • overflow 非 visible;
  • float;
  • position: absolute / fixed;
  • display: inline-block / flex / grid 等。

Q3:BFC 与 IFC(行内格式化上下文)的区别?

  • BFC 作用于块级盒子,垂直布局;
  • IFC 作用于行内内容,水平排列(如文字与行内元素)。

# 七、结构化总结(思维导图结构)

BFC(块级格式化上下文)
 ├── 定义:独立布局环境
 ├── 触发条件
 │   ├── float ≠ none
 │   ├── position = absolute/fixed
 │   ├── overflow ≠ visible
 │   ├── display = inline-block / flex / grid
 ├── 特性
 │   ├── 内部盒子垂直排列
 │   ├── 不与浮动重叠
 │   ├── 包含浮动子元素
 │   └── 阻止外边距重叠
 └── 应用场景
     ├── 清除浮动(高度塌陷)
     ├── 阻止 margin 重叠
     ├── 防止文字被浮动覆盖
     └── 创建独立布局区域
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

在理解完 BFC(块级格式化上下文) 之后,接下来学习 IFC(Inline Formatting Context,行内格式化上下文) 是非常自然的一步。 两者相辅相成,是 CSS 布局体系的基础核心。


# 一、什么是 IFC?

IFC(行内格式化上下文) 是由行内级元素(inline-level elements)参与的 布局上下文。 在 IFC 中,元素会像文字一样,在水平方向上一个接一个排列。


# 💬 简单理解:

BFC 管“块与块”之间的垂直排列, IFC 管“字与字”、“行内元素”之间的水平排列。


# 二、哪些元素会生成 IFC?

只要元素内部 没有块级元素,而是全部由行内级内容组成,那么它就会创建 IFC。

典型触发场景:

<p>
  <span>这是</span>
  <em>行内</em>
  <strong>上下文</strong>
</p>
1
2
3
4
5

这里的 <p> 元素内部都是行内元素 → 因此它创建了一个 IFC。


# 三、IFC 的布局规则

在一个行内格式化上下文(IFC)中:

规则 说明
① 行内盒(inline box)从左到右依次排列 超出容器宽度时会自动换行
② 行高(line box)由 line-height 决定 控制行距与文字垂直对齐
③ 每一行形成一个“行盒”(line box) 多行文本就有多个 line box
④ 元素的垂直对齐由 vertical-align 控制 基线、顶部、底部等对齐方式
⑤ 行内元素之间的空格也会被渲染 HTML 中的空格会显示为间距

# 四、可视化理解 IFC(行盒结构)

+------------------------------------------------+
| line box ①  → [inline box][inline box][inline] |
+------------------------------------------------+
| line box ②  → [inline box][inline box]         |
+------------------------------------------------+
1
2
3
4
5
  • 每一行文字对应一个 line box;
  • 每个行内元素(文字、<span>、<img> 等)在其中占据自己的 inline box;
  • line box 的高度取决于行内元素的最大高度和 line-height。

# 五、IFC 常见属性表现

# 🔸 vertical-align

用于控制 行内盒之间的垂直对齐方式。

img {
  vertical-align: middle;
}
1
2
3

取值包括:

  • baseline(默认,基线对齐)
  • top、bottom
  • middle
  • text-top、text-bottom

📌 用于让文字与图片在同一行时更好对齐。


# 🔸 line-height

控制行高(line box 的高度),常用于垂直居中行内元素。

.button {
  line-height: 40px;  /* 使文字垂直居中 */
  height: 40px;
}
1
2
3
4

# 六、IFC 的常见应用场景

应用场景 示例
✅ 文本与图片的垂直对齐 图文混排、icon 对齐
✅ 单行文字垂直居中 用 line-height 实现
✅ 多行文字换行控制 white-space / word-break
✅ 行内按钮、标签并排显示 行内元素自适应排布

# 示例:行内文字与图标垂直对齐

<span class="icon-text">
  <img src="icon.png" alt="">
  图标文字
</span>
1
2
3
4
.icon-text img {
  vertical-align: middle;
  width: 16px;
  height: 16px;
}
1
2
3
4
5

📌 图片与文字会垂直居中在同一行。


# 七、IFC 与 BFC 的对比总结

对比项 BFC(块级格式化上下文) IFC(行内格式化上下文)
作用对象 块级元素 行内元素
布局方向 垂直方向(自上而下) 水平方向(从左到右)
是否换行 块级独占一行 行内可自动换行
典型触发 div, p, section span, a, em, img
高度计算 包含子元素和浮动 由最大行高决定
常见问题 margin 合并、浮动塌陷 baseline、vertical-align 对齐问题

# 八、面试常见问题

Q1:什么是 IFC? IFC 是行内格式化上下文,行内元素(inline-level box)在其中按水平方向排列,每一行形成一个 line box。


Q2:IFC 与 BFC 的区别?

  • BFC:块级元素的垂直布局;
  • IFC:行内元素的水平布局;
  • 两者独立存在,但可以嵌套。

Q3:如何让行内内容垂直居中?

  • 单行文字可用 line-height;
  • 图文混排可用 vertical-align: middle。

# 🧭 九、思维导图结构总结

IFC(行内格式化上下文)
 ├── 定义:行内元素的水平布局环境
 ├── 触发条件:容器内全是行内级内容
 ├── 布局规则
 │   ├── 从左到右排列
 │   ├── 溢出自动换行
 │   ├── 行高由 line-height 决定
 │   ├── vertical-align 控制垂直对齐
 ├── 常见属性
 │   ├── line-height
 │   ├── vertical-align
 │   ├── white-space
 │   └── word-break
 ├── 应用场景
 │   ├── 文本垂直居中
 │   ├── 图文对齐
 │   ├── 行内按钮布局
 │   └── 多行换行控制
 └── 与 BFC 对比
     ├── 水平 vs 垂直
     ├── 行内 vs 块级
     ├── line-box vs box model
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

上次更新: 2025/11/25, 03:24:47
盒子模型
字体font-weight相关知识

← 盒子模型 字体font-weight相关知识→

Copyright © 2015-2025 Glitz Ma
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式