【CSS】Flexboxで中央揃え完全ガイド|水平・垂直・完全中央配置の全パターンと実務テクニック

CSSで要素を中央に配置したい――この課題は、Web制作で最もよく検索されるトピックのひとつです。display: flexと数行のプロパティを組み合わせるだけで、水平・垂直・完全中央配置がシンプルに実現できます。

この記事では、Flexboxの軸の概念から始めて、justify-contentalign-itemsmargin: autoalign-selfなどあらゆる中央揃えパターンを網羅。よくある失敗と解決策、CSS Gridとの使い分け、レスポンシブ対応、そして実務で使えるヘッダー・カード・モーダル・ローディングの実装例まで、中央揃えの全知識をまとめました。

この記事で分かること

Flexboxの主軸・交差軸の概念justify-content: centeralign-items: centerを使った水平・垂直・完全中央揃えの方法、margin: autoによる中央配置、align-selfでの個別調整、よくある失敗パターンと解決策、CSS Gridとの比較、レスポンシブ対応、そして実務で使えるUI実装パターンまで解説します。

スポンサーリンク

Flexboxの基本概念

Flexboxで中央揃えを正しく使うには、まず主軸(Main Axis)と交差軸(Cross Axis)の概念を理解する必要があります。

CSS
display: flex;              /* Flexコンテナにする */
flex-direction: row;        /* デフォルト: 主軸は横方向 → */
flex-direction: column;     /* 主軸を縦方向 ↓ に変更 */

主軸と交差軸のルール

  • flex-direction: row(デフォルト)→ 主軸=横方向、交差軸=縦方向
  • flex-direction: column → 主軸=縦方向、交差軸=横方向
  • justify-content は常に主軸方向の配置を制御
  • align-items は常に交差軸方向の配置を制御

flex-direction: row

→ 主軸

↕ 交差軸(縦)

flex-direction: column

↓ 主軸

↔ 交差軸(横)

水平方向の中央揃え(justify-content: center)

主軸方向に中央揃えするには、justify-content: centerを使います。flex-direction: row(デフォルト)のとき、これは水平方向の中央揃えになります。

CSS – 水平中央揃え
.container {
  display: flex;
  justify-content: center;  /* 水平方向に中央揃え */
}

実行結果

中央に配置

複数の子要素を水平中央にまとめる

CSS – 複数要素の水平中央揃え
.container {
  display: flex;
  justify-content: center;
  gap: 16px;  /* 要素間の余白 */
}

実行結果

Item 1
Item 2
Item 3

垂直方向の中央揃え(align-items: center)

交差軸方向に中央揃えするには、align-items: centerを使います。ただし、垂直方向に中央揃えするためには、コンテナに高さが必要です。

CSS – 垂直中央揃え
.container {
  display: flex;
  align-items: center;  /* 垂直方向に中央揃え */
  height: 200px;       /* 高さの指定が必須 */
}

実行結果

垂直中央に配置

注意:align-items: centerで垂直中央にならない場合、ほとんどのケースでコンテナに高さが指定されていないことが原因です。heightmin-heightを明示的に指定してください。

完全中央配置(水平 + 垂直)

もっともよく使われるパターンです。justify-content: centeralign-items: center組み合わせることで、要素を画面の中央に完全に配置できます。

CSS – 完全中央配置(最頻出パターン)
.container {
  display: flex;
  justify-content: center;  /* 水平中央 */
  align-items: center;      /* 垂直中央 */
  height: 100vh;            /* ビューポート全体 */
}

実行結果

完全中央配置

ポイント:この3行の組み合わせ(display: flex + justify-content: center + align-items: center)は、CSS中央揃えの黄金パターンです。真っ先に覚えておきましょう。

flex-direction: column での完全中央配置

flex-direction: columnの場合、軸が入れ替わりますが、結果は同じです。主軸が縦になるため、justify-contentが垂直、align-itemsが水平を制御します。

CSS – column方向の完全中央配置
.container {
  display: flex;
  flex-direction: column;    /* 主軸を縦方向に */
  justify-content: center;  /* 縦方向の中央(主軸) */
  align-items: center;      /* 横方向の中央(交差軸) */
  height: 100vh;
}

