先记住这个答案
可以。Grid 允许把页面上的项目放到指定网格线或命名区域,同一份 HTML 在宽屏和窄屏可以采用不同排布。例如桌面版文章旁边放侧栏,手机版改成文章后显示侧栏,不必为两种屏幕复制内容。但 Grid 只负责视觉位置,源代码中的内容、读屏与常规焦点顺序仍是原来的,所以 HTML 必须先有合理顺序。
grid-area可命名视觉区域- 断点可重排区域而复用 HTML
- 视觉顺序不等于 DOM 顺序
- 交互流程先保证源代码顺序
同一份结构适配两种布局
文章页通常希望主内容优先被读到,而桌面版又想在左侧显示导航。可以在 HTML 中先写文章再写导航,利用区域名称控制屏幕摆放。断点只换布局图,不必增加两套 DOM。
.page { display: grid; grid-template-areas: "main side"; grid-template-columns: minmax(0, 1fr) 240px; }
.article { grid-area: main; }
.sidebar { grid-area: side; }
@media (max-width: 700px) {
.page { grid-template-areas: "main" "side"; grid-template-columns: 1fr; }
}页面里仍只有一份文章和一份侧栏。媒体查询改变的是容器轨道与区域分配,不会重新挂载内容,也不会自动改变内容之间的语义关系。
grid-template-areas 的每一行代表一条网格行,同名区域必须形成矩形。复杂排布如果很难用区域图表达,也可改用明确的 grid-row 和 grid-column。
无障碍边界比截图重要
视觉设计容易把“看起来先出现”误当成“应该先读”。假如登录页把提交按钮放在字段前面,键盘用户仍会先遍历字段再到按钮;反过来若 DOM 中按钮先于字段,只靠 Grid 调回视觉位置,也会产生顺序冲突。
制定结构时先按不加载 CSS 的阅读顺序检查页面。文章标题、说明、表单字段、操作按钮如果按逻辑先后排列,Grid 才能安全地负责响应式重排。涉及重要顺序时,优先改 HTML,而不是用 order 或区域定位掩盖结构问题。
命名区域适合把“主栏、侧栏、页脚”画成布局图,却不该承担内容建模。比如文章里引用的提示框,若逻辑上属于某个段落,就应放在那段附近;把它在 DOM 中统一挪到文末,再靠 Grid 摆回段落旁,会让无样式阅读和复制文本时的关系断掉。先确定哪些内容在语义上相邻,再设计视觉区域,移动断点时也更容易保持一致。
容易答错的地方
- 以为 Grid 可以修正错误的语义结构
- Grid 不会把侧栏变成主内容,也不会改变标题层级。错误的 HTML 结构必须在标记层修正。
- 为每个断点复制一套内容
- 两份 DOM 会带来重复 ID、状态同步和辅助技术重复阅读等问题。通常应让一份内容随网格轨道变化。
面试官还会怎么问?
grid-template-areas 能跨断点改变布局吗?
能。对同一个容器在媒体查询里重新定义区域图,再调整轨道宽度即可;项目的 grid-area 名称可以保持。
视觉布局和 Tab 顺序不同怎么办?
先检查 DOM 顺序是否符合任务流程。如果不符合,调整 HTML;不要为了截图一致而强行依赖 CSS 重排交互顺序。
Grid 与绝对定位相比有什么优势?
网格项目仍参与布局,轨道能按内容和可用空间伸缩;绝对定位通常需要自己管理重叠与容器高度。
参考资料
示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。