用@media控制grid-template-columns实现两栏变单栏,桌面端设为1fr 300px或repeat(2,1fr),移动端在max-width:768px下改为1fr;需确保父容器有display:grid,避免grid-template-areas覆盖,并用grid-template-areas或grid-row调整顺序。
@media 控制 grid-template-columns 实现两栏变单栏直接改 grid-template-columns 的值就行,不需要额外 wrapper 或 JS。关键在断点选择和列定义方式。
grid-template-columns: 1fr 300px(主内容弹性 + 侧边固定宽)或 repeat(2, 1fr)(等宽两栏)@media (max-width: 768px) 把它改成 grid-template-columns: 1fr
min-width 反向写,容易和设计稿断点对不上;优先按「内容撑开」逻辑选断点,比如侧边栏开始叠不下的宽度grid-template-columns 在媒体查询里为什么有时不生效常见原因是父容器没设 display: grid,或者被其他 CSS 覆盖了。Grid 属性必须成对出现才能起作用。
display: grid,且该声明没被 !important 或更具体的选择器覆盖grid-template-rows 却忘了 columns,浏览器不会报错但也不生效grid-template-areas,它会覆盖 grid-template-columns,此时要同步更新 grid-template-areas 里的布局定义光改 grid-template-columns 只能控制列数,顺序还得靠 grid-row 或 grid-area 显式指定。
/* 桌面:两栏并排 */
.container {
display: grid;
grid-template-columns: 1fr 300px;
grid-template-areas: "main sidebar";
}
.main { grid-area: main; }
.sidebar { grid-area: sidebar; }
/ 移动端:单列,sidebar 放底部 /
@media (max-width: 768px) {
.container {
grid-template-columns: 1fr;
grid-template-areas:
"main"
"sidebar";
}
}
grid-template-areas 是最直观的方式,语义清晰、顺序可控.sidebar 加 grid-row: 2;,但前提是容器没定义 grid-template-areas,否则会被忽略order,它只影响视觉顺序,语义流和可访问性仍按 HTML 原顺序grid-gap?加在哪一层grid-gap(或 gap)建议写在容器上,而不是子项里。它只在网格容器生效,且会自动适配单列/双列结构。
.container 上即可:gap: 1rem,不用在媒体查询里重复写margin 更稳妥,避免和 gap 叠加出意外空白
gap,如果还要兼容,得用 grid-column-gap + grid-row-gap,但现代项目基本可忽略响应式 Grid 最容易卡住的地方不是语法,而是没想清楚「哪些区域必须保持语义顺序」「哪些可以靠 grid-area 重排」。先画个草图标好主次区域,再写 CSS,比反复调 fr 值快得多。