我有一支技术全面、经验丰富的小型团队,专注高效交付中等规模外包项目,有需要外包项目的可以联系我
混到前端生涯第五年,我成功养成了一个“职业病”:只要是布局问题,Flexbox 必有用武之地。
页面歪了?上 Flex。 按钮挤了?上 Flex。 导航炸了?再上 Flex。
至于 CSS Grid?在我眼里就像健身房角落那台看起来很专业、但没人敢碰的器械—— 你知道它很强,可总感觉一不小心就会闪了老腰。
直到有一天,我刷到 Stephanie Eckles 分享的三个 Grid 用法。 那一刻,脑子里像是有人把电闸合上了。
对于一个被各种布局 hack、怪癖和 “why-is-this-div-like-that” 折磨了十几年的前端来说, 这三招 Grid,直接把我从“Grid 恐惧者”变成了“Grid 信徒”。
这不是一篇“你必须学习 Grid” 的说教帖。 只是我被这三个技巧征服的过程,顺带,留下一些你现在就能打开 DevTools 试的例子。
一、切换 Grid 的“流向轴”:那天起,X 轴终于不再跟我作对
有一次迭代,我要排一组横向排列的项目:
每个 item 宽度不固定;
我要用 gap 控制间距;
我希望整体排列“干净利落”,而不是各种挤压、缩放乱飞。
于是我如往常一样,端出我万能的锤子:Flexbox。 结果这次 Flex 特别有脾气——
有的元素被莫名其妙挤小;
有的又撑到离谱;
调来调去,还是哪哪不顺眼。
那次我才第一次真正认真看了一眼 Grid。 然后试了这么写:
.container {
display: grid;
grid-auto-flow: column;
gap: 1rem;
}
神奇的事发生了:
元素不再跟我抢宽度;
间距完全按 gap 来;
横向对齐整整齐齐,没有任何 Flex shrink / grow 的“内斗”。
Grid 在背后偷偷做了什么?
默认情况下,Grid 是按行(row)的方向往下排的—— 像文章内容一样,一行接一行。
但当你把它改成:
grid-auto-flow: column;
你其实是在对浏览器说:
“老大,从现在起, 东西帮我往横着排。”
Grid 立刻变成一条“横向传送带”, 所有子元素乖乖按 X 轴排队。
一个真实场景:导航栏不再搞脾气
比如你有一个导航栏,每个菜单的文字长度都不一样:DashboardRM CostParameter LibraryOperations
CSS:
.nav {
display: grid;
grid-auto-flow: column;
gap: 1rem;
}
效果就是:
所有导航项水平一字排开;
间距统一,结构清爽;
不用跟 Flex 的 flex-basis、flex-grow 打心理战。
但 Grid 也有“小脾气”:它不会像 Flex 那样自动换行
Grid 和 Flex 最大的区别之一是:
Flex 在横向空间不够时,可以自动换行(flex-wrap), Grid 在 grid-auto-flow: column 这个模式下, 会一不小心“横着排到宇宙尽头”。
也就是说,小屏设备上,很可能会出现横向溢出。
我的做法是: 只在较大视窗上才启用这个模式:
.nav {
display: grid;
gap: 1rem;
}
@media (min-width: 720px) {
.nav {
grid-auto-flow: column;
}
}
这样:
小屏时按默认纵向/普通布局来;
宽度足够时,启用“横向传送带”模式。
那一刻开始,我第一次觉得:
“Grid 不是难,而是我以前没在对的地方用它。”
布局开始变得有一种:我在控制,而不是被它牵着走的感觉。
二、XY 居中:Grid 把“如何居中一个 div”变成了一行笑话
前端的经典梗之一:
“请问,怎么把一个 div 居中?”
从 margin: 0 auto; 到各种 position + transform 再到 Flex 的align-items + justify-content, 我们为了一个垂直+水平居中,绕了半个前端发展史。
然后 Grid 出场,轻描淡写写了两行:
.center-me {
display: grid;
place-content: center;
}
就这。
任何东西——
一段文字;
一个图标;
一个登录框;
甚至你对这个项目最后的希望——
丢进这个容器里,直接 X、Y 轴完美居中。
一个真实场景:空状态页面
比如你在做一个“暂无数据”的空页面:
No Data Yet
Add your first item to get started.
CSS:
.empty {
display: grid;
place-content: center;
height: 100vh;
}
效果:
整块内容稳稳地躺在视窗正中心;
不用写一堆 align-items、justify-content;
不需要任何“小数点位移”或奇怪的负 margin。
一行语句,连你的强迫症一起被安抚了。
这里也有一个小细节
place-content: center 的魔力, 在于容器本身要有“空间”。
如果容器的高度刚好和内容一样高, 你可能只会感觉到“左右居中”;
当你给它一个明确高度(例如全屏的 100vh)时, 垂直方向的居中才会真正“亮出来”。
但不管怎样, 相比以前那些居中“仪式”,这已经是:
Grid 在对你温柔地说: “别急,我帮你摆好。”
三、“自带脑子”的自适应列:这招之后,我对 Flex 的爱立刻减少一半
真正把我推入 Grid 阵营的,是这一招:
不用写任何 media query,就能完成“聪明”的响应式网格布局。
先看代码:
:root {
–grid-col-breakpoint: 15rem;
}
.grid {
display: grid;
gap: 1rem;
grid-template-columns: repeat(
auto-fit,
minmax(var(–grid-col-breakpoint), 1fr)
);
}
配上 HTML:
Item 1
Item 2
Item 3
Item 4
你只需要这么一点点,下拉浏览器宽度,就会看到:
一开始四个卡片在一行里;
当容器宽度不足以容纳那么多时, 他们会自动“掉到下一行”;
所有列始终保持等宽;
最重要的是:你完全没写一行 media query。
这段 Grid 背后在干什么?
关键在这一句:
grid-template-columns: repeat(
auto-fit,
minmax(var(–grid-col-breakpoint), 1fr)
);
逐条拆开:
repeat(auto-fit, …): “请在一行里塞满能塞下的列数,塞不下就自动换行。”
minmax(最小值, 最大值): “单个列的宽度至少是 –grid-col-breakpoint(比如 15rem), 最多可以弹性拉到占满一整行(1fr)。”
于是就有了这种行为:
容器够宽 → 多列并排,宽度均分;
容器变窄 → 当列宽即将低于 15rem 时, Grid 说:“别挤了,下一行见。”
每一行上的列,永远是一样宽的。
你只要改一行变量:
–grid-col-breakpoint: 18rem;
/* 或者 12rem、20rem,随你爽 */
整个布局就会按新的“最小列宽”重新“自我调节”。
这不是普通响应式, 这是那种看起来真的有点“自带脑子”的布局。
这个技巧为什么让我“脱粉” Flex?
Flex 做网格,常常要:
配合 flex-basis;
加一堆百分比宽度;
搭配 media query 在不同断点下改列数。
而这个 Grid 写法:
不关心屏幕尺寸,只关心容器当前的宽度;
你不用算“这个 breakpoint 下多少列”这种东西;
完全让 Grid 自己判断“现在能塞几列是舒服的”。
它的行为,更像一个内建的“容器查询”:
我不再盯着 viewport, 我只看自己这块区域的宽度, 合适就多排一列,不合适就往下挪。
所以:
Dashboard 布局;
产品卡片列表;
画廊;
后台参数表格;
SaaS 控制台的各种 card…
这些过去让我纠结半天列数的地方, 现在基本一套模板就搞定。
你第一次用它的时候,会有一种很强烈的感觉:
“原来不是我不会做响应式, 是我之前用错了工具。”
结语:Grid 不是来抢 Flex 饭碗的,而是来帮你少掉几根白头发的
Flex 真的是好东西—— 在一维方向上排东西(横或竖),它永远是那把顺手的扳手。
但 Grid,更像是你一直缺少的那套“布局架构系统”。
这三招:
切换 Grid 的流向轴: 横向对齐不再跟 Flex 的参数打拉锯战;
place-content: center 的“一键双向居中”: 把一个写了十几年梗的“div 居中难题”,变成真正的一行代码;
auto-fit + minmax 的内生响应式列布局: 帮你把大量媒体查询和 Hardcode 列数的历史债务,一刀砍掉。
它们不是“看起来很酷的新语法”, 而是你每天会用、每周会省下时间的小聪明。
Grid 不会取代 Flex, 它只是让你的布局从:
“能用就行的东拼西凑”,
升级成:
“真正干净、可预期、好维护的框架”。
在这个每天都在做仪表盘、SaaS 后台、卡片列表、数据视图的时代, 你迟早会发现:
愿意学会和 Grid 好好相处, 其实已经是前端工程师的一种“竞争优势”。
当你亲手写出第一套“该横就横、该竖就竖、自适应又不乱”的 Grid 布局时, 你大概率也会像我一样, 在心里默默承认一句:
CSS Grid,不只是一个布局工具。
它更像是一种转念—— 从“跟浏览器对着干”, 变成“和浏览器一起搭积木”。
全栈AI·探索:涵盖动效、React Hooks、Vue 技巧、LLM 应用、Python 脚本等专栏,案例驱动实战学习,点击二维码了解更多详情。
声明:来自JavaScript 每日一练,仅代表创作者观点。链接:https://eyangzhen.com/4208.html