position
配置方法
要素の配置方法を指定します。top・left などと組み合わせて、要素をずらしたり、特定の位置に固定したりできます。
サンプルコード
実行結果
解説
position は、要素をどのように配置するかを決めるプロパティです。static 以外を指定すると、top・right・bottom・left で位置を調整できます。
absolute は、static 以外の position が指定された直近の祖先要素(多くは relative の親)の左上を基準に配置します。上の例では親の .card に relative を指定し、その左上を基準にバッジを置いています。基準になる親が見つからないときは、ページの左上が基準になります。
fixed は画面の左上、sticky は親要素の左上が基準です。どちらもスクロールしても決まった位置に表示されますが、fixed は要素の高さがなくなり、sticky はなくならない点が違います(下の応用編を参照)。
応用例・注意点
指定できる値
| 値 | 説明 |
|---|---|
static | 通常の配置(初期値。top などは効かない) |
relative | 本来の位置から上下左右にずらす。absolute の基準点にもなる |
absolute | static 以外の親要素の左上を基準に配置。親がなければページの左上。元の場所は詰められる |
fixed | 画面(ビューポート)の左上を基準に固定。要素の高さがなくなる |
sticky | 親要素の中で、スクロールして指定位置に来たら貼り付く。高さはなくならない |
スクロールしても上部に残るヘッダー
sticky を使うと、ヘッダーが画面上部に貼り付きます。
画面の下に固定するバナー
fixed で画面の下に固定します。本文の最後が隠れないよう、body の下に余白を空けておきます。
注意点
- 01absolute の基準になる親に position: relative を付け忘れると、思わぬ位置に表示されます。
- 02absolute や fixed の要素は通常の流れから外れるため、ほかの要素と重なることがあります。
- 03fixed の要素は高さがなくなるため、下の要素が上に詰まって隠れることがあります。固定ヘッダーなら body に padding-top を付けて、ヘッダーの高さ分を空けておきます。
- 04sticky は親要素の中でしか貼り付きません。親の高さが sticky の要素と同じだと、動く余地がなく効かないように見えます。
relative・absolute・fixed・sticky のくわしい使い方
relative:本来の位置からずらす/absolute の基準点を作る
relative は、コンテンツが本来表示される位置から上下左右に移動させます。もう1つの大事な役割が absolute の起点(基準点)を作る ことです。親要素に relative を指定すると、子要素は親要素を基準に位置を調整できるようになります。
例1:relative で本来の位置からずらす
点線の枠が本来の位置です。relative でずらしても、元の場所は空いたまま残ります。
コードと表示の対応
position: relative;本来の位置を基準にします。top: 20px; left: 40px;本来の位置から、上を20px・左を40px空けた位置(下と右)にずれます。
absolute:static 以外の親要素を起点に移動する
absolute は、static 以外(多くは relative)を指定した親要素の左上を起点に移動します。relative を指定した要素が見つからない場合は、ページの左上が基準 になります。
例2:relative の親の左上を基準にする
スライドと同じ指定です。.wrapper の左上から、左に100px・上に200px の位置に .item が置かれます。
コードと表示の対応
.wrapper { position: relative; }親要素が absolute の基準点になります。left: 100px; top: 200px;親の左端から100px、上端から200pxの位置に、子要素の左上がそろいます。
例3:relative の親がないとき
例2から .wrapper の position: relative を消すと、.item はページの左上を基準に配置され、.wrapper の外にはみ出します。
コードと表示の対応
.wrapper { margin: 60px 0 0 120px; }.wrapper には relative がないので、基準になりません。left: 0; top: 0;基準がページの左上になるため、.item は画面の左上の角に表示されます。
fixed:画面の決まった位置に固定する
fixed は、画面の決まった位置に要素を固定 させたいときに使います。基準は画面(ビューポート)の左上で、スクロールしても同じ場所に表示され続けます。サイト上部に固定されるヘッダーや、スマートフォンで画面の下に出続ける「LINE 友だち追加」のようなバナーがこれにあたります。
sticky:親要素の中で決まった位置に固定する
sticky は、親要素の中で決まった位置に要素を固定 させたいときに使います。relative(基準点)の設定は必要ありません。親要素の範囲内でだけ貼り付き、親要素が画面から出ていくと一緒に流れていきます。サイドバー(メニュー)や、追従する広告バナーなどに使うことが多いです。
例4:枠の中でスクロールしてみる
枠の中をスクロールすると、左のメニューが上に貼り付いたまま付いてきます。
コードと表示の対応
position: sticky; left: 0; top: 0;スクロールして上端に届いたところで貼り付きます。align-items: flex-start;Flexbox の中では子要素が親の高さまで伸びるため、伸びないようにしておきます。伸びると貼り付く余地がなくなり、sticky が効きません。
fixed と sticky の違い
| fixed | sticky | |
|---|---|---|
| 基準 | 画面の左上 | 親要素の左上 |
| 要素の高さ | なくなるため、下にある要素がその分だけ上に詰まって配置される | なくならない(元の場所を占めたまま) |
| relative の設定 | 不要 | 不要 |
| よく使う場面 | 固定ヘッダー、画面下の追従バナー | サイドバー、追従する広告バナー、表の見出し |
例5:fixed は高さがなくなる
fixed のヘッダーは高さがなくなるので、本文の1行目が上に詰まり、ヘッダーの下に潜り込んで隠れています。
コードと表示の対応
position: fixed;ヘッダーの高さがなくなるので、本文の1行目が上に詰まってヘッダーの下に隠れます。(対策)body { padding-top: ヘッダーの高さ; }fixed のヘッダーを使うときは、本文の上にヘッダーの高さ分の余白を空けておきます。sticky ならこの対策は要りません。