如何重复一个CSS网格布局模式?

5
我将尝试制作一个网格布局,其中有2个垂直的和2个水平的部分重复出现。然后是2个水平的,2个垂直的,我们再次重复。

就像这样:

.container {
  max-width:940px;
  margin: 0 auto;
}

.grid-container {
  counter-reset: div;
  display:grid;
  grid-template-columns: repeat(4, 1fr);
  grid-auto-rows: 186px;
  grid-gap:20px;
  justify-content:center;
    grid-template-areas: 
    "vert1 vert2 hor1 hor1"
    "vert1 vert2 hor2 hor2"
    "hor3 hor3 vert3 vert4"
    "hor4 hor4 vert3 vert4"
}

.item-a {
    grid-area: vert1;
}
.item-b {
  grid-area: vert2;
}
.item-c {
  grid-area: hor1;
}
.item-d {
  grid-area: hor2;
}
.item-e {
  grid-area: hor3;
}
.item-f {
  grid-area: hor4;
}
.item-g {
  grid-area: vert3;
}
.item-h {
  grid-area: vert4;
}
.item-j {
  grid-area: hor2;
}
.item-k {
  grid-area: hor2;
}
.item-l {
  grid-area: hor2;
}
.item-m {
  grid-area: hor2;
}


.grid-container > div {    
box-shadow: 0 0 11px 0 #b9b9b9;
}

.grid-container > div:before {
  counter-increment: div;
  content: counter(div);
  margin: auto;
  font-size: 40px;
  display:flex;
}
<div class="container">
<div class="grid-container">
<div class="item-a"></div>
<div class="item-b"></div>
<div class="item-c"></div>
<div class="item-d"></div>
<div class="item-e"></div>
<div class="item-f"></div>
<div class="item-g"></div>
<div class="item-h"></div>
 <div></div>
<div></div>
<div></div>
<div></div>
</div>
</div>

我找不到一种方式来使它出现在自动(无限)行中,只能通过grid-template-areas实现。

grid-template-areas: 
    "vert1 vert2 hor1 hor1"
    "vert1 vert2 hor2 hor2"
    "hor3 hor3 vert3 vert4"
    "hor4 hor4 vert3 vert4"

有人有任何想法吗?

(关于 IT 技术)

你考虑过容器的嵌套吗? - Temani Afif
哦,那确实可以行得通,就像获取2个嵌套的垂直和水平网格,然后使用CSS的n-th odd/even。 - Alex
1个回答

7
您可以考虑像下面这样重复使用许多网格容器:

.container {
  max-width: 940px;
  margin: 0 auto;
  counter-reset: div;
}

.grid-container {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-auto-rows: 100px;
  grid-gap: 20px;
  margin-bottom:20px;
}
.grid-container:nth-child(2n+1) {
  grid-template-areas: 
  "v1 v2 h1 h1" 
  "v1 v2 h2 h2"
}
.grid-container:nth-child(2n) {
  grid-template-areas: 
  "v1 v1 h1 h2 " 
  "v2 v2 h1 h2 "
}

.item-a {
  grid-area: v1;
}

.item-b {
  grid-area: v2;
}

.item-c {
  grid-area: h1;
}

.item-d {
  grid-area: h2;
}

.grid-container>div {
  box-shadow: 0 0 11px 0 #b9b9b9;
}

.grid-container>div:before {
  counter-increment: div;
  content: counter(div);
  font-size: 40px;
}
<div class="container">
  <div class="grid-container">
    <div class="item-a"></div>
    <div class="item-b"></div>
    <div class="item-c"></div>
    <div class="item-d"></div>
  </div>
  <div class="grid-container">
    <div class="item-a"></div>
    <div class="item-b"></div>
    <div class="item-c"></div>
    <div class="item-d"></div>
  </div>
  <div class="grid-container">
    <div class="item-a"></div>
    <div class="item-b"></div>
    <div class="item-c"></div>
    <div class="item-d"></div>
  </div>
  <div class="grid-container">
    <div class="item-a"></div>
    <div class="item-b"></div>
    <div class="item-c"></div>
    <div class="item-d"></div>
  </div>
  <div class="grid-container">
    <div class="item-a"></div>
    <div class="item-b"></div>
    <div class="item-c"></div>
    <div class="item-d"></div>
  </div>

</div>

如果你只需要一个网格,可以考虑有一个每8个元素重复一次的模式,并像下面这样使用nth-child()

.grid-container {
  max-width: 940px;
  margin: 0 auto;
  counter-reset: div;
  
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-auto-rows: 100px;
  grid-auto-flow: dense;
  grid-gap: 20px;
}

.grid-container> :nth-child(8n + 1),
.grid-container> :nth-child(8n + 2),
.grid-container> :nth-child(8n + 7),
.grid-container> :nth-child(8n + 8) {
  grid-row: span 2;
}

.grid-container> :nth-child(8n + 3),
.grid-container> :nth-child(8n + 4),
.grid-container> :nth-child(8n + 5) {
  grid-column: span 2;
}

.grid-container> :nth-child(8n + 6) {
  grid-column: 1/span 2;
}


.grid-container>div {
  box-shadow: 0 0 11px 0 #b9b9b9;
}
.grid-container>div:before {
  counter-increment: div;
  content: counter(div);
  font-size: 40px;
}
<div class="grid-container">
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
</div>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接