[CSS] Grid(グリッドレイアウト)応用編:入れ子・repeat・自動配置の活用で自在なレイアウトへ!
前回までは、CSS Grid の基礎やグリッドエリアの使い方を学びました。
ここからは応用編です!
この記事では、グリッドの中にさらにグリッドを作る「入れ子構造(ネスト構造)」や、
repeat(), auto-fill, auto-fit などを活用した柔軟なレイアウト設計について紹介します。
入れ子構造(ネスト構造)
Grid レイアウトでは、親要素にグリッドを指定し、その中の子要素にも display: grid を指定することで、入れ子(ネスト)構造を実現できます。
たとえば、以下のような構成です。
・親要素 .layout:main(自動幅)と aside(幅200px)の2カラム
・main の中に、複数の .card をグリッドで整列
この後の応用例でコードを紹介します。
このように「Grid の中にさらに Grid」を使うことで、複雑なレイアウトでも見通しが良く、保守性の高い構造にできます。
repeat() で列数を柔軟に指定する
複数の列を作るとき、1fr 1fr 1fr のように繰り返すのは少し面倒です。
そんなときに便利なのが repeat() 関数です。
・css
1 |
grid-template-columns: repeat(3, 1fr); |
このように書けば、1fr 1fr 1fr と同じ意味になります。
列数を変えたくなったときは数字を変えるだけなので、メンテナンスがしやすくなります。
1 2 |
/* 例:4列に変更したい場合 */ grid-template-columns: repeat(4, 1fr); |
auto-fill / auto-fit の違いと使い分け
列数が決まっていない、または画面サイズに応じて自動で列数を調整したいときには、
repeat() と組み合わせて auto-fill や auto-fit を使うのが効果的です。
auto-fill と auto-fit の違い
・auto-fill
余白があっても、指定された最小幅で列を可能な限り作り、アイテムが足りない場合でも空のセルを残します。
・auto-fit
余白があれば、アイテム数に合わせて使われないセルをたたみ、実際に表示されるアイテムだけでスペースを埋めるように調整されます。
以下は、auto-fill と auto-fit の違いが分かりやすく確認できるサンプルコードです。
・デモ
※0.25× で確認ください
See the Pen
CSS Grid(auto-fill / auto-fit) by mkl may (@mkl-may)
on CodePen.
親要素(コンテナ)にはminmax()で指定した最小幅200px、最大幅1frを指定した4つの子要素(アイテム)を入れています。
auto-fill と auto-fit の違いは、repeat()のauto-fillとauto-fitの記述のみで、その他はまったく同じです。
種類 | 空きスペースの扱い |
---|---|
auto-fill | 空のセル(枠)も表示される |
auto-fit | 空のセルは表示されず、アイテムでスペースを埋める |
使い分けのコツとしては、「固定幅の列数を保ちたい」なら auto-fill、「詰めて表示したい」なら auto-fit が向いています。
応用例:カードレイアウトを作ってみよう
ここまでの知識を使って、main + sidebar の入れ子構造を持つレスポンシブなカードレイアウトを実装してみましょう。
・css
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
/* 全体レイアウト:main + sidebar(auto 200px) */ .layout { display: grid; grid-template-columns: auto 200px; gap: 1.5rem; padding: 1rem; } /* main にカードグリッドを適用 */ main { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 1rem; background-color: #F3EFF7; padding: 20px; } aside { background-color: #F3EFF7; } /* カード単体のデザイン */ .card { display: grid; grid-template-rows: auto 1fr; background-color: #D1C1E0; border-radius: 8px; padding: 15px; } .card img {margin: 0 auto;} /* ------------------- */ /* レスポンシブ対応 */ /* ------------------- */ @media (max-width: 768px) { .layout { grid-template-columns: 1fr; /* 1カラムに変更 */ } } |
・html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<div class="layout"> <main> <div class="card"> <img src="images/image.jpg" alt="画像"> <p>カードの説明テキスト</p> </div> <div class="card"> <img src="images/image.jpg" alt="画像"> <p>カードの説明テキスト</p> </div> <div class="card"> <img src="images/image.jpg" alt="画像"> <p>カードの説明テキスト</p> </div> </main> <aside> <h2>サイドバー</h2> </aside> </div> |
・デモ
※「0.25×」>「0.5×」>「1×」の順に表示を変えてご確認ください
See the Pen
CSS Grid nest by mkl may (@mkl-may)
on CodePen.
まとめ:自由自在なグリッド設計へ!
Grid を使いこなせば、可読性・保守性の高いコードで、洗練されたレイアウト設計が可能になります。
入れ子構造や repeat(), auto-fit のような機能を上手に使って、柔軟なレスポンシブデザインを作っていきましょう!