CSS Flexboxで思い通りのレイアウトを ―
現場で本当に使うテクニック集

「中央揃えがうまくいかない」「均等配置がズレる」――そんな悩みとはもうお別れです。Flexboxの基本概念から、実務で頻出するレイアウトパターンまで、動くデモと一緒に身につけましょう。

そもそもFlexboxとは何か

Flexbox、正式名称 CSS Flexible Box Layout は、要素を一方向(横または縦)に並べるためのレイアウトモデルです。2012年ごろから仕様が固まりはじめ、いまではほぼすべてのブラウザで完全にサポートされています。

Flexboxが登場する以前、私たちは floatdisplay: inline-block を駆使してレイアウトを組んでいました。要素を横に並べるだけで clearfix が必要だったり、余白の計算が合わなかったり。思い返すと、なかなか大変な時代でした。

Flexboxの最大の特徴は、「親要素(コンテナ)にルールを書くだけで、子要素の並び方・サイズ・間隔を制御できる」という点です。この考え方を理解すると、レイアウトの組み方が根本的に変わります。

コンテナとアイテム ― 2つの役割

Flexboxを使うとき、まず覚えるべきは「Flexコンテナ」と「Flexアイテム」という2つの関係です。親要素に display: flex を指定した瞬間、その直下の子要素たちが自動的にFlexアイテムになります。

Flexboxの最小構成
<div class="container">
  <div class="item">A</div>
  <div class="item">B</div>
  <div class="item">C</div>
</div>

.container {
  display: flex;
}

たったこれだけで、子要素A・B・Cが横一列に並びます。float も clearfix も不要。これがFlexboxのシンプルさです。

▶ Live Demo — display: flex の基本動作
A
B
C
💡 現場の経験則
Flexboxの gap プロパティは比較的新しい機能ですが、2021年以降すべてのモダンブラウザでサポートされています。以前は margin で間隔を調整していましたが、いまは gap のほうが圧倒的に楽です。

主軸と交差軸 ― Flexboxの「方向」を理解する

Flexboxを使いこなすうえで、絶対に避けて通れない概念があります。それが「主軸(Main Axis)」と「交差軸(Cross Axis)」です。

デフォルトでは、主軸は水平方向(左→右)、交差軸は垂直方向(上→下)です。flex-direction を変えると、この軸の方向が切り替わります。ここがFlexboxでつまずきやすいポイントでもあります。

大事なのは、justify-content は常に主軸方向の配置を、align-items は常に交差軸方向の配置を制御するということ。flex-direction: column に切り替えると、justify-content が縦方向、align-items が横方向の制御になります。

flex-direction による軸の切り替え
/* デフォルト:横並び */
.row {
  display: flex;
  flex-direction: row;     /* 主軸 → 水平 */
}

/* 縦並び */
.column {
  display: flex;
  flex-direction: column;  /* 主軸 → 垂直 */
}
▶ Live Demo — flex-direction: row vs column

flex-direction: row

1
2
3

flex-direction: column

1
2
3

完全中央揃え ― CSS史上最も簡潔なセンタリング

Flexbox以前、要素の上下左右中央揃えは開発者にとって長年の悩みでした。position: absolutetransform を組み合わせたり、テーブルセルを使ったり。いくつもの「ハック」が生まれては消えていきました。

Flexboxなら、たった3行です。

完全中央揃え(上下左右)
.center-box {
  display: flex;
  justify-content: center;  /* 主軸方向(横)の中央 */
  align-items: center;      /* 交差軸方向(縦)の中央 */
}
▶ Live Demo — 完全中央揃え
上下左右、完全中央
📌 ポイント
中央揃えの親要素には、必ず明示的な高さ(heightmin-height)を指定してください。高さがないと「縦方向の中央」が成立しません。実務では min-height: 100vhmin-height: 100dvh と組み合わせることが多いです。

justify-content ― 主軸方向の配置バリエーション

justify-content は、Flexアイテムを主軸方向にどう配置するかを決めるプロパティです。実務では特に space-betweenspace-evenly の使い分けが重要になります。

justify-content の代表的な値
.container {
  display: flex;
  justify-content: flex-start;    /* 左寄せ(デフォルト) */
  justify-content: center;        /* 中央寄せ */
  justify-content: flex-end;      /* 右寄せ */
  justify-content: space-between; /* 両端揃え */
  justify-content: space-around;  /* 均等配置(両端にも余白) */
  justify-content: space-evenly; /* 完全均等配置 */
}
▶ Live Demo — justify-content 全パターン比較
flex-start
center
space-between
space-evenly

実務で最もよく使うのは space-between です。ナビゲーションのロゴとメニューを左右に分けたり、カードの中のテキストとボタンを上下に分けたり。「両端に押し付けて、間は自動で均等」という動きは、驚くほど多くの場面で活躍します。

flex-wrap と実務レイアウトパターン

デフォルトでは、Flexアイテムは1行に収まろうとして縮みます。これは flex-wrap: nowrap がデフォルト値だからです。カードレイアウトなど、折り返しが必要な場面では flex-wrap: wrap を指定します。

❌ やりがちなNG ― wrap を忘れてカードが潰れる
.card-grid {
  display: flex;
  gap: 16px;
  /* flex-wrap がないのでアイテムが縮む */
}
✅ 正しい書き方 ― wrap + 最小幅で自然な折り返し
.card-grid {
  display: flex;
  flex-wrap: wrap;
  gap: 16px;
}

