TechBlog

FlexboxとCSS Grid完全ガイド|レイアウト手法の違いと実践的な使い分け

by あくえり
#CSS #Flexbox #Grid #レイアウト #初心者
FlexboxとCSS Grid完全ガイド
目次

FlexboxとGridの最重要概念

CSSのレイアウトを学ぶ際、FlexboxとGridのどちらを使えばいいか迷う方は多いと思います。判断基準はシンプルです。

  • Flexbox = 一方向(横一列 or 縦一列に並べるとき)
  • Grid = 二次元(行と列の両方を同時にコントロールするとき)

ナビゲーションバーのようなアイテムを一列に並べる場面ではFlexbox、カード一覧のような格子状のレイアウトではGridを使うのが適切です。ただし両者は排他的ではなく、Gridの中のアイテムをFlexboxで整えるなど、組み合わせて使うのが実践的なアプローチです。


Flexboxの基本

コンテナとアイテム

Flexboxはコンテナ(親要素)display: flex を指定するだけで有効になります。直接の子要素が自動的にフレックスアイテムになります。

.container {
  display: flex;
}
<div class="container">
  <div>アイテム1</div>
  <div>アイテム2</div>
  <div>アイテム3</div>
</div>

デフォルトでは左から右へ横一列に並びます。

主要プロパティ一覧

プロパティ説明主な値
flex-direction並ぶ方向row(横)/ column(縦)
justify-content主軸方向の揃えflex-start / center / flex-end / space-between / space-around
align-items交差軸方向の揃えstretch / center / flex-start / flex-end
flex-wrap折り返しの有無nowrap / wrap
gapアイテム間の余白16px など

実践例:ナビゲーションバー

.navbar {
  display: flex;
  justify-content: space-between; /* ロゴと右側メニューを両端に */
  align-items: center;            /* 縦方向に中央揃え */
  padding: 0 24px;
  height: 64px;
  background-color: #1a1a2e;
}

.nav-links {
  display: flex;
  gap: 32px;                      /* リンク間のスペース */
  list-style: none;
}
<nav class="navbar">
  <a class="logo" href="/">MyBlog</a>
  <ul class="nav-links">
    <li><a href="/about">About</a></li>
    <li><a href="/blog">Blog</a></li>
    <li><a href="/contact">Contact</a></li>
  </ul>
</nav>

flex プロパティで伸縮を制御

アイテム側に flex プロパティを指定すると、余った空間をどう使うか制御できます。

.sidebar {
  flex: 0 0 260px;  /* 固定幅260px(伸縮しない) */
}

.main-content {
  flex: 1;          /* 残りのスペースをすべて使う */
}

/* 2カラムレイアウト */
.layout {
  display: flex;
  gap: 24px;
}

CSS Gridの基本

グリッドコンテナの作り方

display: grid を指定し、grid-template-columns で列の構成を定義します。

.grid-container {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr; /* 均等な3列 */
  gap: 24px;
}

fr(fraction)は利用可能なスペースの割合を表す単位です。1fr 1fr 1fr は3等分を意味します。

repeat() と minmax() で柔軟に

/* repeat(3, 1fr) は 1fr 1fr 1fr と同じ */
.grid-container {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 24px;
}

/* 自動で列数を決める(レスポンシブに対応) */
.auto-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 24px;
}

auto-fillminmax(280px, 1fr) の組み合わせは非常に強力です。コンテナの幅に応じて列数が自動調整され、各列は最小280px・最大1frになります。メディアクエリを書かずにレスポンシブなカードレイアウトが実現できます。

grid-area でアイテムの配置を制御

.dashboard {
  display: grid;
  grid-template-columns: 240px 1fr;
  grid-template-rows: 64px 1fr 48px;
  grid-template-areas:
    "header  header"
    "sidebar main"
    "footer  footer";
  min-height: 100vh;
}

.header  { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main    { grid-area: main; }
.footer  { grid-area: footer; }
<div class="dashboard">
  <header class="header">ヘッダー</header>
  <aside class="sidebar">サイドバー</aside>
  <main class="main">メインコンテンツ</main>
  <footer class="footer">フッター</footer>
</div>

実践パターン集

パターン1:カード一覧(Grid推奨)

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

.card {
  border: 1px solid #e5e7eb;
  border-radius: 8px;
  padding: 20px;
  display: flex;             /* カード内部はFlexbox */
  flex-direction: column;
  gap: 12px;
}

.card-footer {
  margin-top: auto;          /* フッターをカード下部に固定 */
}

パターン2:フォームのラベルと入力欄(Grid推奨)

.form {
  display: grid;
  grid-template-columns: 120px 1fr;
  gap: 12px 16px;
  align-items: center;
}

/* ボタンは2列にまたがる */
.form-submit {
  grid-column: 1 / -1;
  justify-self: end;
}
<form class="form">
  <label for="name">名前</label>
  <input id="name" type="text" />

  <label for="email">メール</label>
  <input id="email" type="email" />

  <button type="submit" class="form-submit">送信</button>
</form>

パターン3:水平・垂直中央揃え(Flexbox推奨)

.center-wrapper {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 100vh;
}

要素を完全に中央に配置する最もシンプルな方法です。ローディングスピナーやモーダルの配置に活用できます。


FlexboxとGridの使い分けまとめ

ユースケース推奨
ナビゲーションバーFlexbox
ボタングループFlexbox
カード一覧Grid
ダッシュボードレイアウトGrid
フォームの入力欄整列Grid
アイテムの垂直中央揃えFlexbox
複雑なページ全体のレイアウトGrid

参考書籍

CSS設計完全ガイド

CSS設計の原則からFlexbox、Grid、カスタムプロパティまで実践的に解説。中〜大規模なWebサイト制作に役立つ知識が詰まっています。

※ アフィリエイトリンクを含みます


まとめ

FlexboxとGridは用途が異なる2つのレイアウトシステムです。「一列に並べるならFlex、格子状に並べるならGrid」を基本に選択し、必要に応じて組み合わせましょう。実際のUI実装では、ページ全体のレイアウトにGridを使い、その中の個々のコンポーネントの整列にFlexboxを使うパターンが最もよく使われます。

共有: