前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
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 网格区域实现重叠布局
CSSGrid 布局

怎样用 Grid 把两个项目叠在同一个区域?

让多个网格项目引用同一个命名区域,或给它们相同的行列边界线,它们就会重叠。Grid 负责把它们放在同一块区域;谁盖住谁还要看绘制顺序和 z-index,点击是否被遮挡也要单独检查。

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

重叠布局的三个判断

  1. 共同区域多个项目占相同网格边界
  2. 层叠顺序决定可见项目位于上方
  3. 交互命中覆盖层可能挡住按钮点击

装饰遮罩若覆盖交互控件,应检查 pointer-events 与焦点顺序。

核心回答

先记住这个答案

Grid 允许多个项目占同一块区域。给图片、遮罩和标题都写 grid-area: hero,它们会共享区域边界,从而叠在一起;也能分别给它们相同的 grid-row 与 grid-column。重叠只解决几何位置,视觉上下顺序要看层叠规则,交互是否被覆盖层截获还要单独确认。

  • 相同 grid-area 可形成重叠
  • 相同行列线也能形成重叠
  • 网格项目可用 z-index 控制层级
  • 视觉叠放不改变 DOM 顺序

同一区域叠图片与文字

做横幅时,图片铺满卡片,标题靠左下,按钮靠右下。传统做法可能用绝对定位;Grid 可以让这几个元素都成为普通网格项目,引用同一命名区域。项目在区域内部再用 align-self 与 justify-self 调整位置,仍保留各自的语义节点。

三个项目共享 hero 区域CSS
.hero {
  display: grid;
  grid-template-areas: "hero";
}
.hero img, .hero .shade, .hero h2 { grid-area: hero; }
.hero img { width: 100%; height: 100%; object-fit: cover; }
.hero .shade { background: linear-gradient(transparent, #0008); pointer-events: none; }
.hero h2 { align-self: end; z-index: 1; }

遮罩不需要抢点击事件,因此设置 pointer-events: none。标题用 z-index 明确放在图片上方。若还有可点击按钮,检查它是否也在需要的层级、是否能按 DOM 顺序获得焦点。不要把视觉叠层当成文档层级的改写。

相同线坐标也能实现

命名区域不是必须条件。只要两个项目都写 grid-row: 1 / 2 与 grid-column: 1 / 2,它们就进入同一个网格单元。需要部分重叠时,可让一个项目跨两列,另一个只占第二列。这样能做悬浮标签或图片角标,但区域的轨道尺寸仍由项目内容和模板共同决定。

重叠项目可能增加轨道的最小尺寸贡献。比如标题不换行且很长,就可能把 hero 轨道撑宽;可以给轨道设可收缩下限,并对文字作换行处理。重叠布局不会自动裁剪超出的内容,也不会自动设置透明度。

重叠时还要分清“谁画在上面”和“谁接收事件”。图片、遮罩和标题同占 hero 区域,后面的项目在相同层级下通常画在前面的上方;项目使用 z-index 后又按层叠规则排序。若遮罩是装饰层,给它 pointer-events: none 可以避免挡住按钮,但标题和按钮仍要保证文字对比度、焦点可见。开发工具的网格覆盖层只显示布局重叠,不会替你检查点击命中和键盘导航。

回答前,多想一步

容易答错的地方

认为后一个项目会被自动放到下一格
相同区域属于显式定位,两个项目可以共处。自动放置规则不会替你避开指定的重叠。
以为 z-index 可以修复点击顺序
它主要解决绘制层级。覆盖层仍可能截获指针,键盘焦点仍按 DOM 顺序走,交互要另查。
试着用自己的话回答

面试官还会怎么问?

Grid 项目不写 position 也能用 z-index 吗?

可以,网格项目的层叠顺序可由 z-index 控制,不必为了它先写 position: relative。

两个项目共用区域会合并成一个 DOM 元素吗?

不会。它们仍是独立节点,只是在布局中共享网格区域。

为什么遮罩挡住了按钮?

遮罩处于按钮上方且接收指针事件;应调整层级或让纯装饰遮罩不接收指针。

从一道题,走向一组知识

把知识连起来

Grid 布局

grid-auto-flow 的 row、column 和 dense 分别怎么排项目?

自动放置一般寻找空格,显式重叠项目的位置需要用区域或线写清楚。

Grid 布局

minmax(0, 1fr) 与 minmax(auto, 1fr) 差在哪?

minmax(0, 1fr) 控制重叠区域的轨道尺寸,不能替代层叠顺序。

参考资料

  • MDN:Basic concepts of grid layout

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

本题目录
  1. 先记住这个答案
  2. 同一区域叠图片与文字
  3. 相同线坐标也能实现
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

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

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