「CSSで中央寄せしたいのに、なぜかズレる…」「text-align: centerを書いたのに動かない!」
Web制作をしていると、誰もが一度は経験するこの悩み。中央寄せは基本中の基本なのに、なぜかうまくいかないことがありますよね。
実は、CSSの中央寄せには「要素の種類」や「親要素との関係」によって、使うべき方法が変わってくるんです。この違いを理解していないと、何度試しても中央寄せできません。
この記事では、中央寄せができない原因を失敗パターン別に解説し、それぞれの解決方法を具体的なコード例とともに紹介していきます。
まず理解すべき:ブロック要素とインライン要素の違い

中央寄せの問題を解決するには、HTMLの「ブロック要素」と「インライン要素」の違いを理解することが欠かせません。
ブロック要素とは
特徴:
- 横幅いっぱいに広がる
- 前後に改行が入る
- 幅(width)や高さ(height)を指定できる
代表的なタグ:
<div><p><h1>~<h6><section><article>
<p>これは段落です</p>
<p>別の段落です</p>
上記のように、p要素は縦に並びます。各p要素は親要素の横幅いっぱいに広がっています。
インライン要素とは
特徴:
- 内容の幅だけを占める
- 前後に改行が入らない
- 幅や高さを指定できない
代表的なタグ:
<span><a><strong><img>
<p>これは<span>インライン要素</span>を含む文章です。</p>
spanは文章の一部として表示され、前後に改行は入りません。
この違いを理解していないと:
- ブロック要素に
text-align: centerを指定しても効かない - インライン要素に
margin: 0 autoを指定しても効かない
といった問題が発生します。
よくある失敗パターン1:text-align: centerが効かない
原因1:ブロック要素自体に指定している
間違った例:
div {
text-align: center; /* これは効かない */
background-color: lightblue;
}
<div>このdivは中央に寄らない</div>
なぜ効かないのか:
text-align: center は、ブロック要素の中にあるインライン要素(テキストや画像など)を中央寄せするプロパティです。ブロック要素自体を中央に寄せることはできません。
上記の例では、divというブロック要素は横幅いっぱいに広がっているため、そもそも「中央に寄せる余白」がありません。
正しい使い方:
divの中にあるテキストを中央寄せしたい場合は、これで正解です。
div {
text-align: center; /* div内のテキストが中央寄せされる */
background-color: lightblue;
}
<div>このテキストは中央寄せされる</div>
原因2:インライン要素自体に指定している
間違った例:
span {
text-align: center; /* インライン要素に指定しても効かない */
}
<div>
<span>このspanは中央に寄らない</span>
</div>
なぜ効かないのか:
text-align: center はブロック要素に指定して、その中のインライン要素を中央寄せするものです。インライン要素自体に指定しても機能しません。
解決方法:
親要素(ブロック要素)に指定します。
div {
text-align: center; /* 親要素に指定 */
}
<div>
<span>このspanは中央に寄る</span>
</div>
原因3:display: flexの中で使っている
間違った例:
.container {
display: flex;
text-align: center; /* flexの中では効かない */
}
なぜ効かないのか:
display: flex が設定された要素の中では、text-align は機能しません。Flexboxには独自の配置方法があるためです。
解決方法1:Flexboxの配置プロパティを使う
.container {
display: flex;
justify-content: center; /* 横方向の中央寄せ */
}
解決方法2:display: blockに戻す
.container {
display: flex;
display: block; /* 上書きしてflexを解除 */
text-align: center;
}
ただし、これではflexの利点が失われるので、通常は解決方法1を使います。
よくある失敗パターン2:margin: 0 autoが効かない
原因1:widthが指定されていない
間違った例:
div {
margin: 0 auto; /* widthがないので効かない */
background-color: pink;
}
<div>このdivは中央に寄らない</div>
なぜ効かないのか:
ブロック要素は、幅を指定しないと親要素の横幅100%になります。すでに横幅いっぱいなので、左右に余白を作ることができず、中央寄せになりません。
背景色を付けてみると、横幅いっぱいに広がっていることがわかります。
解決方法:
幅を指定します。
div {
width: 500px; /* または 50%など */
margin: 0 auto;
background-color: pink;
}
<div>このdivは中央に寄る</div>
原因2:インライン要素に使っている
間違った例:
span {
width: 200px;
margin: 0 auto; /* インライン要素には効かない */
background-color: yellow;
}
<div>
<span>このspanは中央に寄らない</span>
</div>
なぜ効かないのか:
margin: 0 auto はブロック要素にしか効きません。インライン要素にはwidthを指定しても無効です。
解決方法1:display: blockにする
span {
display: block; /* ブロック要素に変換 */
width: 200px;
margin: 0 auto;
background-color: yellow;
}
解決方法2:親要素にtext-align: centerを使う
div {
text-align: center; /* 親要素に指定 */
}
span {
background-color: yellow;
}
<div>
<span>このspanは中央に寄る</span>
</div>
原因3:親要素がインライン要素になっている
間違った例:
<a href="#">
<div class="box">このdivは中央に寄らない</div>
</a>
.box {
width: 300px;
margin: 0 auto;
}
なぜ効かないのか:
親要素の <a> タグはインライン要素です。margin: 0 auto は「親要素を基準に中央寄せ」しますが、親がインライン要素だとwidthが効かないため、中央寄せできません。
解決方法:
親要素をブロック要素にします。
a {
display: block; /* 親をブロック要素に */
}
.box {
width: 300px;
margin: 0 auto;
}
原因4:floatが設定されている
間違った例:
div {
width: 300px;
margin: 0 auto;
float: right; /* floatがあると効かない */
}
なぜ効かないのか:
float を設定すると、要素が通常のドキュメントフローから外れます。そのため、margin: 0 auto による中央寄せの計算が機能しなくなります。
解決方法:
floatを削除します。
div {
width: 300px;
margin: 0 auto;
/* float: right; を削除 */
}
レイアウトでfloatが必要な場合は、代わりにFlexboxやGridを使うことを検討しましょう。
よくある失敗パターン3:画像が中央寄せできない
失敗例1:画像にmargin: autoを直接指定
間違った例:
img {
margin: 0 auto; /* これだけでは効かない */
}
<div>
<img src="photo.jpg" alt="写真">
</div>
なぜ効かないのか:
<img> タグはインライン要素です。インライン要素には margin: 0 auto が効きません。
解決方法1:display: blockにする
img {
display: block; /* ブロック要素に変換 */
margin: 0 auto;
}
解決方法2:親要素にtext-align: centerを使う
div {
text-align: center; /* 親要素に指定 */
}
<div>
<img src="photo.jpg" alt="写真">
</div>
この方法の方がシンプルで、よく使われます。
失敗例2:画像にtext-align: centerを直接指定
間違った例:
img {
text-align: center; /* 画像自体に指定しても効かない */
}
解決方法:
画像の親要素に指定します。
div {
text-align: center;
}
確実に中央寄せする方法【推奨】
従来の方法で苦戦している場合、モダンな方法を使うとシンプルに解決できます。
方法1:Flexboxを使う【最もおすすめ】
Flexboxを使えば、要素の種類を気にせず中央寄せできます。
横方向の中央寄せ:
.container {
display: flex;
justify-content: center; /* 横方向に中央寄せ */
}
<div class="container">
<div>中央に寄る</div>
</div>
縦方向の中央寄せ:
.container {
display: flex;
align-items: center; /* 縦方向に中央寄せ */
height: 300px; /* 高さが必要 */
}
上下左右の完全な中央寄せ:
.container {
display: flex;
justify-content: center; /* 横方向 */
align-items: center; /* 縦方向 */
height: 400px;
}
<div class="container">
<div>完全に中央</div>
</div>
Flexboxの利点:
- ブロック要素でもインライン要素でも使える
- widthを指定しなくても動く
- 縦横両方の中央寄せが簡単
方法2:CSS Gridを使う
Gridでも同様に中央寄せできます。
.container {
display: grid;
place-items: center; /* 上下左右中央 */
height: 400px;
}
<div class="container">
<div>完全に中央</div>
</div>
place-items: center は align-items: center と justify-items: center を同時に指定する便利なプロパティです。
方法3:positionを使う
絶対配置を使った中央寄せです。
.container {
position: relative;
height: 400px;
}
.center {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
<div class="container">
<div class="center">完全に中央</div>
</div>
仕組み:
top: 50%とleft: 50%で、要素の左上を中央に配置transform: translate(-50%, -50%)で、要素自身のサイズの半分だけ左上に移動- 結果として、要素の中心が中央に来る
注意点:
親要素に position: relative を忘れずに指定してください。
トラブルシューティング:それでも中央寄せできない時
1. 背景色を付けて確認する
要素がどこまで広がっているか、背景色を付けて確認しましょう。
div {
background-color: lightblue; /* 要素の範囲を可視化 */
margin: 0 auto;
}
横幅いっぱいに広がっていたら、widthが指定されていない可能性があります。
2. ブラウザの開発者ツールで確認する
ブラウザの開発者ツール(F12キー)で要素を選択すると、margin、padding、widthなどが視覚的に確認できます。
- 水色の部分:コンテンツ
- 緑色の部分:padding
- オレンジ色の部分:margin
marginが左右均等になっているか確認しましょう。
3. 他のCSSに上書きされていないか確認
優先順位の高いCSSが、意図したスタイルを上書きしている可能性があります。
/* 優先順位:低 */
.container div {
margin: 0 auto;
}
/* 優先順位:高(こちらが適用される) */
div#special {
margin-left: 0; /* autoが上書きされる */
}
開発者ツールで、どのCSSが適用されているか確認できます。
4. HTMLの空白文字を確認
HTMLに予期しない空白やスペースがあると、レイアウトがズレることがあります。
<!-- 空白がある -->
<div>
<img src="photo.jpg">
</div>
<!-- 空白を削除 -->
<div><img src="photo.jpg"></div>
画像の前後に空白があると、微妙にズレて見えることがあります。
よくある質問
Q1. text-alignとmargin: autoはどう使い分ける?
text-align: center
- 使う場面: テキストや画像など、インライン要素を中央寄せしたい時
- 指定する場所: 親要素(ブロック要素)
margin: 0 auto
- 使う場面: div、sectionなど、ブロック要素自体を中央寄せしたい時
- 指定する場所: 中央寄せしたい要素自身
- 条件: widthが指定されていること
Q2. 縦方向の中央寄せはどうする?
方法1:Flexboxを使う(推奨)
.container {
display: flex;
align-items: center;
height: 300px;
}
方法2:line-heightを使う(1行のテキストのみ)
div {
height: 100px;
line-height: 100px; /* heightと同じ値 */
}
方法3:positionを使う
.container {
position: relative;
height: 300px;
}
.center {
position: absolute;
top: 50%;
transform: translateY(-50%);
}
Q3. inline-blockの要素はどうする?
display: inline-block の要素は、インライン要素と同じように扱います。
/* 親要素に指定 */
.container {
text-align: center;
}
/* 子要素 */
.box {
display: inline-block;
width: 200px;
}
margin: 0 auto は効かないので、text-align: center を使います。
Q4. 複数の要素を横並びで中央寄せするには?
Flexboxを使う方法:
.container {
display: flex;
justify-content: center;
gap: 20px; /* 要素間の間隔 */
}
<div class="container">
<div>アイテム1</div>
<div>アイテム2</div>
<div>アイテム3</div>
</div>
全ての子要素が中央に配置され、横並びになります。
まとめ
CSSで中央寄せできない原因と解決方法を、パターン別に解説してきました。
重要なポイント:
- text-align: center
- ブロック要素の中にあるインライン要素を中央寄せ
- 親要素に指定する
- ブロック要素自体は中央寄せできない
- margin: 0 auto
- ブロック要素自体を中央寄せ
- 中央寄せしたい要素に直接指定
- 必ずwidthを指定する
- インライン要素には効かない
- Flexbox(推奨)
- 要素の種類を気にせず使える
- 縦横両方の中央寄せが簡単
- モダンなWebサイトではこれを使うのが主流
トラブルシューティングの手順:
- ブロック要素かインライン要素かを確認
- widthが指定されているか確認
- 親要素と子要素のどちらに指定すべきか確認
- 背景色を付けて要素の範囲を確認
- 開発者ツールでCSSの適用状況を確認
最初は複雑に感じるかもしれませんが、「要素の種類」と「どこに指定するか」を意識すれば、中央寄せはすぐにマスターできますよ。
迷ったら、まずFlexboxを試してみましょう。ほとんどの場合、これで解決します!


コメント