使用纯CSS创建CSS网格布局

6

我试图使用CSS Grid创建像这张图片一样的布局(所有项目都是正方形):

CSS grid layout pattern

我尝试的代码:

CSS

  .grid-container {
    padding: 20px;
    display: grid;
    grid-gap: 20px;
    grid-auto-rows: 1fr;
    grid-template-columns: repeat(2, 1fr);
  }

  .item {
    position: relative;
    background: #ccc;
  }

  /* Square */
  .item:after {
    content: '';
    display: block;
    padding-top: 100%;
  }

  @media screen and (min-width: 640px) and (max-width: 1023px) {
    /* 640 ~ 1023 */
    .grid-container {
      grid-template-columns: repeat(3, 1fr);
    }

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

  @media print, screen and (min-width: 1024px) {
    /* 1024+ */
    .grid-container {
      grid-template-columns: repeat(4, 1fr);
    }

    .item:nth-child(10n + 1) {
      grid-column: span 2 / 3;
      grid-row: span 2;
    }
    .item:nth-child(10n) {
      grid-column: span 2 / 3;
      grid-row: span 2;
      grid-column-end: 5;
    }
    .item:nth-child(10n + 8) {
      grid-column-start: 1;
    }
  }

您可以在这里找到我的代码:JSFiddle 结果展示: CSS grid layout pattern 我认为可以使用带有JavaScript的position:absolute来计算网格的位置以解决问题。
如何使用纯CSS创建此布局?

请参考此链接:https://css-tricks.com/look-ma-no-media-queries-responsive-layouts-using-css-grid/ @Reginna - Pushprajsinh Chudasama
1个回答

8
你可以尝试像下面这样。你已经很接近成功了,只是缺少 grid-auto-flow:dense; 让项目填满所有空间。

.grid-container {
  padding: 20px;
  display: grid;
  grid-gap: 20px;
  grid-auto-rows: 1fr;
  grid-template-columns: repeat(2, 1fr);
  grid-auto-flow:dense;
  counter-reset: albumList;
}

.item {
  aspect-ratio: 1;
  background: #ccc;
  display: flex;
}

/* Number */
.item:before {
  counter-increment: albumList;
  content: counter(albumList);
  margin: auto;
  font-size: 40px;
  color: #000000;
}

@media screen and (min-width: 40em) and (max-width: 63.99875em) {
  /* 640 ~ 1023 */
  .grid-container {
    grid-template-columns: repeat(3, 1fr);
  }
  .item:nth-child(6n + 1),
  .item:nth-child(6n + 6){
    grid-area: span 2/span 2;
  }
  .item:nth-child(6n + 5) {
    grid-column: 1;
  }

}

@media print, screen and (min-width: 64em) {
  /* 1024+ */
  .grid-container {
    grid-template-columns: repeat(4, 1fr);
  }
  .item:nth-child(10n + 1),
  .item:nth-child(10n + 10){
    grid-area: span 2/span 2;
  }
  .item:nth-child(10n + 8) {
    grid-column: 1;
  }
  .item:nth-child(10n + 9) {
    grid-column: 2;
  }
}
<div class="grid-container">
  <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>


能否在640以上的区域显示最后一个项目以填补空白? - evavienna

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