「中央寄せ」で毎回ググるのは今日で終わり
「上下左右の中央に置きたいだけなのに、なぜか上手くいかない」——CSSを書き始めた人が最初にハマる壁が中央寄せです。手法が多すぎて、どれを使えばいいのか毎回検索している人も多いはず。
先に結論です。迷ったらGridの place-items: center、要素を重ねて中央に置きたいときだけ position: absolute 系。これだけ覚えれば、実務の中央寄せの9割はカバーできます。
この記事では、現場で実際に使われる中央寄せの手法を比較表つきで整理し、それぞれコピペで動くコード例を用意しました。最後に「なぜか中央にならない」ときの原因Top3も解説します。
この記事でわかること
・中央寄せ4大手法(absolute+translate/inset+margin:auto/Flexbox/Grid)の書き方と使い分け
・テキスト(文字)の中央寄せの正解
・「なぜか中央にならない」よくある失敗と直し方
結論:中央寄せ手法の使い分け比較表
まず全体像です。どの手法をいつ使うかは、この表だけ見れば判断できます。
| 手法 | 書き方の要点 | 向いている場面 |
|---|---|---|
| Grid | 親に display:grid; place-items:center | 迷ったらこれ。1行で完結する最短の中央寄せ |
| Flexbox | 親に display:flex; justify-content:center; align-items:center | 複数の子を並べつつ中央に揃えたいとき |
| absolute+translate | 子に top:50%; left:50%; transform:translate(-50%,-50%) | 要素を「重ねて」中央に置くとき(バッジ、モーダル等) |
| absolute+inset+margin:auto | 子に inset:0; margin:auto+幅・高さ指定 | 重ねる系で、transformを別用途(アニメ等)に使いたいとき |
ポイントは、「並べる中央寄せ」はFlexbox/Grid、「重ねる中央寄せ」はabsolute系という分類です。通常のレイアウトフローに乗せたまま中央に置くのか、フローから切り離して重ねるのか——ここを区別できれば、手法選びで迷うことはなくなります。
手法1:Grid(place-items: center)|迷ったらこれ
親要素に2行書くだけ。現状もっとも短く、もっとも事故が少ない中央寄せです。
.box {
display: grid;
place-items: center; /* align-items + justify-items の一括指定 */
width: 200px;
height: 200px;
}place-items は align-items(縦)と justify-items(横)をまとめて指定するショートハンドです。子要素側には何も書く必要がありません。子のサイズが不定でも中央に来るのが最大の強みです。
私がレビューする側で見てきた限り、新しくコードを書くときの中央寄せはほぼこれ一択になりつつあります。「中央寄せ= negative margin や絶対配置のパズル」だった時代は、もう終わっています。
プロのコツ
・単一の子を中央に置くだけなら place-items: center
・「グリッド全体」を親の中央に寄せたいときは place-content: center
・この2つの違い(items=セル内の子 / content=トラック全体)を押さえると応用が効きます
手法2:Flexbox|複数の子を並べつつ中央へ
.box {
display: flex;
justify-content: center; /* 主軸(横)方向の中央 */
align-items: center; /* 交差軸(縦)方向の中央 */
gap: 8px;
}Flexboxの本領は複数の子要素を並べながら揃えることです。ボタンの中のアイコン+テキスト、ナビゲーションのリンク列など、「並べて、かつ中央に」という場面ではGridよりFlexboxが自然です。
覚え方はシンプルで、justify=主軸(デフォルトでは横)、align=交差軸(デフォルトでは縦)。flex-direction: column にすると主軸と交差軸が入れ替わる点だけ注意してください。
初心者が「justify-contentを指定したのに縦が動かない」と混乱する原因は、ほぼこの軸の理解です。
手法3:absolute+translate|「重ねて中央」の定番
ここからは「重ねる中央寄せ」です。カードの上にバッジを重ねる、画像の上に再生ボタンを置く、モーダルを画面中央に固定する——通常のレイアウトフローから切り離して配置したいときは position: absolute の出番です。
例として、次のようにボックスの上辺中央にアイコンを重ねてみます。

