OctoBlog 以 GitHub 为蓝本的个人博客系统
全部文章

CSS Grid 实用指南:我在真实项目里用到的 8 个模式

一、固定侧栏 + 自适应内容区

这是本博客最核心的一行布局:

CSS
.layout {
  display: grid;
  grid-template-columns: 296px minmax(0, 1fr);
  gap: 32px;
  align-items: start;
}

minmax(0, 1fr) 里的那个 0 很关键。如果写成 1fr,当内容里有一个很宽的 <pre> 时,列会被撑破;写 minmax(0, 1fr) 才允许列缩小到内容宽度以下,配合 overflow: auto 就得到正确的滚动行为。

二、卡片自动填充

不需要媒体查询:

CSS
.card-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  gap: 16px;
}

auto-fill 与 auto-fit 的区别只在一件事上:只有一两个元素时,auto-fit 会把它们拉宽铺满整行,auto-fill 会保留空轨道。列表页用 auto-fill,营销页用 auto-fit。

三、贡献热力图

GitHub 那张绿格子图,用 Grid 只要三行:

CSS
.graph {
  display: grid;
  grid-auto-flow: column;
  grid-template-rows: repeat(7, 11px);
  grid-auto-columns: 11px;
  gap: 3px;
}

grid-auto-flow: column 让元素先往下排 7 个,再换列,正好对应「一周 7 天、一列一周」。

四、给单元格命名行列

月份标签要比格子宽,可以用显式的列区间:

HTML
<span class="g-month" style="grid-column: 12 / span 3">4月</span>

五、表格与代码块的横向滚动

CSS
.post-layout { grid-template-columns: minmax(0, 1fr) 220px; }
.table-wrap { overflow-x: auto; }

六、对齐:align-items: start

Grid 默认 stretch,会让侧栏被拉到和正文一样高。想要「贴顶」就要显式声明:

CSS
.layout { align-items: start; }

七、先给小屏再给大屏

我的习惯是移动端优先,桌面端用 min-width 覆盖:

断点 目标
默认 单列,鼠标友好间距缩小
720px 顶栏折叠为汉堡菜单
1080px 文章页显示右侧目录
900px 侧栏变成顶部卡片

八、一个真实踩坑:gap 与 margin 混用

如果你同时用 gap 和子元素的 margin-bottom,间距会不可控地叠加。统一用 gap,把子元素的 margin 归零——这是我重构时删掉的最多的一类 CSS。

结论:Grid 真正的价值不是「能排布局」,而是「让间距只在一个地方定义」。