You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CSS Grid创建非矩形布局失效,求问题原因

问题核心原因

CSS Grid 有两个关键限制导致你的代码失效:

  1. 单个网格项必须是矩形区域:你试图让元素a占据非矩形的L型单元格(第一行1-2列、第二行2列),这不符合Grid的规则,单个Grid子项只能占用连续的矩形单元格。
  2. grid-template-areas 要求命名区域为连续矩形:你的模板定义中,a区域被c区域隔开,属于无效的非矩形区域,浏览器会直接忽略这个错误的模板配置,导致布局完全不符合预期。
正确实现方案

如果要实现视觉上和目标布局一致的效果,可以采用以下两种方式:

方式1:拆分元素模拟L型

将原本的a拆分为两个元素,分别占据对应的矩形区域,设置相同样式来模拟整体效果:

.grid {
  display: grid;
  grid-template-areas:
    "a1 a2 b"
    "c a2 b"
    "c c d";
  gap: 5px;
  height: 300px;
}

.item {
  background-color: lightgray;
  border: 1px solid gray;
  text-align: center;
  display: flex;
  align-items: center;
  justify-content: center;
}

.item.a1 { grid-area: a1; }
.item.a2 { grid-area: a2; }
.item.b { grid-area: b; }
.item.c { grid-area: c; }
.item.d { grid-area: d; }

/* 让两个a元素看起来像一个整体 */
.item.a1, .item.a2 {
  border-color: gray;
}
.item.a1 {
  border-right: none;
  border-bottom: none;
}
.item.a2 {
  border-left: none;
  border-top: none;
}
<div class="grid">
  <div class="item a1">a</div>
  <div class="item a2">a</div>
  <div class="item b">b</div>
  <div class="item c">c</div>
  <div class="item d">d</div>
</div>

方式2:用行列定位+背景模拟

保持单个元素,通过调整元素位置,并用伪元素填补空缺的单元格,模拟L型视觉效果:

.grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: repeat(3, 1fr);
  gap: 5px;
  height: 300px;
  position: relative;
}

.item {
  background-color: lightgray;
  border: 1px solid gray;
  text-align: center;
  display: flex;
  align-items: center;
  justify-content: center;
}

.item.a {
  grid-column: 2 / 3;
  grid-row: 1 / 3;
  position: relative;
}
/* 伪元素填补第一行第一列的位置 */
.item.a::before {
  content: "a";
  position: absolute;
  left: calc(-100% - 5px); /* 向左移动一列+gap宽度 */
  top: 0;
  width: 100%;
  height: 50%;
  background-color: lightgray;
  border: 1px solid gray;
  display: flex;
  align-items: center;
  justify-content: center;
}

.item.b {
  grid-column: 3 / 4;
  grid-row: 1 / 3;
}

.item.c {
  grid-column: 1 / 2;
  grid-row: 2 / 4;
}

.item.d {
  grid-column: 2 / 4;
  grid-row: 3 / 4;
}
<div class="grid">
  <div class="item a">a</div>
  <div class="item b">b</div>
  <div class="item c">c</div>
  <div class="item d">d</div>
</div>
补充说明

如果你原本的布局理解有误(比如a其实是矩形区域),可以调整grid-template-areas为有效的矩形定义,比如将a设置为第一行1-2列、第二行1-2列的矩形,这样grid-template-areas就能正常工作,但这和你目标的L型布局不符。

内容的提问来源于stack exchange,提问作者Sarim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 13:53:13