positionプロパティを正しく理解しよう|デザイン再現の落とし穴と使い分け

positionプロパティを正しく理解しよう|デザイン再現の落とし穴と使い分け

デザインの再現性でよく悩むのがこの部分です。

「Figmaのデザイン通りにコーディングしたいのに、どうしてもうまくいかない…」
「見た目を合わせようとすると、position: absolute が増えてしまう…」

これは決して悪いことではありません。
むしろ「デザインを忠実に再現したい」という気持ちはとても大切です。
しかし、positionを多用しすぎると後々レイアウトが崩壊するという落とし穴があります。

この記事では、position プロパティの基本と使いどころ、そして「どうすれば“崩れないコーディング”になるのか」を具体的に解説します。

Contents

positionプロパティとは?

position はCSSの中でも特に配置をコントロールするためのプロパティです。
デザイン通りに見せたいときには欠かせない存在ですが、実はHTMLの構造理解とセットで使わないと危険なプロパティでもあります。

値は主に以下の5種類です。

意味特徴
static初期値。文書の流れどおりに配置特別な位置指定なし
relative元の位置から相対的にずらす元のスペースは保持される
absolute親要素(position指定あり)を基準に配置文書の流れから外れる
fixedビューポート全体を基準に固定スクロールしても動かない
stickyスクロール位置に応じて固定/解除されるヘッダーなどに便利

position: static(デフォルト)

HTMLの要素は、特に指定をしない限り position: static; で配置されています。
つまり、HTMLで書かれた順番どおりに上から下へ、左から右へ並びます。下記は標準仕様です。

div {
  position: static;
}

いわゆる「文書の流れ(normal flow)」に沿った自然な配置です。
この仕組みを前提にしているのが、flexgrid です。
つまり、現代のレイアウトでは、positionを使わずに整える方が推奨されるのです。

position: relative(相対配置)

relativeは「もとの位置を基準に少しだけ動かす」指定です。

.box {
  position: relative;
  top: 10px;
  left: 20px;
}

ポイントは、見た目だけ動くけれど、元のスペースは残るということ。
空間的には動かず、「浮いて見える」イメージです。

よく使われる場面は「absolute要素の基準を作る」ときです。
親要素に position: relative; を指定しておくと、その中の子要素を position: absolute; で配置しやすくなります。

position: absolute(絶対配置)

absoluteは「親要素を基準に、指定した位置に固定」する方法です。

.parent {
  position: relative;
}
.child {
  position: absolute;
  top: 0;
  right: 0;
}

このように、親要素にrelativeがついていないと基準を見失う点に注意。
親がposition: static;のままだと、body全体が基準になります。

absoluteはバッジ・アイコン・装飾・背景的なオブジェクトに向いています。
ただし、レイアウト全体をabsoluteで組むのは非推奨。ブラウザ幅が変わると、ズレや重なりが発生します。

レスポンシブ対応の際は、絶対単位のpxより相対単位の%を使うのが一般的です。

position: fixed(画面固定)

position: fixed; は、画面(ビューポート)を基準に配置します。
スクロールしても動かないため、上へ戻るボタンや固定ヘッダーに便利です。

#pagetop {
  position: fixed;
  right: 20px;
  bottom: 20px;
  width:100%;
}

画面の右下にずっと表示される、あの「▲」ボタンが典型的な例です。
ただし、スマホ表示では被ってしまうこともあるため、メディアクエリで非表示にするなどの工夫が必要です。

また、position プロパティはwidth指定がなくなるので、あらためて指定を行う必要があります。

position: sticky(スクロール連動)

stickyは、「特定位置までスクロールすると固定される」動きを作れます。

header {
  position: sticky;
  top: 0;
}

サイトのグローバルナビや見出しをピタッと止めるときに使います。
近年のUIではこのstickyがよく使われており、JavaScriptを使わずに簡単な固定ヘッダーを実現できます。

なぜabsoluteに頼りすぎると危険なのか?

実作業では、デザインを忠実に再現しようとするあまり、position: absolute; を多用するケースが非常に多いです。

「この文字、ちょっと右上だから top:30px; left:80px; にしよう」
「画像も重ねたいから absolute で z-index:2 で…」

これを繰り返すと、一見きれいに見えますが、画面サイズを変えた瞬間に全ての位置がずれてしまいます。

