带有模板列的动态 CSS 网格:自动和全角行

Dynamic CSS grid with template-columns: auto and full-width row

我正在尝试根据一些数据动态构建 CSS 网格。我正在尝试实现如下布局:

   | a | b | c | d
---+---+---+---+---
full width
---+---+---+---+--
 x | 1 | 2 | 3 | 4
---+---+---+---+--
 y | 2 | 3 | 4 | 5

我有一个动态的列数,以及一个横跨所有列的全宽行。

我正在生成的标记(在我的模板中循环)最终看起来像这样:

<div class="wrapper">
  <div class="box header">header 1</div>
  <div class="box header">header 2</div>
  <div class="box header">header 3</div>
  <div class="box header">header 4</div>
  <div class="box full-width">full width</div>
</div>

我试图通过用以下标记全角行来设置样式:

    .full-width {
        grid-column: 1 / -1;
        grid-row: 2;
    }

我的理解是 1 / -1 应该使行跨度从第一列到最后一列。在这种情况下,它不会,并且行的宽度不受影响。可以看到这个issue live on Codepen.

您的 header 规则将行设置为 1,这会限制您的网格布局。您至少需要 3 行才能让 header 有一个,full-width 元素有两个。

  1. 首先完全删除 header 规则。

  2. 然后将grid-template-rows添加到包装器中。

  3. 更改包装器以使用 repeat(),这会使水平跨度按预期工作:

.wrapper {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  background-color: #fff;
  color: #444;
}
  1. 为了使 full-width 跨越 2 行,总共至少需要 3 行。另外,您需要像这样声明您的 grid-row 跨度:
.wrapper {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  background-color: #fff;
  color: #444;
  grid-template-rows: repeat(3, minmax(0, 1fr));
}

.full-width {
  grid-column: 1 / -1;
  grid-row: span 2 / span 2;
}
  1. 如果你想要在网格的左上角有一个空节点,我们需要将列数增加到 5。我们还需要一个额外的 class 来推动第一个网格 child一栏向右(另一栏children会被推过去):
.wrapper {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(5, minmax(0, 1fr));
  background-color: #fff;
  color: #444;
  grid-template-rows: repeat(3, minmax(0, 1fr));
}

.wrapper:first-child {
  grid-column-start: 2;
}