<div class="box">
<div class="icon"></div>
</div>
<style>
.box {
position: relative; /* ← これが基準になる */
background-color: lightgray;
width: 200px;
height: 200px;
}
.icon {
background-color: lightcoral;
width: 50px;
height: 50px;
border-radius: 50%;
position: absolute;
top: 0;
left: 50%;
transform: translate(-50%, -50%);
}
</style>この手法の肝は「%の基準が2段階ある」ことです。
left: 50%
→ 親要素の幅に対して50%右へ移動(子の「左端」が親の中央に来る)
transform: translate(-50%, -50%)
→ 自分自身の幅・高さに対して50%左上へ戻す(子の「中心」が基準点に重なる)
top/leftの%は「親」基準、translateの%は「自分」基準——この非対称さこそが、absoluteセンタリングが「意外と難しい」と言われる正体です。
逆に言えば、ここさえ理解すれば上下左右中央(top:50%; left:50%; translate(-50%,-50%))も上辺中央も自在に置けます。子のサイズが不定でも使えるのが強みです。
手法4:absolute+inset:0+margin:auto|transformを温存できる
.parent {
position: relative;
}
.child {
position: absolute;
inset: 0; /* top/right/bottom/left: 0 の一括指定 */
margin: auto; /* 余白を上下左右に均等配分 → 中央に */
width: 50px; /* 幅・高さの指定が必須 */
height: 50px;
}inset: 0 で四辺すべてを0に固定し、margin: auto で余白を均等配分することで上下左右中央に配置する手法です。translate方式と違ってtransformプロパティを使わないので、ホバー時の拡大やアニメーションでtransformを別途使いたいときに衝突しません。
ただし子要素に幅と高さの指定が必須という制約があります。サイズ不定の要素にはtranslate方式を、サイズ固定+アニメーションありならinset方式を、と使い分けてください。
テキスト(文字)の中央寄せの正解
ブロック要素の配置とは別に、「文字そのもの」の中央寄せも整理しておきます。
| やりたいこと | 正解 | 備考 |
|---|---|---|
| 横方向の文字中央 | text-align: center | 親(ブロック要素)に指定する |
| 1行テキストの縦中央 | 親を display:flex; align-items:center | 複数行になっても崩れないので推奨 |
| ボタン内のラベル中央 | display:flex+justify-content+align-items | アイコン併用にも強い |
| 昔ながらの手法 | line-height を高さと同値に | 2行に折り返すと崩れるため非推奨 |
初心者がハマりがちなのが「text-align: center をつけたのにボックスが中央に来ない」パターン。text-alignが中央にするのはインライン内容(文字や画像)だけで、ブロック要素自体は動きません。
ブロック要素を横中央にしたいなら margin-inline: auto(左右marginのauto)か、ここまでに紹介したFlexbox/Gridを使いましょう。
「なぜか中央にならない」よくある失敗Top3
失敗1:親にposition: relativeを付け忘れている
absoluteの基準になるのは「positionがstatic以外の、いちばん近い祖先要素」です。
親に position: relative がないと、意図しない祖先(最悪の場合はページ全体)を基準に配置され、「とんでもない場所に飛んでいく」現象が起きます。absoluteが暴れたら、まず親のpositionを疑ってください。
現場のCSSバグでも定番中の定番です。
失敗2:transformの上書き(hover時に中央がズレる)
translate方式で中央寄せした要素に、ホバーで transform: scale(1.1) を追加すると——中央寄せが消えて要素が左上にワープします。transformはプロパティ1つなので、後から書いたscaleがtranslateを丸ごと上書きするためです。
/* NG: translateが消えてズレる */
.icon:hover {
transform: scale(1.1);
}
/* OK その1: 併記して上書きを防ぐ */
.icon:hover {
transform: translate(-50%, -50%) scale(1.1);
}
/* OK その2: 個別プロパティで分離する */
.icon {
translate: -50% -50%; /* transformとは独立して効く */
}
.icon:hover {
scale: 1.1;
}現在は translate・scale・rotate がそれぞれ独立したCSSプロパティとして使えるため、個別プロパティで書き分けるのがいちばん安全です。こうしたモダンCSSの進化はJavaScriptを不要にするモダンCSS新機能まとめでも詳しく紹介しています。
失敗3:%の基準要素を勘違いしている
「translate(-50%, -50%) の50%って何の50%?」——ここを曖昧にしたまま書くと、サイズが変わった瞬間に崩れます。
改めて整理すると、top/left/width等の%は基準となる親要素のサイズ、translateの%は自分自身のサイズが基準です。さらにmarginやpaddingの%は(上下方向でも)親の「幅」基準という罠もあります。
%を書くときは「これは誰の何%か」を毎回一言確認するクセをつけましょう。
まとめ|「並べるならGrid/Flex、重ねるならabsolute」
最後に要点を再掲します。
- 迷ったら親に
display:grid; place-items:center(最短・事故が少ない) - 複数の子を並べつつ中央 → Flexbox(justify-content+align-items)
- 要素を重ねて中央 → absolute+translate(サイズ不定OK)または inset:0+margin:auto(transform温存)
- 文字の横中央は text-align、縦中央はFlexboxで
- ズレたら「親のrelative忘れ・transform上書き・%の基準」の3つを疑う
中央寄せは「CSSの理解度がそのまま出る」テーマです。基準要素・ボックスモデル・レイアウトフローの理解が問われるので、面接のコーディングテストでも意外と聞かれます。
学習の進め方に迷っている人はHTML&CSSの最速学習法を、やりがちな遠回りはHTML/CSS学習でやってはいけないTop5をチェックしてみてください。
独学で「CSSがどうしても腹落ちしない」と感じるなら、スクールでメンターに質問しながら基礎を固めるのも、結果的には近道です。
よくある質問(FAQ)
Q. 結局、中央寄せはどの方法を使うのが正解ですか?
新規に書くなら親に display:grid; place-items:center が第一候補です。複数の子を並べたいならFlexbox、他の要素の上に重ねたいならabsolute+translateを選びます。「並べるか、重ねるか」で切り替えるのが判断基準です。
Q. position: absoluteで中央寄せしたら変な場所に飛びました。なぜですか?
ほぼ確実に、基準にしたい親要素に position: relative が付いていません。absoluteは「static以外のいちばん近い祖先」を基準に配置されるため、親に指定がないと祖先やページ全体基準で動いてしまいます。まず親のpositionを確認してください。
Q. transform: translate(-50%, -50%)の意味がわかりません。
top:50%; left:50% で子要素の「左上の角」を親の中央に置き、translateで「自分自身のサイズの半分」だけ左上に戻すことで、子の中心を親の中央に重ねています。
top/leftは親基準、translateは自分基準——%の基準が違う点だけ押さえれば難しくありません。こうした基礎の積み上げ方はHTML&CSSの学習方法で解説しています。
あわせて読みたい関連記事
JavaScriptを消せるモダンCSS新機能7選【2026】昨日まで JavaScript で書いていた「親要素の判定」「入力欄の自動リサイズ」「出現アニメ」「スクロール連動」——2026年のモダンCSSなら、その大半がCSSだけで完結します。実際に動く7つの新機能を、コピペできるコード付きで一気に紹介します。frontendlab.magicgifted.com
HTML&CSS最速学習法|独学3ステップで卒業【2026年版】HTML&CSSは「Progate3周→ドットインストール1周→模写1本」の3ステップで卒業。現役エンジニアが教材と卒業条件を表で解説し、Gridなどモダンレイアウトの押さえ方、検索+AI活用という2026年流の学習スタンスまで最短ルートがわかります。frontendlab.magicgifted.com
HTML/CSS学習でやってはいけないTop5|独学の遠回りを防ぐHTML/CSS独学の遠回りはパターンが決まっています。「成果物ゼロ」「Progate周回」「タグ暗記」などNGトップ5を現役エンジニアが理由つきで解説。Vercel等での無料公開やmodern-normalize等、2026年基準の正解ルートがわかります。frontendlab.magicgifted.com



