🎛️CSS Grid 高阶玩法 10 连招:从“能跑”到“飞起”

93 阅读3分钟

2025 年了,只会 display: grid; grid-template-columns: repeat(3, 1fr)
本文带你解锁 10 个真正能让设计稿落地的 Grid 高级技巧,附可直接复制的代码片段,无图也能秒懂


1️⃣ 自适应瀑布流:一行搞定 Pinterest 布局

.wall {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  grid-auto-rows: 20px;          /* 最小行高 */
  gap: 16px;
}
.item:nth-child(3n)   { grid-row: span 6; }
.item:nth-child(5n+1) { grid-row: span 4; }

auto-fit + minmax 让列数随屏宽变化,span 控制卡片高度差异,零 JS 实现瀑布流。


2️⃣ 命名区域 + 区域重叠:做海报级排版

.poster {
  display: grid;
  grid-template-areas:
    "img  img  title"
    "img  img  desc"
    "meta meta desc";
  grid-template-columns: 1fr 1fr 200px;
}
.img   { grid-area: img;   z-index: 1; }
.title { grid-area: title; }
.desc  { grid-area: desc;  }

通过 grid-area 把元素“钉”进随意命名的网格区域,再用 z-index 做叠层,杂志风封面轻松搞定。


3️⃣ 稠密填充消灭空白

.gallery {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-auto-flow: dense;   /* 关键:回头填空 */
  gap: 8px;
}
.gallery > .big {
  grid-column: span 2;
  grid-row: span 2;
}

dense 算法会把小卡片塞进前面留下的空隙,不会出现“大坑”


4️⃣ 隐式网格自动补行

.table {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-auto-rows: minmax(40px, auto); /* 超出行数自动补 */
}

数据条数未知?让浏览器自动建隐式行,动态列表必备。


5️⃣ 网格线命名:告别 nth-child

.layout {
  display: grid;
  grid-template-columns: [sidebar-start] 200px [sidebar-end main-start] 1fr [main-end];
  grid-template-rows: [header-start] 60px [header-end content-start] 1fr [content-end];
}
aside  { grid-column: sidebar-start / sidebar-end; }
main   { grid-column: main-start / main-end; }

[name] 给网格线起外号,语义化又不怕 DOM 顺序变化。


6️⃣ CSS 变量 + Grid 做“一键换肤”

:root {
  --cols: 4;
  --gap: 16px;
}
.responsive {
  display: grid;
  grid-template-columns: repeat(var(--cols), 1fr);
  gap: var(--gap);
}
@media (max-width: 600px) {
  :root { --cols: 1; --gap: 8px; }
}

JS 只需 document.documentElement.style.setProperty('--cols', 6) 即可动态改列数


7️⃣ 区域重叠实现 卡片 Hover 放大

.card {
  grid-area: 1 / 1 / 2 / 2;
  transition: transform .3s;
}
.card:hover {
  grid-area: 1 / 1 / 3 / 3;   /* 瞬间占两行两列 */
  transform: scale(1.05);
}

grid-area 坐标放大,不脱离文档流,兄弟节点自动避让。


8️⃣ repeat(auto-fit, minmax()) 响应式圣杯

.holy-grail {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 1rem;
}

一行代码搞定 移动端单栏 / 桌面端三栏,媒体查询都不用写。


9️⃣ Grid + Flex 组合拳:二维 + 一维完美协作

.page {
  display: grid;
  grid-template-areas:
    "header header"
    "sidebar main"
    "footer footer";
}
.main {
  display: flex; /* 在 main 区域内再用 Flex 处理局部布局 */
  flex-wrap: wrap;
}

Grid 管整体骨架,Flex 管局部流式,互不抢戏


🔟 调试神器:浏览器可视化网格线

Chrome DevTools → Layout → 勾选 Grid
直接 拖拽网格线 调尺寸,所见即所得,设计稿秒同步。


🏁 3 秒速记口诀

  • 二维大框架 → Grid
  • 一维小排列 → Flex
  • 自动填充空隙dense
  • 响应式列数auto-fit + 变量
  • 调试靠拖拽 → DevTools Layout

把本文收藏夹置顶,下次再写 float:left 就罚自己抄 10 遍!