実行結果(要素が縦に積まれて中央配置)

タイトル
サブタイトル

margin: auto を使った中央揃え

Flexbox コンテナ内の子要素にmargin: autoを指定すると、余白を自動で均等に分配して中央に配置されます。これはjustify-contentalign-itemsを使わない代替アプローチです。

CSS – margin: auto による中央配置
.container {
  display: flex;
  height: 300px;
}

.child {
  margin: auto;  /* 上下左右の余白を自動分配 → 完全中央 */
}

実行結果

margin: auto

margin: auto の便利な使い方

margin: autoは一方向だけに使うと、要素を特定の方向に押しやることができます。これはナビゲーションのレイアウトで非常に便利です。

CSS – margin-left: auto で右寄せ
.nav {
  display: flex;
  align-items: center;
}

.nav-logo {
  margin-right: auto;  /* ロゴを左に、残りを右に押しやる */
}

実行結果

Logo
About
Blog
Contact

複数要素の中央揃え(flex-wrap対応)

子要素が多い場合、flex-wrap: wrapalign-content: centerを組み合わせて、折り返した行全体を中央に配置できます。

CSS – 折り返しありの中央揃え
.container {
  display: flex;
  flex-wrap: wrap;             /* 折り返しを許可 */
  justify-content: center;    /* 各行の水平中央 */
  align-content: center;      /* 行グループ全体の垂直中央 */
  gap: 12px;
  height: 300px;
}

align-items と align-content の違い

  • align-items: 各行内のアイテムの交差軸方向の配置(1行ずつ)
  • align-content: 複数行全体の交差軸方向の配置(行グループまとめて)
  • flex-wrap: wrap を使って複数行になった場合にだけ align-content は効果がある

実行結果(タグが折り返して中央配置)

HTML
CSS
JavaScript
React
Vue
Angular

align-self で個別の位置調整

align-selfを使うと、特定の子要素だけを交差軸方向で個別に位置調整できます。親のalign-itemsを上書きします。

CSS – align-self の使い方
.container {
  display: flex;
  align-items: flex-start;  /* 全体は上揃え */
  height: 200px;
}

.special {
  align-self: center;     /* この要素だけ垂直中央 */
}

.bottom {
  align-self: flex-end;   /* この要素だけ下揃え */
}

実行結果

上揃え
(デフォルト)
中央
(align-self)
下揃え
(align-self)

align-self で使える値一覧

説明
auto 親のalign-itemsの値を継承(デフォルト)
flex-start 交差軸の開始位置に配置
center 交差軸の中央に配置
flex-end 交差軸の終了位置に配置
stretch 交差軸方向にコンテナいっぱいに伸ばす
baseline テキストのベースラインに揃える

テキストの中央揃え:Flexbox vs text-align

テキストを中央揃えする方法はtext-align: centerFlexboxの2つがありますが、使い分けが重要です。

方法 用途 特徴
text-align: center インラインテキストの水平中央 テキストのみ。垂直中央は不可
Flexbox ブロック要素の水平+垂直中央 要素全体を配置。垂直も対応
両方の併用 ブロック中央+内部テキスト中央 最も柔軟なアプローチ
CSS – テキスト中央揃えの使い分け
/* テキストだけ中央にしたい → text-align */
p {
  text-align: center;
}

/* ボックスごと中央に配置したい → Flexbox */
.wrapper {
  display: flex;
  justify-content: center;
  align-items: center;
}

/* ボックスを中央に置き、中のテキストも中央 → 併用 */
.card {
  display: flex;
  justify-content: center;
  align-items: center;
  text-align: center;  /* 複数行テキストも中央揃え */
}

よくある失敗パターンと解決策

Flexboxの中央揃えでつまずきやすいポイントをまとめました。

失敗1: 垂直中央にならない(高さ指定忘れ)

最も多い失敗です。コンテナに高さがないと、align-items: centerは効きません。

NG: 高さ未指定

.container {
  display: flex;
  align-items: center;
  /* height がない! */
}

OK: 高さを指定

.container {
  display: flex;
  align-items: center;
  height: 100vh;
}

失敗2: flex-direction: column で軸が入れ替わっている

