はじめに
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日)
まとめ
2023年は、subgridの他に、コンテナクエリや三角関数、CSSネストなど、主要ブラウザでサポートされた便利な新機能が多く、試したら記事にしようと思います。
参考サイト
こちらのサイトを参考にさせていただきました。