バナーやモーダル、ローディング画面などを中央に配置したいとき、よく使われるのが position: absolute
。
ただ、これを使って「中央に寄せたい」と思っても、
- 横方向だけ中央になった
- 縦の位置がずれている
- 思ったところに配置されない
など、思ったとおりにいかないことが多いですよね。
この記事では、CSSの position: absolute
を使って要素を横・縦、そして画面のど真ん中に配置する方法を、初心者にもわかりやすく解説します。
position: absoluteの基本を理解しよう

position: absoluteとは何か
position: absolute
は、親要素を基準にして、自由に位置を指定できるCSSのプロパティです。
通常の要素配置ルールから外れて、好きな場所に要素を配置できるのが特徴です。
位置指定の仕組み
position: absoluteでは、以下のプロパティで位置を決めます:
top
:上からの距離left
:左からの距離right
:右からの距離bottom
:下からの距離
基準となる親要素
重要なポイントは、親要素が position: relative
を持っているかどうかです。
- 親要素に
position: relative
がある場合:その親要素を基準に配置 - 親要素に
position: relative
がない場合:ブラウザ全体(body)を基準に配置
基本的なコード例
/* 親要素:配置の基準になる */
.container {
position: relative;
width: 400px;
height: 300px;
border: 1px solid #ccc;
}
/* 子要素:自由に位置を指定できる */
.child {
position: absolute;
top: 20px;
left: 30px;
width: 100px;
height: 50px;
background-color: #007bff;
}
この例では、.container
の左上から 20px
下、30px
右に青い要素が配置されます。
なぜ中央配置がむずかしいのか
「じゃあ left: 50%
にすれば中央になるんでしょ?」と思うかもしれませんが、実はそうではありません。
left: 50%
は「要素の左端を親要素の50%の位置に置く」という意味なので、要素の中央ではなく左端が真ん中に来てしまいます。
基本を理解したら、いよいよ中央に配置してみましょう。
横方向だけ中央に配置する方法
横中央配置の考え方
横方向の中央配置は、2段階の処理で実現します:
left: 50%
:要素の左端を親要素の中央に配置transform: translateX(-50%)
:要素を自分の幅の半分だけ左にずらす
この組み合わせで、要素の中心が親要素の中央に来ます。
横中央配置のコード例
/* 親要素 */
.parent {
position: relative;
width: 500px;
height: 200px;
border: 2px solid #333;
margin: 20px auto;
}
/* 横中央に配置される子要素 */
.child-horizontal {
position: absolute;
left: 50%;
transform: translateX(-50%);
/* 要素のサイズとスタイル */
width: 150px;
height: 50px;
background-color: #28a745;
color: white;
text-align: center;
line-height: 50px;
}
HTMLの書き方
<div class="parent">
<div class="child-horizontal">横中央配置</div>
</div>
なぜtransformを使うのか
left: 50%
だけ:要素の左端が中央に来る(ずれる)transform: translateX(-50%)
を追加:要素の中心が中央に来る(正しい)
transformを使う理由は、要素のサイズに関係なく中央に配置できるからです。
実際の使用例
この方法は、以下のような場面でよく使われます:
- ナビゲーションメニューのボタン
- ページタイトルやロゴ
- フォームのサブミットボタン
- 画像やアイコンの横中央揃え
次は縦横両方を中央に配置する方法を紹介します。
横・縦 両方の中央に配置する方法
縦横中央配置の考え方
縦横の中央配置も、横中央と同じ考え方です:
left: 50%
+top: 50%
:要素の左上角を親要素の中央に配置transform: translate(-50%, -50%)
:要素を自分のサイズの半分だけ左上にずらす
これで、要素の中心が親要素の中央にピッタリ合います。
縦横中央配置のコード例
/* 親要素 */
.parent {
position: relative;
width: 500px;
height: 300px;
border: 2px solid #333;
margin: 20px auto;
background-color: #f8f9fa;
}
/* 縦横中央に配置される子要素 */
.child-center {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
/* 要素のサイズとスタイル */
width: 200px;
height: 100px;
background-color: #dc3545;
color: white;
text-align: center;
line-height: 100px;
border-radius: 8px;
}
HTMLの書き方
<div class="parent">
<div class="child-center">縦横中央配置</div>
</div>
レスポンシブ対応も自動
この方法の優れた点は、親要素のサイズが変わっても自動で中央に保たれることです。
/* レスポンシブ対応の例 */
.responsive-parent {
position: relative;
width: 100%;
height: 50vh; /* ビューポートの50% */
border: 2px solid #007bff;
}
.responsive-child {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 80%;
max-width: 300px;
height: 60px;
background-color: #007bff;
color: white;
text-align: center;
line-height: 60px;
}
実際の使用例
縦横中央配置は、以下のような用途で頻繁に使われます:
- モーダルウィンドウ(ポップアップ)
- ローディング画面
- エラーメッセージの表示
- 画像のオーバーレイテキスト
- カード要素の内容
これだけで、どんなサイズの要素でも簡単に中央寄せできます。最後に注意点と便利なテクニックを紹介します。
注意点と便利なテクニック

