positionで中央配置する方法|translateとplace-selfの違いと使い分け
CSSで要素を「上下左右中央」に配置したい場面は非常に多くあります。
これまで定番だったのは position: absolute と translate を組み合わせる方法ですが、最近ではよりシンプルに書ける新しい書き方も登場しています。
この記事では、
- 従来の中央配置(translate)
- 最新の中央配置(place-self + inset)
- それぞれの違いと使い分け
を、実装コード付きで解説します。
中央配置の基本:position:absoluteの考え方
要素を上下左右中央に配置する場合、よく使われるのが position: absolute です。
これは「親要素を基準にして自由な位置に配置する」ためのプロパティで、中央配置では以下のような考え方になります。
- 親要素:
position: relative - 子要素:
position: absolute - 親を基準に位置を調整する
この基本を押さえたうえで、具体的な中央配置の方法を見ていきます。
従来の方法:translateで中央配置
コード例
・HTML
|
1 2 3 |
<div class="parent"> <div class="child"></div> </div> |
・CSS
|
1 2 3 4 5 6 7 8 9 10 |
.parent { position: relative; } .child { position: absolute; top: 50%; left: 50%; translate: -50% -50%; } |
・CodePen デモ
See the Pen [css] positionで中央配置【translate】 by mkl may (@mkl-may) on CodePen.
仕組みの解説
この方法は以下の手順で中央配置を実現しています。
top: 50%; left: 50%;で要素の左上を中央に移動translate: -50% -50%;で要素自身の幅・高さの50%分だけ戻す
これにより、要素の中心が親要素の中央に配置されます。
別アプローチ:inset + place-selfで中央配置
※この方法は、もともとGridやFlexレイアウト向けのプロパティですが、近年のブラウザでは <code>position: absolute</code> の要素に対しても機能するケースがあります。
ただし、ブラウザのバージョンによって挙動が異なるため、使用する際は動作確認が必要です。
例として、Chromeでは比較的新しいバージョンでは動作しますが、古いバージョンでは機能しないことを確認しています。
コード例
・HTML
|
1 2 3 |
<div class="parent"> <div class="child"></div> </div> |
・CSS
|
1 2 3 4 5 6 7 8 9 |
.parent { position: relative; } .child { position: absolute; inset: 0; place-self: center; } |
・CodePen デモ
See the Pen [css] positionで中央配置【place-self + inset】 by mkl may (@mkl-may) on CodePen.
仕組みの解説
この方法は次のように動作します。
inset: 0;→top / right / bottom / leftをすべて0に指定する省略形place-self: center;→ 自身を中央に配置
これにより、translateを使わずに中央配置が可能になります。
比較的新しい書き方のため、環境によっては注意が必要です。
使い分けのポイント
基本的な使い分けは以下の通りです。
translateを使う方法がおすすめなケース
- 古いブラウザ対応が必要
- 既存コードとの統一を重視
place-selfを使う方法がおすすめなケース
- 新規開発
- コードをシンプルにしたい
- モダンCSSを積極的に使いたい
迷った場合は「プロジェクトのブラウザ対応方針」で判断するのが安心です。
補足:FlexboxやGridで中央配置する方法
中央配置は position を使わなくても実現できます。
Flexboxの場合
|
1 2 3 4 5 |
.parent { display: flex; justify-content: center; align-items: center; } |
Gridの場合
|
1 2 3 4 |
.parent { display: grid; place-items: center; } |
レイアウト目的であれば、これらの方が自然な場合も多いため、用途に応じて使い分けましょう。
![MARKLEAPS[マークリープス]](https://markleaps.com/blog/wp-content/themes/mkl/images/00_logo.png)