JSFiddle - React, Tailwind, and code Playground

by FiNGAHOLiC

HTML

<div class="items">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
  <div class="item">4</div>
  <div class="item">5</div>
  <div class="item">6</div>
  <div class="item">7</div>
  <div class="item">8</div>
  <div class="item">9</div>
  <div class="item">10</div>
  <div class="item">11</div>
  <div class="item">12</div>
  <div class="item">13</div>
  <div class="item">14</div>
  <div class="item">15</div>
  <div class="item">16</div>
  <div class="item">17</div>
  <div class="item">18</div>
  <div class="item">19</div>
  <div class="item">20</div>
  <div class="item">21</div>
  <div class="item">22</div>
  <div class="item">23</div>
  <div class="item">24</div>
  <div class="item">25</div>
  <div class="item">26</div>
  <div class="item">27</div>
</div>

SCSS

$container-width: 100vw;
$breakpoint-mobile: 600px;

$col-count: 4;

$gap-width: 5px;
$gap-count: $col-count - 1;
$gap-width-total: $gap-width * $gap-count;

$items-width: calc(#{$container-width} - #{$gap-width-total});
$item-width: calc(#{$items-width} / #{$col-count});

.items {
  display: grid;
  grid-auto-flow: dense;
  grid-auto-rows: $item-width;
  grid-column-gap: $gap-width;
  grid-row-gap: $gap-width;
  grid-template-columns: repeat(#{$col-count}, #{$item-width});
  width: $items-width;
  @media screen and (max-width: $breakpoint-mobile) {
    grid-auto-rows: auto;
    grid-template-columns: 1fr;
    width: $container-width;
  }

  // 基本的なアイテムの大きさを設定
  .item {
    background: red;
  }

  // 1, 11, 21...
  // 10, 20, 30...
  .item:nth-child(10n + 1),
  .item:nth-child(10n + 10) {
    grid-column: span 2 / auto;
    grid-row: span 2 / auto;
    @media screen and (max-width: $breakpoint-mobile) {
      grid-column: auto / auto;
      grid-row: auto / auto;
    }
  }

  // 8, 18, 28...
  .item:nth-child(10n + 8) {
    // そのままだと1列に収まってしまうので、カラム番号1を始点とする
    grid-column: 1 / auto;
    @media screen and (max-width: $breakpoint-mobile) {
      grid-column: auto / auto;
    }
  }

  // 9, 19 ,29...
  .item:nth-child(10n + 9) {
    // そのままだと1列に収まってしまうので、カラム番号2を始点とする
    grid-column: 2 / auto;
    @media screen and (max-width: $breakpoint-mobile) {
      grid-column: auto / auto;
    }
  }
}