WEB

【CSS】横並びの子要素、孫要素の高さをsubgridを使って簡単に揃える方法

はじめに

CSSのSubgridが2023年9月に主要ブラウザでサポートされるようになりました。ブログ記事一覧の構成を利用し試してみました。これまで、記事一覧の列のタイトルの高さや、日付の位置などを揃える場合、Javascriptを使用し、列内で一番高さのある要素のタイトルのheightを取得し、他タイトルに高さを付与していましたが、subgridを使用すると、cssだけで高さ揃えが簡単にできました!(感動)

やりたいこと

CSS Gridを使用し、列のサムネイル、タイトル、作者名、カテゴリ、日付の位置を、揃えたい。こちらが完成形になります。

実装サンプル

STEP1:HTMLのコーディング

    <main class="main">
      <div class="card-container">
        <a class="card">
          <img
            class="card-thumbnail"
            src="/images/icatch_chatGPT.png"
            alt="chatGPT"
          />
          <h2 class="card-title">
            AWSのS3のファイルを表示するLambda関数を作ってAPIGatewayから実行するまでをChatGPT先生に教えてもらった
          </h2>
          <p class="card-profile">
            <span>
              <img
                src="/images/avatar.png"
                height="30"
                width="30"
                class="card-profile-img"
            /></span>
            <span>reiko suzuki</span>
          </p>
          <ul class="card-label">
            <li>Python</li>
            <li>技術情報</li>
            <li>やってみた</li>
          </ul>
          <p class="card-date">2023.11.30</p>
        </a>
        <a class="card"><!--省略--></a>
        <a class="card"><!--省略--></a>
        <a class="card"><!--省略--></a>
        <a class="card"><!--省略--></a>
        <a class="card"><!--省略--></a>
      </div>
    </main>
  

STEP2:親要素(card-container)に子要素(card)の配置を指定し、孫要素のスタイルを指定する

親要素にgrid-template-columnsプロパティのrepeat()関数で繰返しの指定をし、minmax()関数で幅を指定します。


  .card-container {
  display: grid;
  gap: 30px;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
}
  

カード内の要素のスタイルを指定します。※ベースのスタイルは省略しています

.card {
  border-radius: 2px;
  background: #fff;
  box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.18);
  color: #000;
}

.card :is(.card-title, .card-profile, .card-label, .card-date) {
  padding: 12px 15px;
}

.card .card-title {
  font-size: 18px;
}

.card-profile {
  display: flex;
  align-items: center;
  gap: 3px;
  font-size: 12px;
}

.card-profile img {
  border-radius: 50%;
  margin-right: 8px;
}

.card-label {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  font-size: 12px;
}

.card-label li {
  max-height: 2em;
  padding: 2px 8px 3px;
  background-color: #bbb;
  color: #fff;
}

.card-date {
  color: #888;
  font-size: 12px;
}

ここまでの指定で、以下のようになります。これまでの方法だと、ここで、Javascriptを使用し、高さを揃えていました……

STEP3:子要素(card)にsubgridを指定

subgridを指定することで、親gridで定義した幅やgapを使用できるようになります。

.card {
  display: grid;
  grid-template-rows: subgrid;
}

このままだと重なってしまうので、grid-rowを使ってカード内の行数を指定し、gapの値を調整し、完成です!
メディアクエリを指定しなくても、レスポンシブなレイアウトが実現できます。

.card {
  display: grid;
  grid-row: span 5;
  grid-template-rows: subgrid;
  gap: 12px;
}

対応ブラウザ

主要ブラウザでサポートされています。(2024年01月15日)


CSS Subgrid | Can I Use

まとめ

2023年は、subgridの他に、コンテナクエリや三角関数、CSSネストなど、主要ブラウザでサポートされた便利な新機能が多く、試したら記事にしようと思います。

参考サイト

こちらのサイトを参考にさせていただきました。

 

 

N.T
平日はコーディング、週末は子供と公園を走り回っています。