前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
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 热点
旧版
首页程序员面试题库CSS Grid fr单位分配剩余空间
CSSGrid 布局

Grid 的 fr 单位是怎样分配剩余宽度的?

fr 表示弹性轨道分到的一份空间。Grid 先确定固定尺寸、内容最低要求和 gap,再把可分配的空间按 fr 系数分给弹性轨道;1fr 并不保证能压过内容的最小尺寸。

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

分配宽度时的三个量

  1. 固定轨道明确写出的长度先占空间
  2. gap只算轨道之间的间距
  3. 弹性轨道剩余空间按 fr 的份数分配

1fr 轨道通常带自动最小尺寸;长 URL 或不换行内容会让它比直觉中的份额更宽。

核心回答

先记住这个答案

fr 是弹性轨道的份额,不是容器宽度的百分比。Grid 会先算确定的轨道宽度与列间距,再按比例分配尚可使用的宽度。比如容器内容盒宽 600px,第一列 200px,两列之间的 gap 为 20px,第二列写 1fr,它通常分到 380px。若第二列有不能断开的长内容,自动最小尺寸还可能让它变宽。

  • fr 分的是可用空间,不是容器总宽
  • 固定轨道和 gap 会先占用宽度
  • 1fr 默认可能被长内容撑大
  • 需要强制收缩时用 minmax(0, 1fr)

固定列和弹性列一起算

后台页面常见的布局是一列固定侧栏加一列正文。要算正文宽度,先看容器的内容盒,再扣侧栏和间距。边框和内边距是否算在给定的 600px 中,取决于容器的 box-sizing;不要把外框宽度直接拿来计算。

固定侧栏,正文占剩余空间CSS
.layout {
  display: grid;
  width: 600px;
  grid-template-columns: 200px 1fr;
  column-gap: 20px;
}
/* 内容盒宽 600px 时,第二列通常是 380px */

改成 grid-template-columns: 200px 1fr 2fr 时,先扣固定列和两道间距,余下 360px 被分成三份:后两列分别得 120px 与 240px。两段 fr 之比是 1:2,不能把固定列一起带进这个比例。

长内容为什么会改变结果

实际页面里,一列写了 1fr 却发生横向滚动,常见原因是这一列放了长 URL、代码块或设了 white-space: nowrap 的文字。1fr 可视为带自动最小值的弹性轨道;内容的最小宽度可能阻止它继续缩小。此时不是 fr 计算失灵,而是轨道先要满足最小尺寸。

如果布局要求正文严格留在可用宽度里,可以把列改为 minmax(0, 1fr),允许轨道突破自动最小值。接着还要处理内容自身:长文本用 overflow-wrap: anywhere,图片用 max-width: 100%,代码区可设横向滚动。轨道能变窄并不等于内容会自动裁剪或换行。

假设容器内容宽 900px,左栏固定 200px,沟槽 20px,右栏写 1fr,在无额外最小尺寸约束时右栏拿约 680px。若再加入第二条 1fr 轨道,两条弹性轨道分同一份余量,而不是各自再从 900px 里取一次。长图片可能抬高某条轨道的下限,导致实际结果偏离这个简化算式;此时要连同 minmax() 与内容溢出检查。

回答前,多想一步

容易答错的地方

把 1fr 当作百分之百
fr 的基数是分配给弹性轨道的空间。固定列、内边距和 gap 已经占去一部分,1fr 不等于容器总宽的 100%。
认为 1fr 1fr 一定视觉等宽
当某列的自动最小尺寸超过均分份额,实际轨道可能被内容撑开。要实现等宽且可收缩的卡片列,通常写成 repeat(2, minmax(0, 1fr)),同时检查内容溢出。
试着用自己的话回答

面试官还会怎么问?

2fr 一定是 1fr 的两倍宽吗?

只有在相同约束下分配可用空间时才能这样说。若某列有较大的最小尺寸,算法须先满足约束,最后轨道宽度未必严格是 1:2。

gap 会产生首尾留白吗?

不会。它只位于相邻轨道之间;首尾空间由容器内边距或轨道整体对齐决定。

minmax(0, 1fr) 能直接修好文字溢出吗?

它解决的是轨道不肯缩小的问题。内容仍可能越过格子,需要另外设置换行、滚动或裁剪策略。

从一道题,走向一组知识

把知识连起来

Grid 布局

Grid 的 gap 是加在轨道之间,还是项目之间?

gap 也参与可用空间的计算,忘扣它会把每列宽度算错。

Grid 布局

grid-area 的四个位置参数分别指定什么?

grid-area 决定项目占哪些格子,跨列项目也可能影响轨道的最小尺寸。

参考资料

  • CSS:Grid 布局参考资料

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

本题目录
  1. 先记住这个答案
  2. 固定列和弹性列一起算
  3. 长内容为什么会改变结果
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

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

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