CSSで要素を中央に配置したい――この課題は、Web制作で最もよく検索されるトピックのひとつです。display: flexと数行のプロパティを組み合わせるだけで、水平・垂直・完全中央配置がシンプルに実現できます。
この記事では、Flexboxの軸の概念から始めて、justify-content、align-items、margin: auto、align-selfなどあらゆる中央揃えパターンを網羅。よくある失敗と解決策、CSS Gridとの使い分け、レスポンシブ対応、そして実務で使えるヘッダー・カード・モーダル・ローディングの実装例まで、中央揃えの全知識をまとめました。
この記事で分かること
Flexboxの主軸・交差軸の概念、justify-content: centerとalign-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; /* 要素間の余白 */
}
垂直方向の中央揃え(align-items: center)
交差軸方向に中央揃えするには、align-items: centerを使います。ただし、垂直方向に中央揃えするためには、コンテナに高さが必要です。
CSS – 垂直中央揃え
.container {
display: flex;
align-items: center; /* 垂直方向に中央揃え */
height: 200px; /* 高さの指定が必須 */
}
注意:align-items: centerで垂直中央にならない場合、ほとんどのケースでコンテナに高さが指定されていないことが原因です。heightやmin-heightを明示的に指定してください。
完全中央配置(水平 + 垂直)
もっともよく使われるパターンです。justify-content: centerとalign-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-contentやalign-itemsを使わない代替アプローチです。
CSS – margin: auto による中央配置
.container {
display: flex;
height: 300px;
}
.child {
margin: auto; /* 上下左右の余白を自動分配 → 完全中央 */
}
margin: auto の便利な使い方
margin: autoは一方向だけに使うと、要素を特定の方向に押しやることができます。これはナビゲーションのレイアウトで非常に便利です。
CSS – margin-left: auto で右寄せ
.nav {
display: flex;
align-items: center;
}
.nav-logo {
margin-right: auto; /* ロゴを左に、残りを右に押しやる */
}
複数要素の中央揃え(flex-wrap対応)
子要素が多い場合、flex-wrap: wrapとalign-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: centerとFlexboxの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-contentやalign-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;
}
パターン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-contentとalign-itemsの軸が入れ替わる
- 最短の完全中央: CSS Gridの
place-items: center
- 垂直中央が効かないときはコンテナの高さ指定を確認
Flexboxの中央揃えは一度パターンを覚えれば、ヘッダー、カード、モーダル、ローディングなど、あらゆるUIコンポーネントに応用できます。この記事の早見表をブックマークして、実務で困ったときにすぐ参照してください。