前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
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 固定长度轨道与自由空间计算
CSSGrid 布局

Grid 固定列和 fr 列怎样计算可用宽度?

轨道尺寸要以网格容器的内容盒为基准。固定长度先占空间,列间 gap 也要扣掉,剩下的空间再分给 fr;若内容的最小尺寸或百分比在不确定尺寸下介入,结果不能只靠一条减法公式。

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

从外框到轨道的计算

  1. 内容盒轨道可使用的容器内部宽度
  2. 固定尺寸如 200px 的轨道先确定
  3. 自由空间扣除固定轨道和沟槽后再给 fr

容器没有确定宽度时,百分比轨道和内容固有尺寸会进入更复杂的尺寸计算,别直接用视口宽度代入。

核心回答

先记住这个答案

看 Grid 的列宽,先确认容器内容盒到底有多宽,再看列模板。固定长度列先占确定的空间,相邻列的 gap 也要扣除,余量交给 fr 轨道。若列有内容的自动最小尺寸、百分比或 minmax() 限制,最终值还要满足这些约束。因此「容器宽减去固定列」只是起点,不能忽略沟槽与最小值。

  • 计算基准是容器内容盒
  • 固定长度和 gap 先占宽度
  • fr 分剩下的可用空间
  • 内容最小尺寸可能改变最终轨道宽度

用确定宽度手算两列

假设内容盒宽 720px,列模板为 180px 1fr,列间距 24px。右列可用 516px。如果容器还有 20px 左右内边距,而 CSS 的 width: 720px 按默认内容盒模型解释,那么内容盒仍是 720px,外框则更宽;若换为 box-sizing: border-box,内容盒要从 720px 中再扣内边距和边框。

侧栏固定,正文吃掉余量CSS
.shell {
  box-sizing: border-box;
  display: grid;
  width: 720px;
  padding: 0 20px;
  grid-template-columns: 180px minmax(0, 1fr);
  column-gap: 24px;
}
/* 无边框时内容盒 680px,右列为 476px */

先从 720px 扣左右各 20px 的内边距,得到内容盒 680px。再扣 180px 侧栏和 24px 沟槽,右列就是 476px。这里用 minmax(0, 1fr),避免右列的一段不换行文本把轨道的自动最小值撑大;文本仍应单独处理换行或滚动。

百分比和函数不能一概而论

50% 轨道通常相对容器内容盒的相应尺寸计算,但若容器的该轴尺寸本身依赖内容,百分比在固有尺寸计算阶段不能总当作一个已知长度。minmax(200px, 1fr) 表示轨道至少 200px,分到的自由空间不够时仍不能缩到该值以下。fit-content() 也带上限及内容约束,和固定长度不等价。

工程上先用浏览器的 Grid 高亮工具看内容盒、轨道与沟槽,再查某个项目的自动最小尺寸。若计算与预期差几十像素,优先检查 padding、border、box-sizing 与 gap,不要急着怀疑 fr 的比例规则。

计算轨道宽度时要从 Grid 容器的内容盒出发,不能直接拿视口宽度。一个外框 800px、左右各 20px 内边距的容器,内容盒只有 760px;若还设了 gap: 20px,固定列扣除后余量才分给 fr。百分比列参考哪个尺寸还会受到容器是否有确定内联尺寸影响。面试手算前先写出“容器内容宽”,否则数字看似精确却从起点错了。

回答前,多想一步

容易答错的地方

直接拿视口宽度算百分比列
百分比相对的是网格容器相关尺寸,不一定是视口。容器若在更窄的父元素里,结果随父元素变化。
忘了内边距与沟槽
轨道铺在内容盒内,gap 则位于轨道之间。用外框宽度直接分给列,会把宽度算大。
试着用自己的话回答

面试官还会怎么问?

两列都是 1fr 就一定平分吗?

在最小尺寸不阻碍时通常平分;某列不可断内容过宽时,自动最小值可能让它扩张。

minmax(200px, 1fr) 在容器很窄时会怎样?

该列不能小于 200px;若总最小宽度超过容器,布局可能产生横向溢出。

如何让右侧内容列保持可收缩?

用 minmax(0, 1fr) 明确允许轨道收缩,再对图片、代码或长文本设置相应的溢出处理。

从一道题,走向一组知识

把知识连起来

Grid 布局

grid-template 简写包括哪些属性,能写 subgrid 吗?

grid-template 简写可一次定义行列,但要看清列尺寸的实际计算基准。

Grid 布局

用 Grid 的命名区域怎样写圣杯布局?

圣杯布局的左右侧栏常用固定宽,主栏用 minmax(0, 1fr) 吸收剩余空间。

参考资料

  • CSS:Grid 布局参考资料

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

本题目录
  1. 先记住这个答案
  2. 用确定宽度手算两列
  3. 百分比和函数不能一概而论
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

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

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