.card {
  flex: 1 1 280px;  /* 最小280px、伸縮可能 */
}

ポイントは flex: 1 1 280px の書き方です。これは「伸びてもよい、縮んでもよい、基準サイズは280px」という意味で、280px未満になると折り返して次の行に移ります。メディアクエリなしでレスポンシブなカードグリッドが作れる、現場で非常に重宝するテクニックです。

▶ Live Demo — flex-wrap でレスポンシブカードグリッド
🎨
デザイン
UIデザインの基本原則
💻
コーディング
HTML/CSSの実装力
📱
レスポンシブ
あらゆるデバイスに対応
パフォーマンス
高速で軽量な実装

※ ブラウザ幅を狭めるとカードが折り返します

ナビゲーションバーの典型パターン

ヘッダーのナビゲーションは、Flexboxが最も活躍する場面のひとつです。ロゴを左に、メニューを右に配置する定番のパターンは、justify-content: space-between 一行で実現できます。

ナビゲーション ― ロゴ左 / メニュー右
.navbar {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 0 24px;
  height: 64px;
}

.nav-links {
  display: flex;
  gap: 24px;
  list-style: none;
}
▶ Live Demo — ナビゲーションバー

flex-grow / flex-shrink / flex-basis を正しく理解する

Flexboxで最もつまずきやすいのが、flex-growflex-shrinkflex-basis の3つのプロパティです。これらはショートハンド flex でまとめて指定できます。

flex-grow は「余ったスペースをどれだけ受け取るか」、flex-shrink は「スペースが足りないときにどれだけ縮むか」、そして flex-basis は「計算の起点となるサイズ」です。

flex ショートハンドの読み方
/* flex: [grow] [shrink] [basis] */

.item { flex: 0 1 auto; }  /* デフォルト:伸びない、縮む、自然なサイズ */
.item { flex: 1; }          /* = flex: 1 1 0%  余白を均等に吸収 */
.item { flex: none; }       /* = flex: 0 0 auto  伸びも縮みもしない */
.item { flex: 1 1 200px; } /* 200px基準で伸縮 */
▶ Live Demo — flex-grow の違いを視覚化
全アイテム flex: 1(均等幅)
flex: 1
flex: 1
flex: 1
最初だけ flex: 2(2倍の幅を取得)
flex: 2
flex: 1
flex: 1
⚠️ 注意
flex: 1flex: 1 1 0% の省略形です。flex-basis: 0% になるため、アイテムのコンテンツサイズに関係なく余白が均等に分配されます。一方、flex: auto(= flex: 1 1 auto)はコンテンツサイズを基準にした上で余白を分配するので、結果が異なります。この違いは実務で混乱しやすいポイントです。

サイドバー + メインコンテンツの定番レイアウト

flex-grow の実用的な使い方として、「固定幅のサイドバー + 可変幅のメインコンテンツ」というレイアウトがあります。サイドバーに flex: none を、メインに flex: 1 を指定するだけです。

サイドバーレイアウト
.layout {
  display: flex;
  gap: 24px;
}

.sidebar {
  flex: none;       /* 伸縮しない */
  width: 260px;
}

.main {
  flex: 1;           /* 残りの幅をすべて使う */
}
▶ Live Demo — サイドバー + メイン
Sidebar
120px固定
Main Content(残りすべて)

order と align-self ― アイテム単位のコントロール

ここまでは親要素(コンテナ)側のプロパティを中心に見てきましたが、Flexboxには個々のアイテムに直接指定できるプロパティもあります。代表的なのが orderalign-self です。

order はHTMLの記述順序を変えずに表示順序を変更するプロパティです。デフォルトはすべて 0 で、値が小さいほど前に表示されます。レスポンシブ対応で「モバイルだけ表示順を変えたい」といった場面で活躍します。

align-self は、交差軸方向の配置を特定のアイテムだけ上書きできるプロパティです。親の align-itemscenter でも、特定のアイテムだけ flex-end にする、といったことが可能です。

▶ Live Demo — align-self でアイテム個別制御
flex-start
center
flex-end
stretch
💡 現場の経験則
order はアクセシビリティの観点から注意が必要です。視覚的な表示順とDOMの順序が異なると、スクリーンリーダーやキーボードナビゲーションの体験が悪化する場合があります。視覚的なデザインのためだけに多用するのは避け、本当に必要な場面に限って使うようにしましょう。

まとめ

  • Flexboxは親要素に display: flex を書くだけで子要素の配置を制御できるレイアウトモデルで、float時代の複雑なハックは不要になりました
  • 「主軸」と「交差軸」を意識すれば、justify-content と align-items の役割が明確になり、flex-direction を変えても混乱しません
  • 完全中央揃えは display: flex + justify-content: center + align-items: center のたった3行で実現できます
  • flex-wrap: wrap と flex: 1 1 [最小幅] の組み合わせで、メディアクエリなしのレスポンシブカードグリッドが作れます
  • flex-grow / flex-shrink / flex-basis の3つの値を理解することで、サイドバーレイアウトなどの実務パターンが自在に組めるようになります
  • align-self や order で個別のアイテムを制御できますが、アクセシビリティへの影響を常に意識しましょう