absoluteは「親要素のサイズが変わらない前提」で動くため、レスポンシブデザインや動的なコンテンツ(CMS)との相性が最悪です。

代わりに使うべきはflexとgrid

レイアウトを組むときは、positionではなくflex(フレックスボックス)grid(グリッド) を使うのが基本です。

flexで中央揃えをする場合

.container {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 300px;
}

これだけで上下左右の中央揃えができます。absolute+transformよりもシンプルで保守性が高いです。

gridで自由に配置する場合

.wrapper {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 20px;
}

カードレイアウト、ギャラリー、メニューなどを等間隔で並べられます。

よくある誤用と正しい書き方

目的よくある誤り理想の実装
バナーの文字を中央に置きたいabsolute; top:50%; left:50%; transform:translate(-50%,-50%)display:flex; justify-content:center; align-items:center;
アイコンを右上に固定全体をabsoluteにして重ねる親にrelative、子にabsolute
コンテンツを等間隔に並べたいtopleftを数値指定gridflexで制御
スクロール固定ヘッダーJSで無理に制御position: sticky; top:0;

デザインとコーディングの「考え方のズレ」を減らす

多くのデザイナーが、“デザインの見た目を再現する”ことに集中しすぎて、HTMLの構造を軽視してしまう傾向があります。
しかし、Webサイトは静止画ではなく「情報を構造的に伝える」媒体です。

デザインを再現するときは、以下の視点を意識してみてください。

  • その要素はどういうグループに属しているか?
  • どの要素が基準になっているか?
  • 固定値ではなく、親要素に合わせて動く配置にできないか?

これを意識するだけで、コードが整理され、後の修正もスムーズになります。

現場でも重視される「構造現場でも重視される「構造的レイアウト」

実務でも、「見た目をabsoluteで合わせる」コーダーより、「構造とデザインを両立させる」コーダーが圧倒的に評価されます。

たとえば、Webデザインカンプ通りにpx単位で合わせるのではなく、余白・比率・テキスト位置を柔軟に対応できる構成を考えられる人。それがプロのコーディング思考です。

positionはレイアウトの最終手段

  • position は便利だが、使いどころを誤ると崩壊する
  • relative は基準づくり、absolute は装飾、fixedsticky はUI向け
  • レイアウトは flexgrid で構築するのが基本
  • ザインは「固定値」ではなく「関係性」で再現する

デザインとコーディングの「ちょうどいいバランス」を見つけられるようになると、現場でも強く信頼される存在になれます。

ただし!z-indexプロパティが使えるのはpositon

ここでひとつ注意しておきたいポイントがあります。
それは、z-index プロパティが使えるのは、position が指定されている要素だけ ということです。

つまり、position: static;(デフォルトの状態)のままでは、z-index をいくら指定しても重なり順は変わりません。

/* NG例:z-indexが効かない */
.box {
  z-index: 10; /* positionがstaticなので無効 */
}

/* OK例:position指定が必要 */
.box {
  position: relative; /* absolute, fixed, stickyでもOK */
  z-index: 10;
}

z-index は、要素を「どの順番で前後に重ねるか」を制御するプロパティですが、そのためには、要素が配置コンテキスト(stacking context)を持っている必要があります。そのコンテキストを作るのが position プロパティなんです。

position: absoluteで中央に配置する方法

absolute を使うと、指定した親要素を基準に「上下左右の座標」を自由に指定できます。
たとえば、画面の中央に文字やボタンを配置したい場合、次のように書きます。

<div class="parent">
  <div class="child">中央に配置</div>
</div>
.parent {
  position: relative;  /* 子要素の基準を作る */
  height: 400px;
  background: #f0f0f0;
}

.child {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  background: #005fcc;
  color: #fff;
  padding: 1em 2em;
  border-radius: 8px;
}
  • top: 50%; left: 50%; で要素の左上が中央に移動します
  • transform: translate(-50%, -50%); で要素自身の幅・高さ分を引いて真ん中に調整します
  • 親要素に position: relative; を指定し忘れると、body全体を基準にずれてしまう

よくあるトラブル例

「z-indexを指定しても前に出てこない…」
→ 原因は、親要素が position: static のまま。

この場合、親要素に position: relative; を追加することで解決できます。

  • URLをコピーしました!
Contents