HandyTools Hub

CSS Grid 生成器

以可视化方式设计 CSS Grid 布局并复制 CSS 代码

单元格按阅读顺序编号;拖动滑块时间距会实时更新。

启用命名区域后,列/行滑块将被预设的区域布局替代。

 

CSS Grid 是现代 CSS 里的二维布局系统:你一次性描述行和列,再让浏览器把元素放进这个结构。这个生成器提供轨道和间距滑块、实时预览、三套命名区域预设,以及可以直接复制进样式表的干净 CSS。它瞄准的是网格布局里最常用的那 80%——等宽列、均匀间距和一个简单的区域示意图——让你几秒钟就能起一个布局,而不必手敲模板字符串。

使用方法

  1. 拖动列数和行数滑块(各 1–12),或在旁边输入框里键入数字。每次改动预览都会重绘。
  2. 分别设置 column-gap 和 row-gap,范围 0 到 48 像素。它们是两个独立属性,所以你可以用紧凑的列间距配宽松的行间距。
  3. 可选地勾选命名区域并选择预设——圣杯布局、侧边栏或卡片。滑块会锁定到预设的尺寸。
  4. 复制 .container 代码块。如果启用了命名区域,还要一并复制生成器追加的 .区域名 规则。

实操示例

示例 A —— 四列两行的卡片网格。 列数 4、行数 2、列间距 16、行间距 12,生成:

.container {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: repeat(2, 1fr);
  column-gap: 16px;
  row-gap: 12px;
}

示例 B —— 圣杯布局预设。 勾选命名区域并选择圣杯布局后,轨道数量切换为 3 × 3,并追加一张示意图:

grid-template-areas:
  "header header header"
  "nav main aside"
  "footer footer footer";

随后生成器会为每个区域输出一条规则,例如 .header { grid-area: header; }。任何带上该类的直接子元素都会被自动放置,main 横跨中间那一个单元格,而 header 和 footer 跨越全部三列。

读懂生成的 CSS

三条声明承载了大部分含义。display: grid 把元素变成网格容器。grid-template-columns 和 grid-template-rows 定义轨道;repeat(n, 1fr) 表示 n 份等分的剩余空间。fr 单位并不是简单意义上的“容器的 n 分之一”——间距会先被扣掉,剩下的才拿来均分。对一个 1200px 宽、三列、列间距 16px 的容器,间距占掉 32px,每条 1fr 解析为 (1200 − 32) ÷ 3 ≈ 389.3px。grid-template-areas 是一张可视化地图:重复出现的名字会把单元格合并成一个区域,句点则让单元格留空。

轨道 vs 命名区域:该如何选择

情况更合适的选择原因
整齐的卡片画廊,数量未知普通轨道只需决定轨道数量,加媒体查询后元素会自然换行
带 header/sidebar/footer 的页面骨架命名区域示意图本身就是布局文档,重排后依然可读
一个特性块横跨两列两行命名区域重复名字可合并单元格,单靠等分 1fr 轨道很难表达
需要混合固定宽度和弹性宽度先用轨道,再手改生成器只输出 1fr;逐条替换轨道即可

常见错误

  • 以为间距会自动压缩轨道。 会的,但前提是网格元素可以收缩。卡片上的 min-width 可能把某条轨道撑得比 1fr 还宽,在 10–12 列时造成横向溢出;这时应换成 minmax(0, 1fr)。
  • 给孙级元素加样式。 网格放置只作用于直接子元素。容器和卡片之间多包一层 <div> 会破坏预期布局。
  • 改了示意图里的区域名却忘了改类名。 .header 规则和 "header header header" 字符串必须完全一致;一个拼写错误会静默地让元素无法放置。
  • 忘了命名区域只改变视觉顺序、不移动 HTML。 视觉顺序和源码顺序会分离,这会影响键盘 Tab 顺序和屏幕阅读器——如果视觉顺序改变了含义,请检查无障碍表现。
  • 以为预览是响应式的。 演示网格是固定的;真正的响应式仍需 @media 规则或 auto-fit/minmax,这些生成器都不产出。

准确性与局限

输出使用的是标准且广泛支持的网格属性,并且会省略零间距,让 CSS 保持精简。你拿不到的东西包括:auto-fit、auto-fill、minmax()、subgrid、逐元素的 span 控制,以及自动生成的媒体查询。轨道数量永远是等分,间距上限 48px。请把结果当作一个正确、可读的起点,而不是一版完成的响应式布局。

你还需要补充的响应式行为

生成器输出的是固定轨道数量,不是容器查询。一个四列桌面网格在 375px 宽度下会把卡片挤得很难受,除非你自己加断点。常见做法是把生成的代码块当作桌面基准,在其下方逐级叠加更简单的网格:

@media (max-width: 900px) {
  .container { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 560px) {
  .container { grid-template-columns: 1fr; }
}

另一种不需要媒体查询的方案是 grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)),它会按容器宽度尽可能放下更多最小 220px 的列,其余自动换行。它对未知元素数量更有韧性,但本工具不会生成。由 CMS 驱动的卡片画廊优先用 auto-fit 写法;带命名区域的页面骨架则保留显式轨道,再加一个把所有区域堆成单列的断点。

相关工具

常见问题

为什么生成的 CSS 用 repeat(3, 1fr) 而不是直接写 1fr 1fr 1fr?

repeat() 是紧凑简写:repeat(3, 1fr) 展开就是 1fr 1fr 1fr,repeat(12, 1fr) 也能展开成十二份而不占一整行。对浏览器来说两者完全等价,但修改轨道数量时简写更好读,也一眼就能看出每条轨道相等。

启用命名区域后,为什么列和行滑块不能用了?

grid-template-areas 矩阵本身已经定义了网格形状。比如圣杯布局预设就是三列三行,所以生成器直接从预设推导轨道数量并禁用滑块,以免和示意图矛盾。关掉命名区域即可重新手动控制轨道。

能把固定像素列和 fr 单位混在一起输出吗?

通过滑块做不到。工具输出的每条轨道都是等分的 1fr。要搭出「240px 侧栏 + 弹性主列」这类布局,请复制生成的 CSS 再手动替换轨道,例如 grid-template-columns: 240px 1fr。生成器给的是骨架,比例靠手改。

生成器支持的最大网格和间距值是多少?

列和行各自范围是 1 到 12 条轨道,列间距和行间距范围都是 0 到 48 像素。输入超出范围的数字会被钳制到最接近的合法值。

为什么间距为 0 时不会出现在 CSS 里?

默认网格根本没有间距,写 column-gap: 0 只是噪音。生成器会省略任何为 0 的间距声明,只有把滑块拉过 0 才输出该属性,让复制出来的代码块保持精简。

grid-template-areas 里每一行都需要加引号吗?

需要。示意图的每一行都是一个独立的带引号字符串,每列一个单元格、用空格分隔,而且每一行的单元格数量必须相同。句点表示空单元格。这些字符串由生成器代写,你只需要保证同名的 .区域名 规则与之一致。

由 HandyTools Hub 团队审校 · 最后更新