Webサイトを作っていると、要素(テキストやボタン、画像など)を中央に配置したい場面がよくありますよね。
特に「margin」を使った中央寄せは、とてもシンプルで使いやすい方法です。
でも、こんな疑問を持つ方も多いはずです:
margin: auto;
っていつ使えるの?- 横方向はうまくいくけど、縦方向はどうするの?
- そもそもflexboxやCSS Gridとどう違うの?
- インライン要素でも使えるの?
この記事では、初心者の方にもわかりやすいように、marginを使った中央寄せのやり方を解説し、さらに実例を交えながら、正しく使うコツを紹介します。
marginを使った中央寄せの基本

横方向(左右)の中央寄せ
CSSで横方向(左右)に中央寄せする場合、最もシンプルなのが margin: 0 auto;
を使う方法です。
これは要素の左右のマージン(余白)を自動計算(auto)にすることで、親要素の中央に配置するテクニックです。
ただし、これはブロック要素(display: block
)や、幅(width
)が指定されている要素にだけ効きます。幅が100%だと左右の余白が作れないので中央に寄りません。
基本的な例
HTML
<div class="container">
<div class="center-box">中央に寄るボックス</div>
</div>
CSS
.container {
width: 100%;
background: #f9f9f9;
padding: 20px;
}
.center-box {
width: 300px;
margin: 0 auto;
background: #e3f2fd;
padding: 20px;
text-align: center;
border-radius: 8px;
}
これで、親要素(container)内で左右の中央に配置されます。
marginとautoの仕組み
margin: 0 auto;
は以下のように解釈されます:
- 上下のmargin: 0
- 左右のmargin: auto(自動計算)
ブラウザは、親要素の幅から子要素の幅を引いた残りの幅を、左右に均等に分配します。これにより中央配置が実現されます。
よくある間違いとその解決法
パターン1:幅が指定されていない
/* ❌ 間違い:幅がないので中央寄せされない */
.box {
margin: 0 auto;
background: #ffcdd2;
}
/* ✅ 正解:幅を指定する */
.box {
width: 200px;
margin: 0 auto;
background: #ffcdd2;
}
パターン2:インライン要素に適用
/* ❌ 間違い:spanはインライン要素なので効かない */
span {
margin: 0 auto;
}
/* ✅ 正解:ブロック要素に変更 */
span {
display: inline-block;
width: 150px;
margin: 0 auto;
}
縦方向の中央寄せには使える?
通常のmarginでは縦方向は無理
実は、margin: auto
は横方向には便利ですが、縦方向には通常効きません。
これは、ブロック要素の高さがコンテンツに応じて自動的に決まるため、上下の余白を自動計算できないからです。
Flexboxと組み合わせると可能
ただし例外として、親要素が display: flex
の場合は、margin: auto
を上下左右どちらにも効かせることができます。
Flexboxを使った完全中央寄せの例
HTML
<div class="flex-container">
<div class="center-box">上下左右の中央</div>
</div>
CSS
.flex-container {
display: flex;
height: 400px;
background: #f5f5f5;
border: 2px solid #ddd;
border-radius: 8px;
}
.center-box {
width: 200px;
height: 100px;
margin: auto;
background: #81c784;
display: flex;
align-items: center;
justify-content: center;
border-radius: 4px;
color: white;
font-weight: bold;
}
このように、flexboxを使うと margin: auto
で上下左右完全に中央寄せが簡単に実現できます。
CSS Gridとの組み合わせ
CSS Gridでも同様に margin: auto
が有効です。
HTML
<div class="grid-container">
<div class="grid-item">Grid中央配置</div>
</div>
CSS
.grid-container {
display: grid;
height: 300px;
background: #fce4ec;
border-radius: 8px;
}
.grid-item {
width: 180px;
height: 80px;
margin: auto;
background: #e91e63;
color: white;
display: flex;
align-items: center;
justify-content: center;
border-radius: 4px;
}
実践的な使用例

ナビゲーションバーの中央配置
HTML
<nav class="navigation">
<ul class="nav-list">
<li><a href="#home">ホーム</a></li>
<li><a href="#about">概要</a></li>
<li><a href="#contact">お問い合わせ</a></li>
</ul>
</nav>
CSS
.navigation {
background: #2196f3;
padding: 10px 0;
}
.nav-list {
display: flex;
width: 400px;
margin: 0 auto;
list-style: none;
padding: 0;
gap: 30px;
}
.nav-list a {
color: white;
text-decoration: none;
padding: 10px 15px;
border-radius: 4px;
transition: background 0.3s;
}
.nav-list a:hover {
background: rgba(255, 255, 255, 0.2);
}
カードレイアウトの中央配置
HTML
<div class="card-container">
<div class="card">
<h3>商品タイトル</h3>
<p>商品の説明がここに入ります。</p>
<button>詳細を見る</button>
</div>
</div>
CSS
.card-container {
padding: 40px 20px;
background: #f8f9fa;
}
.card {
max-width: 350px;
margin: 0 auto;
background: white;
padding: 30px;
border-radius: 12px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
text-align: center;
}
.card h3 {
margin-top: 0;
color: #333;
}
.card button {
background: #4caf50;
color: white;
border: none;
padding: 10px 20px;
border-radius: 6px;
cursor: pointer;
margin-top: 15px;
}
marginを使うメリットと注意点
メリット
- 記述が少なく理解しやすい: シンプルな構文で実装できる
- 古いブラウザでも問題なく動く: IE11以前でも安定して動作
- レスポンシブ対応しやすい: 親要素の幅に応じて自動調整
- 計算が不要: パーセンテージや複雑な計算をしなくて済む
注意点
width
が必要: 幅がないと左右の余白を自動計算できない- 縦方向はflexboxやgridと組み合わせが必要: 単体では横方向のみ
- インライン要素には効かない:
display: block
やinline-block
が必要 - floatと相性が悪い: floatされた要素では期待通りに動かない
他の中央寄せ方法との比較
方法 | 横方向 | 縦方向 | ブラウザ対応 | 使いやすさ |
---|---|---|---|---|
margin: auto | ✅ | ❌(単体では) | 抜群 | 簡単 |
text-align: center | ✅(インライン要素のみ) | ❌ | 抜群 | 簡単 |
Flexbox | ✅ | ✅ | IE11以降 | 普通 |
CSS Grid | ✅ | ✅ | IE11以降 | 普通 |
Position + transform | ✅ | ✅ | IE9以降 | 複雑 |
よくあるトラブルと解決法

トラブル1:中央寄せされない
原因: 幅が指定されていない、またはインライン要素
解決法:
/* 幅を指定 */
.element {
width: 300px;
margin: 0 auto;
}
/* またはmax-widthを使用 */
.element {
max-width: 300px;
margin: 0 auto;
}
トラブル2:親要素からはみ出す
原因: 子要素の幅が親要素より大きい
解決法:
.parent {
width: 100%;
overflow-x: auto; /* スクロールバーを表示 */
}
.child {
min-width: 300px; /* 最小幅を保持 */
margin: 0 auto;
}
トラブル3:モバイルで表示が崩れる
原因: 固定幅がモバイル画面より大きい
解決法:
.responsive-center {
width: 90%;
max-width: 400px;
margin: 0 auto;
}
/* メディアクエリで調整 */
@media (max-width: 480px) {
.responsive-center {
width: 95%;
}
}
まとめ
- 横方向の中央寄せは
margin: 0 auto;
がシンプルで便利 - 縦方向の中央寄せにはflexboxと
margin: auto;
を組み合わせるとよい - 幅(
width
)を忘れないことがポイント - レスポンシブ対応には
max-width
も活用しよう
コメント