🎼

CSS Subgridを使ってみる

2025/01/18に公開
2

先日カードレイアウトの調整で悩んでいたところ、subgridが便利と教えていただきました。知らない機能だったので試してみます。

Subgridとは

入れ子になったグリッド内で、子グリッドから親グリッドのトラックサイズを指定するために使用できる値です。例として、子グリッドの grid-template-rowssubgrid を設定することで、新しいトラックを生成するのではなく、親グリッドのトラックを参照できます。

通常、子グリッドは新しいトラックを生成するため、その中にある要素の高さはボックスの大きさに従います。


grid-template-rows: subgrid なし

カードレイアウトのように、子グリッド内の要素の高さを揃えたい場合は subgrid を使うことができます。親要素のトラックサイズを参照するため、grid-row: span 3 と指定することで親グリッドの3行分のスペースを占有できます。


grid-template-rows: subgrid あり

Subgridを使ってみる

サブグリッドを使ってカードレイアウトをつくってみます。といっても、入れ子にしたグリッドに対して subgrid を指定するだけです。子グリッドの gap は上書きできるので、親グリッドと異なる値を指定しました。

<!-- 親グリッド -->
<div class="grid-container">
  <!-- 子グリッド -->
  <div class="card card--violet">
    <div class="card__header">
      <img
        src="./images/image-daniel.jpg"
        alt="Daniel Clifford"
        class="card__avatar"
      />
      <div class="card__header-inner">
        <h2 class="card__header-name">Daniel Clifford</h2>
        <div class="card__header-description">Verified Graduate</div>
      </div>
    </div>

    <div class="card__title">
      Lorem ipsum dolor sit amet consectetur adipisicing elit. Cumque
      vitae culpa assumenda corporis deserunt autem voluptatibus quasi.
      Voluptate aliquid quia numquam repudiandae. Nesciunt eos magni
      tenetur eligendi est blanditiis fuga.
    </div>
    <div class="card__body">
      “I was an EMT for many years before I joined the bootcamp. I’ve been
      looking to make a transition and have heard some people who had an
      amazing experience here. I signed up for the free intro course and
      found it incredibly fun! I enrolled shortly thereafter. The next 12
      weeks was the best - and most grueling - time of my life. Since
      completing the course, I’ve successfully switched careers, working
      as a Software Engineer at a VR startup. ”
    </div>
  </div>
</div>

.grid-container {
  display: grid; /* 親グリッド */
  grid-template-columns: repeat(4, minmax(255px, 1fr));
  gap: 24px;
}

.card {
  display: grid; /* 子グリッド */
  grid-template-rows: subgrid; /* 行方向のサブグリッドを指定 */
  grid-row: span 3; /* 親グリッドの3行分を占有 */
  gap: 16px;
}


完成したもの (デザインはFrontend Mentorからお借りしました)

おわりに

CSS Grid Layout Module Level 2でSubgridが追加される前は、このようなレイアウトをつくるのにJavaScriptを使っていたそうです。新しいCSSの記法を知ることで、選択肢の幅が広がると思いました。

https://github.com/yuki-yamamura/testimonials-grid-section-main

株式会社FLAT テックブログ

Discussion

tyooontyooon

共有いただき、ありがとうございます。
subgridは子行列の調整に便利ですよね。
私は鹿野さんの記事も参考になりましたので共有しておきますね。
gridのおさらいと詳細が詳しく記載されております。

https://zenn.dev/tonkotsuboy_com/articles/css-subgrid-all-browsers?redirected=1

山村 祐貴山村 祐貴

コメントありがとうございます!
鹿野さんの記事読ませていただきました。
従来の実装方法〜subgrid登場以降の実装方法まで、すっと頭に入る内容でした 🐈