よくあるミスと対処法
親要素にposition: relativeを忘れる
問題:
/* ❌ 間違った例 */
.parent {
/* position: relative; がない */
width: 300px;
height: 200px;
}
.child {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
この場合、子要素はブラウザ全体を基準に配置されてしまいます。
解決策:
/* ✅ 正しい例 */
.parent {
position: relative; /* これを忘れずに */
width: 300px;
height: 200px;
}
transformの重複による問題
問題: 他のCSS効果で既に transform
を使っている場合、上書きされてしまいます。
/* ❌ 問題のある例 */
.child {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%); /* これが... */
transform: rotate(45deg); /* これで上書きされる */
}
解決策:
/* ✅ 正しい例 */
.child {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) rotate(45deg); /* 一つにまとめる */
}
便利なテクニック
画面全体の中央に固定配置
.modal-overlay {
position: fixed; /* absoluteではなくfixed */
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 400px;
height: 300px;
background-color: white;
border: 1px solid #ccc;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
z-index: 1000;
}
position: fixed
を使うと、スクロールしても常に画面の中央に表示されます。
複数要素の中央配置
.parent {
position: relative;
width: 400px;
height: 300px;
}
.child-1 {
position: absolute;
top: 30%;
left: 50%;
transform: translate(-50%, -50%);
}
.child-2 {
position: absolute;
top: 70%;
left: 50%;
transform: translate(-50%, -50%);
}
top
の値を変えることで、横は中央、縦は任意の位置に配置できます。
アニメーション対応
.animated-center {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
/* アニメーション効果 */
transition: all 0.3s ease;
opacity: 0;
}
.animated-center.show {
opacity: 1;
transform: translate(-50%, -50%) scale(1.05);
}
パフォーマンスの考慮
transform
はGPUを使った高速な描画が可能top/left
の値を変更 するよりtransform
の方が滑らか- 複雑なレイアウト では FlexboxやGrid も検討する
他の中央配置方法との比較
方法 | メリット | デメリット |
---|---|---|
position: absolute | 簡単、確実 | 他要素に影響しない配置 |
Flexbox | レスポンシブ、複数要素対応 | 親要素全体の構造が変わる |
CSS Grid | 複雑なレイアウト対応 | 学習コストが高い |
margin: auto | シンプル | 縦中央は困難 |
これを覚えておけば、わざわざFlexboxやGridを使わなくても、position: absolute
だけで中央配置がすぐできます。
まとめ:position: absoluteで確実に中央配置しよう
CSSの position: absolute
を使った中央寄せは、以下のパターンを覚えるだけで完璧です:
基本パターン
横方向の中央配置:
.child {
position: absolute;
left: 50%;
transform: translateX(-50%);
}
縦横両方の中央配置:
.child {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
重要なポイント
- 親要素には必ず
position: relative
を設定 %
を使っているので、レスポンシブ対応が自動- 要素のサイズに関係なく中央に配置される
こんな場面で活用しよう
- モーダルウィンドウやポップアップ
- ローディング画面やスピナー
- 画像上のオーバーレイテキスト
- エラーメッセージの表示
- ナビゲーションボタンの配置
コメント