注意:flex-direction: columnにすると、justify-content縦方向align-items横方向の制御に変わります。「水平中央にしたいのにjustify-content: centerが効かない」と感じたら、flex-directionを確認してください。

失敗3: 子要素にwidth: 100%が指定されている

CSS – width: 100% の影響
/* NG: 子要素が親いっぱいに広がり、中央揃えの意味がなくなる */
.child {
  width: 100%;  /* これがあると水平中央にならない */
}

/* OK: widthを指定しないか、具体的な値を設定 */
.child {
  width: 300px;  /* または max-width */
}

失敗4: align-content と align-items を混同

CSS – align-content vs align-items
/* 1行の場合 → align-items を使う */
.single-line {
  display: flex;
  align-items: center;      /* OK */
}

/* 複数行の場合 → align-content を使う */
.multi-line {
  display: flex;
  flex-wrap: wrap;
  align-content: center;    /* 複数行の全体を中央に */
}

失敗5: 親要素にdisplay: flexを付け忘れている

ポイント:justify-contentalign-itemsは、display: flexが指定されたFlexコンテナ上でのみ機能します。子要素に直接書いても効きません(align-selfは除く)。

CSS Grid との比較(place-items: center)

CSS Gridにはplace-items: centerという、たった1行で完全中央配置できるプロパティがあります。

CSS – Grid vs Flexbox の中央配置
/* Flexbox: 2プロパティ必要 */
.flex-center {
  display: flex;
  justify-content: center;
  align-items: center;
}

/* Grid: 1プロパティで済む */
.grid-center {
  display: grid;
  place-items: center;  /* align-items + justify-items の一括指定 */
}
比較項目 Flexbox CSS Grid
記述量 3プロパティ 2プロパティ(place-items使用)
複数要素の並び 横 or 縦に並ぶ 重なる(同セルに配置)
得意な場面 1次元のレイアウト(ナビ等) 2次元のレイアウト(格子状)
中央配置のみ 十分に実用的 最もシンプル
ブラウザ対応 IE11含め広く対応 モダンブラウザのみ

ポイント:単一要素の中央配置だけならdisplay: grid; place-items: center;が最短です。ただし複数要素を横に並べたい場合や、IE対応が必要な場合はFlexboxを選択しましょう。

レスポンシブ対応での中央揃え

画面幅に応じて中央揃えのレイアウトを切り替えるテクニックです。

CSS – レスポンシブ中央揃え
.container {
  display: flex;
  justify-content: center;
  align-items: center;
  flex-wrap: wrap;
  gap: 20px;
  min-height: 100vh;
}

.card {
  flex: 1 1 300px;   /* 最小300px、伸縮可能 */
  max-width: 400px;   /* 最大幅を制限 */
}

/* モバイル: 縦積みに変更 */
@media (max-width: 768px) {
  .container {
    flex-direction: column;
  }
  .card {
    max-width: 100%;
  }
}

ビューポートの高さに対する中央配置

ページ全体の中央に要素を置くには、min-height: 100vhまたはmin-height: 100dvhを使います。

CSS – ビューポート中央配置
.fullscreen-center {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 100dvh;  /* dvh: モバイルのアドレスバー考慮 */
}

vh vs dvh vs svh

  • 100vh: ビューポートの高さ(モバイルでアドレスバーを含む場合がある)
  • 100dvh: 動的ビューポート高さ(アドレスバーの表示/非表示に追従)
  • 100svh: 最小ビューポート高さ(アドレスバー表示時の高さ)
  • モバイル対応では dvh が推奨(2025年現在、主要ブラウザ対応済み)

実務パターン集

実際のWebサイトでよく使う中央揃えのパターンを紹介します。コピペしてすぐに使えるコードです。

パターン1: ヘッダーナビゲーション

ロゴを左、メニューを中央、ボタンを右に配置するヘッダーです。

CSS – ヘッダーナビ
.header {
  display: flex;
  justify-content: space-between;
  align-items: center;       /* 垂直中央揃え */
  padding: 0 24px;
  height: 64px;
}

実行結果

Logo
Home
About
Blog
Sign Up

パターン2: カードレイアウト

カード内のコンテンツを中央に配置するパターンです。

