前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库flex-grow 分配公式
CSSFlex 布局

flex-grow 是怎么按比例分配剩余空间的?

flex-grow 分配的是剩余空间,不是容器的总空间。先用容器主轴尺寸减去所有子项 flex-basis 之和,得到剩余空间。然后按各子项 flex-grow 值的比例来分。flex-grow: 2 的子项分到的额外空间是 flex-grow: 1 的两倍。

前端进阶之旅 · 一题精讲更新于 2026.09.29
CSS#Flex 布局#Flexbox
先看核心答案读代码示例
理解线索

`flex-grow` 分配公式

  1. 剩余空间容器主轴尺寸 - 所有子项 flex-basis 之和
  2. 分配比例每个子项分到:剩余空间 x (自己的 grow / 所有 grow 之和)
  3. 最终尺寸每个子项最终宽度 = flex-basis + 分到的剩余空间

flex-grow 只分配多出来的空间。如果 flex-basis 不同,flex-grow 值相同的子项最终宽度也不一样。

核心回答

先记住这个答案

flex-grow 分配的是容器主轴上的剩余空间。计算过程分两步:先算出剩余空间(容器宽度减去所有子项 flex-basis 之和),然后把这个剩余空间按照各子项 flex-grow 值的比例分配。每个子项的最终宽度等于它的 flex-basis 加上分到的那部分剩余空间。

  • 分配的是剩余空间不是总空间
  • 比例按 flex-grow 值算
  • 子项最终宽度 = basis + 分到的空间
  • 所有 grow 为 0 时空间不分配

用数字走一遍分配过程

假设容器宽 600px,三个子项的 flex-basis 都是 100px,flex-grow 分别是 1、2、1。

剩余空间 = 600 - (100 + 100 + 100) = 300px。

flex-grow 总和 = 1 + 2 + 1 = 4。

子项 A 分到:300 x 1/4 = 75px,最终宽度 = 100 + 75 = 175px。子项 B 分到:300 x 2/4 = 150px,最终宽度 = 100 + 150 = 250px。子项 C 和 A 一样,175px。

分配过程的代码CSS
.container {
  display: flex;
  width: 600px;
}
.item-a { flex: 1 0 100px; } /* 最终 175px */
.item-b { flex: 2 0 100px; } /* 最终 250px */
.item-c { flex: 1 0 100px; } /* 最终 175px */
/* 剩余空间 300px,按 1:2:1 分配 */

注意 flex-grow: 2 不是说子项 B 的宽度是 A 的两倍。B 分到的额外空间是 A 的两倍,但最终宽度还要加上各自的 flex-basis。

flex-basis 不同时的陷阱

如果各子项的 flex-basis 不同,即使 flex-grow 相同,最终宽度也不一样。因为 flex-grow 只管剩余空间的分配,不管基础尺寸。

比如子项 A 的 flex-basis: 200px,子项 B 的 flex-basis: 100px,两个都是 flex-grow: 1。容器 600px,剩余空间 300px,各分 150px。A 最终 350px,B 最终 250px。虽然 grow 一样,但 A 比 B 宽。

想让两个子项不论内容多少都平分空间,要用 flex: 1(即 flex: 1 1 0%),让 flex-basis 为 0。这样所有空间都变成剩余空间,按 flex-grow 平分。

回答前,多想一步

容易答错的地方

以为 flex-grow: 2 就是占总空间的 2 份
flex-grow 分配的是剩余空间,不是总空间。如果 flex-basis 不是 0,flex-grow: 2 的子项最终宽度不一定是 flex-grow: 1 的两倍。
以为 flex-grow: 1 就是平分容器
只有在所有子项 flex-grow 都是 1 且 flex-basis 都是 0(或相同)时,才是平分。如果 flex-basis 不同,最终宽度也不同。
试着用自己的话回答

面试官还会怎么问?

没有剩余空间时 flex-grow 有什么效果?

没有效果。如果子项的 flex-basis 总和已经等于或超过容器宽度,剩余空间为 0 或负数,flex-grow 不会增加任何宽度。超出的部分由 flex-shrink 处理。

flex-grow 的值可以是小数吗?

可以。flex-grow: 0.5 表示分到剩余空间的比例更小。比如两个子项分别是 0.5 和 1.5,总和 2,分别分到 25% 和 75% 的剩余空间。

flex-grow 会让子项超过 max-width 吗?

不会。max-width 是硬限制。如果 flex-grow 算出的宽度超过 max-width,子项停在 max-width,多出来的空间会重新分配给其他子项。

从一道题,走向一组知识

把知识连起来

Flex 布局

flex-grow 为 0 时子项还会增长吗?

增长因子为零的项目不会分享正向剩余空间,可与比例分配对照。

Flex 布局

flex-shrink 的收缩量是怎么算出来的?

负空间分配使用 flex-shrink,权重还与基准尺寸有关,不能套用增长公式。

参考资料

  • CSS:Flex 布局参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 用数字走一遍分配过程
  3. flex-basis 不同时的陷阱
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