【问题标题】:CSS Grid - repeatable grid-template-areasCSS Grid - 可重复的网格模板区域
【发布时间】:2018-04-12 21:25:01
【问题描述】:

假设我们有一个包含 7 个项目的新闻条目列表。

我用 CSS Grid 创建了一个模式,它应该在 6 个项目后重复。

@supports (display: grid)
{
  .list
  {
    display: grid;
    grid-gap: 25px;
    grid-template-columns: repeat(4, 1fr);
    grid-template-rows: auto;
    grid-template-areas:
    "bigLeft bigLeft right1 right2"
    "bigLeft bigLeft bigRight bigRight"
    "left1 left2     bigRight bigRight";
  }

  .item:nth-of-type(6n+1)
  {
    grid-area: bigLeft;
  }
  .item:nth-of-type(6n+2)
  {
    grid-area: right1;
  }
  .item:nth-of-type(6n+3)
  {
    grid-area: right2;
  }
  .item:nth-of-type(6n+4)
  {
    grid-area: left1;
  }
  .item:nth-of-type(6n+5)
  {
    grid-area: left2;
  }
  .item:nth-of-type(6n+6)
  {
    grid-area: bigRight;
  }
}

想要的grid-template-areas 模式:

现在我希望这种模式重复并重复添加到列表中的更多项目。 但是HERE 你可以看到,一旦添加了第 7 项,模式就不会继续而是被替换。

我也尝试过使用未命名的区域

.item:nth-of-type(6n+1) {
  grid-column: 1 / 3;
  grid-row: 1 / 3;
}
.item:nth-of-type(6n+2) {
  grid-column: 3 / 4;
  grid-row: 1 / 2;
}
.item:nth-of-type(6n+3) {
  grid-column: 4 / 5;
  grid-row: 1 / 2;
}
.item:nth-of-type(6n+4) {
  grid-column: 1 / 2;
  grid-row: 3 / 4;
}
.item:nth-of-type(6n+5) {
  grid-column: 2 / 3;
  grid-row: 3 / 4;
}
.item:nth-of-type(6n+6) {
  grid-column: 3 / 5;
  grid-row: 2 / 4;
}

但结果相同...

我在规范中找不到任何解决方案来完成“可重复的网格模板区域”

你们中有人有想法吗?

【问题讨论】:

  • 我不相信你可以用纯 CSS 重复 grid-template-areas 模式。您需要使用脚本来更改规则,以便为 #6 之后的项目创建新的网格区域名称和空间。
  • 您是否考虑过重复网格本身而不是重复网格项的模式?换句话说,第 7 项将开始一个新的 6 项网格。
  • 这是我的意思的草稿:codepen.io/anon/pen/qVdpxy?editors=1100
  • @Michael_B 感谢您的回答。在我看来,这两种可能性都不是很干净,我认为 css 网格应该能够覆盖类似的东西,也许只是没有人想出它,我在规范中没有读过类似的东西,甚至在 CSS 网格级别中也没有2.

标签: css css-grid


【解决方案1】:

grid-templates-areas 覆盖 grid-template-rows-columns。您必须选择一种或另一种方式来描述您的网格布局。

对于重复模式,您可以使用:nth-child(n) 并重置跨越值:(https://codepen.io/gc-nomade/pen/qVdpwL)或下面的 sn-p

.grid {
  width: 1000px;
  margin: 0 auto;
  display: grid;
  grid-gap: 25px;
  grid-template-columns: repeat(4, 1fr);
  grid-auto-rows: 200px;
  padding: 10px;
  counter-reset:div
}
.item:nth-child(6n + 4),
.item:nth-child(6n + 1) {
  grid-column: auto /span 2;
  grid-row: auto /span 2;
}
.item {
  border: solid;
  display:flex;
}
.item:before {
  counter-increment:div;
  content:counter(div);
  margin:auto;
  font-size:40px;
}
<div class="grid">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
</div>

如果您的元素随机出现但需要放置在网格中的特定位置(第 6 个应该在第 4 个位置并跨越),那么您需要为每个元素设置一个 order 值:( .... 你'如果内容和顺序可能不同,则需要在 javascript 上进行中继

【讨论】:

  • 太棒了,谢谢。我没有想出只是重置跨越值的想法
  • grid-templates-areas 不会覆盖grid-template-x,因为您可以使用两者来定义空间在定义区域中的分布方式:gridTemplateColumns: "3fr 1.1fr 1.8fr"
  • @SysDragon 除非 grid-template-areas 和 grid-template-columns 没有定义相同数量的列。如果它不连贯,最后一条规则应该覆盖前一条,如果没有,你将很难将元素设置到正确的区域/列中......此外,为了避免编码器或浏览器的混淆,你越少写,最清楚的是;)但随时更新/改进我链接到规范的答案。我会感激的。我从来没有发现它在任何地方都写得很清楚
猜你喜欢
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
  • 2021-12-28
  • 2020-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
相关资源
最近更新 更多