CSS Grid実践術|複雑なレイアウトをシンプルに設計する方法

C
クリオ
Web制作ディレクター / フロントエンジニア

こんにちは!
今日は「CSS Gridを使った複雑なレイアウト設計のコツ」について解説します。

レイアウト設計で僕が陥った失敗

正直に告白します。
僕も最初、CSS Gridのメリットがよく分かっていませんでした。
display: flexだけで十分だと思ってたんですよ。

ある案件で、ダッシュボード風の複雑なレイアウトを作ることになったんです。
ヘッダー、サイドバー、メインコンテンツ、フッター…それにウィジェットがいっぱい。
Flexだけで対応しようとしたら、めっちゃ入れ子が深くなってしまって、もう大変でした。

そこで気づいたんです。
CSS Gridって「二次元レイアウト」を最初から考えるツールなんだ、って。
縦軸と横軸を同時に制御できるから、複雑なレイアウトほど、実はシンプルに書けるんですよ。

テンプレート領域で視覚的に設計する

CSS Gridで一番強力な機能が、grid-template-areasです。
これはホンマに便利やん、て感動しました。

例えば、こんなレイアウトを作りたいとします。


.container {
  display: grid;
  grid-template-columns: 250px 1fr 300px;
  grid-template-rows: 60px 1fr 40px;
  grid-template-areas:
    "header header header"
    "sidebar main aside"
    "footer footer footer";
  gap: 15px;
}

.header {
  grid-area: header;
}

.sidebar {
  grid-area: sidebar;
}

.main {
  grid-area: main;
}

.aside {
  grid-area: aside;
}

.footer {
  grid-area: footer;
}

見てください。
CSSコードの中に、ほぼ図解が入ってるような感じで、パッと見で「ああ、このレイアウトなんだ」って分かります。
これは現場でめっちゃ強いですよ。

タスクチェンジして別の人がコードを見た時も、grid-template-areasがあると、修正がすごく楽になります。

自動配置と明示的配置を組み合わせる

複数のカードやウィジェットを配置する時、わざわざ一個一個にgrid-areaを指定するのは面倒です。
そんな時は「自動配置」と「明示的配置」を混ぜるといいですよ。


.dashboard {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  grid-auto-rows: 300px;
  gap: 20px;
}

.widget-featured {
  grid-column: 1 / -1;
  grid-row: 1;
}

.widget {
  /* 自動的にグリッドに配置される */
}

重要なウィジェット(例:売上チャート)はgrid-column: 1 / -1で横幅全体を占めさせて、他のカードは自動配置で「すき間に自動的に入る」という感じです。
これ、計算すごく楽になります。

レスポンシブ対応を簡潔に書く

モバイルで1カラム、タブレットで2カラム、PCで3カラムみたいなレイアウト、ありますよね。
Flexだと何度も要素の順序を変えたり、flex-wrapの挙動を考えたりして、ちょっと複雑になります。

Gridなら、メディアクエリでカラム数を変えるだけです。


.grid-container {
  display: grid;
  grid-template-columns: 1fr;
  gap: 20px;
}

@media (min-width: 768px) {
  .grid-container {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (min-width: 1200px) {
  .grid-container {
    grid-template-columns: repeat(3, 1fr);
  }
}

ほら、これだけ。
子要素には何もCSSを書く必要がありません。
親のグリッド定義を変えるだけで、全部のアイテムが自動的に配置し直されます。

まとめ

CSS Gridは「複雑だ」と思われることが多いんですが、実は逆で、複雑なレイアウトほど「シンプルに書ける」ツールです。

特にgrid-template-areasgrid-template-columnsの組み合わせは、現場で本当に頼りになります。
見た目の構造がコードに反映されるので、バグも減りますし、保守もしやすくなります。

もし「Flexで何度もネストしちゃってる…」という状況だったら、ぜひGridへの切り替えを検討してみてください。
データベースの管理画面やダッシュボード、複雑な記事レイアウトなんかは、Gridの出番ですよ。

Web制作で困ったことがあったら、またこのブログを覗いてくださいね!

― クリオ