前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
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 subgrid需设置display grid原因
CSSGrid 布局

为什么只写 subgrid,却没设置 display: grid 时不会生效?

subgrid 不是单独开启网格布局的开关。元素先要成为 Grid 容器,再通过 grid-template-rows: subgrid 或列方向的对应属性继承父网格轨道。

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

先有网格容器,再谈子网格

  1. display: grid让元素的子节点参与网格布局
  2. grid-template-rows: subgrid让行轨道沿用父网格对应部分
  3. align-self调整网格项目在分配区域内的块轴对齐

仅有 display: grid 还不够;子网格必须是父网格的网格项目,并在继承轴上占据相应轨道范围。

核心回答

先记住这个答案

subgrid 是 grid-template-rows 或 grid-template-columns 的取值,不会把普通元素变成网格容器。要让卡片里的标题、正文、按钮沿父级行轨道排,卡片需要先是父 Grid 的项目,再设置 display: grid,并在对应轴写 grid-template-rows: subgrid。align-self 是项目在分配区域内怎样对齐,与是否创建子网格是两回事。

  • 子网格元素本身也是 Grid 容器
  • subgrid 只作用于指定轴
  • 子网格继承父级对应轨道
  • align-self 控制项目在区域内的对齐

卡片内部对齐的前提

一排商品卡的标题长短不同,按钮却要齐底。父级 Grid 可规划共同的行轨道;每张卡跨越这些行,并把内部行设置成子网格。这样各卡不再自己测量标题行高度。

卡片继承父级三条行轨道CSS
.list { display: grid; grid-template-columns: repeat(3, 1fr); grid-template-rows: auto 1fr auto; }
.card { display: grid; grid-row: span 3; grid-template-rows: subgrid; }
.card .button { align-self: end; }

.card 的 display: grid 决定内部子节点是否变成网格项目;grid-template-rows: subgrid 决定这三行使用父级轨道。按钮的 align-self: end 只改变按钮在所占区域里的位置,不负责继承轨道。 实际卡片布局还要确保卡片在父网格中跨越预期的行。若父容器没有共享的行轨道设计,仅写 subgrid 不会凭空制造跨卡片的对齐线。

行与列可以分别选择

有时只需要让标题、描述、按钮在纵向对齐,卡片内部横向布局仍想独立控制。这时只把行设为 subgrid,列继续由卡片自己的 grid-template-columns 定义。反过来,也可以只继承列。

检查元素样式时分两层看:它是不是 Grid 容器;它在父 Grid 中占哪几条轨道。第一层缺失时 grid-template-rows 不产生网格容器效果,第二层范围不对时即便子网格生效,内部项目也找不到期望的对齐位置。

回答前,多想一步

容易答错的地方

以为 subgrid 等同于 display: grid
subgrid 只指定轨道来源。没有 display: grid,子元素不会因为这个值自动成为网格项目。
把 align-self: stretch 当成共享轨道
拉伸改变的是单个项目在网格区域内的尺寸。跨卡片共享标题行高度需要公共轨道或子网格,不能只靠项目自身拉伸。
试着用自己的话回答

面试官还会怎么问?

可以只在列方向使用子网格吗?

可以。写 grid-template-columns: subgrid,行方向仍可定义独立轨道;两个轴并不必须一起继承。

子网格能重新设置父级轨道宽度吗?

它使用父级在所占范围内的轨道,不能像独立 Grid 那样重新定义那组轨道尺寸。内部内容可能参与轨道尺寸计算,但轨道属于父级布局。

卡片不是父 Grid 的直接项目能用吗?

子网格继承的是其父网格对应的轨道。若中间多了一层普通包装元素,先检查实际的网格项目是谁,以及要在哪一层建立子网格。

从一道题,走向一组知识

把知识连起来

Grid 布局

subgrid 和普通嵌套 Grid 在轨道对齐上差在哪?

子网格沿用父轨道,对齐能力与独立的嵌套 Grid 不同。

Grid 布局

子网格里的项目怎么对准父网格的轨道?

子网格内部项目相对自身继承到的网格线定位。

参考资料

  • CSS:Grid 布局参考资料

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

本题目录
  1. 先记住这个答案
  2. 卡片内部对齐的前提
  3. 行与列可以分别选择
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

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

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