CSS – カードの中央配置
.card-container {
  display: flex;
  justify-content: center;
  flex-wrap: wrap;
  gap: 24px;
}

.card {
  display: flex;
  flex-direction: column;
  align-items: center;   /* 内部コンテンツを水平中央 */
  text-align: center;
  padding: 32px;
  width: 280px;
}

実行結果

機能1

説明テキスト

機能2

説明テキスト

機能3

説明テキスト

パターン3: モーダル・ダイアログ

画面の中央にモーダルを表示するパターンです。

CSS – モーダルの中央配置
.modal-overlay {
  position: fixed;
  inset: 0;              /* top/right/bottom/left: 0 の一括指定 */
  display: flex;
  justify-content: center;
  align-items: center;
  background: rgba(0, 0, 0, 0.5);
  z-index: 1000;
}

.modal {
  background: #fff;
  border-radius: 16px;
  padding: 32px;
  max-width: 90vw;
  max-height: 90vh;
  overflow-y: auto;
}

実行結果(イメージ)

確認ダイアログ

この操作を実行しますか?

キャンセル
実行

パターン4: ローディングスピナー

ローディング中の画面中央にスピナーを表示するパターンです。

CSS – ローディングスピナーの中央配置
.loading-container {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  min-height: 100vh;
  gap: 16px;
}

.spinner {
  width: 48px;
  height: 48px;
  border: 4px solid #e2e8f0;
  border-top-color: #3b82f6;
  border-radius: 50%;
  animation: spin 0.8s linear infinite;
}

@keyframes spin {
  to { transform: rotate(360deg); }
}

パターン5: アイコン + テキストの垂直中央揃え

ボタンやリストアイテムでアイコンとテキストを垂直中央に揃えるパターンです。

CSS – アイコン+テキストの垂直中央
.button-with-icon {
  display: inline-flex;   /* inline-flex でインラインに配置 */
  align-items: center;    /* アイコンとテキストを垂直中央 */
  gap: 8px;              /* アイコンとテキストの間隔 */
}

実行結果

編集する
削除する
保存する

ブラウザ互換性

プロパティ Chrome Firefox Safari Edge
display: flex 29+ 28+ 9+ 12+
justify-content 29+ 28+ 9+ 12+
align-items 29+ 28+ 9+ 12+
align-self 29+ 28+ 9+ 12+
gap(flex) 84+ 63+ 14.1+ 84+
place-items(Grid) 59+ 45+ 11+ 79+

ポイント:Flexboxの基本プロパティはIE11を含む全ブラウザで対応済みです。gapプロパティだけはIE非対応ですが、2025年現在のモダンブラウザでは問題なく使えます。IE対応が必要な場合はmarginで代替してください。

Flexbox中央揃え早見表

最後に、やりたいことから逆引きできる早見表をまとめました。

やりたいこと CSSコード
水平中央のみ display: flex; justify-content: center;
垂直中央のみ display: flex; align-items: center; height: ○○;
完全中央(水平+垂直) display: flex; justify-content: center; align-items: center; height: ○○;
子要素1つだけ中央 display: flex; + 子に margin: auto;
特定の子だけ垂直位置変更 子に align-self: center / flex-end;
折り返し行の中央配置 flex-wrap: wrap; align-content: center;
最短の完全中央(Grid) display: grid; place-items: center; height: ○○;

まとめ

CSSのFlexboxを使った中央揃えは、覚えるべきポイントを整理すればシンプルです。

この記事のポイント

  • 水平中央: justify-content: center
  • 垂直中央: align-items: center(+ 高さ指定が必須)
  • 完全中央: justify-content: center + align-items: center
  • 子要素単体: margin: auto で余白を自動分配
  • 個別調整: align-self で特定の子だけ位置変更
  • flex-direction を変えるとjustify-contentalign-itemsの軸が入れ替わる
  • 最短の完全中央: CSS Gridの place-items: center
  • 垂直中央が効かないときはコンテナの高さ指定を確認

Flexboxの中央揃えは一度パターンを覚えれば、ヘッダー、カード、モーダル、ローディングなど、あらゆるUIコンポーネントに応用できます。この記事の早見表をブックマークして、実務で困ったときにすぐ参照してください。