CSS
Webページの装飾やレイアウトをするための言語CSSの基礎知識について解説しています

CSS positionプロパティで要素を自由に配置する

要素は通常の表示フローにしたがって配置されます。例えば、ブロックボックスの性質を持つボックスは前の要素の下に左を基準に配置される、といったようにです。しかし、positionプロパティを使うことで、要素は通常の表示フローから切り離され、自由な位置に配置することができるようになります。

これにより、別の要素に重ねて表示させたり、画面の決まった位置(ビューポートや親要素)に要素を固定させたり、スクロールに合わせて追従させたりするなど、柔軟なレイアウト制御ができるようになります。

positionプロパティとは

positionプロパティは、要素が基準となる位置からどのように配置されるかを指定するためのプロパティです。

positionプロパティに指定できる主な値です。

意味
static規定値。通常の位置で配置されます。
relative通常の表示位置を基準に相対位置を指定できるようになります。
absolute親要素を基準に絶対位置を指定できるようになります。
fixedウィンドウを基準に絶対位置を指定できるようになります。
stickyスクロールに応じて要素の絶対位置指定できるようになります。

例えば、要素を通常の表示位置を基準にして相対的な位置に表示したいときには次のように指定します。

positionプロパティで通常の表示位置を基準に相対位置を指定
p {
    position: relative;
}

しかし、positionプロパティを指定するだけでは要素の位置を指定することができません。positionプロパティはあくまで、基準位置からの要素の配置方法を指定するためのプロパティです。要素を思うような位置に配置するには、positionプロパティと合わせて基準位置からの距離を指定するためのプロパティと一緒に使用します。

基準位置からの距離を指定するプロパティ

positionプロパティの値をstatic以外に指定すると、toprightbottomleftという基準位置からの距離を具体的な数値で指定するプロパティを使用できるようになります

positionプロパティを使った要素の位置変更には、まずpositionプロパティで配置方法を指定してから、この4つのプロパティで具体的な数値を指定するという流れになります。

top・left・right・bottomプロパティの使い方

top、bottom、left、rightの4つのプロパティは、基準位置からの距離を指定するプロパティです。各プロパティは次の値を指定をするためのものです。

プロパティ意味
top基準要素の上辺からの距離を指定
right基準要素の右辺からの距離を指定
bottom基準要素の下辺からの距離を指定
left基準要素の左辺からの距離を指定
基準からの距離を指定する4つのプロパティ
基準からの距離を指定する4つのプロパティ

4つ全てを指定する必要はなく、topとleft、bottomとright、あるいはtopのみなどの組み合わせで必要なものだけを指定していきます。単位には「px」や「%」で指定することができ、指定しない場合は「top: 0」と「left: 0」が適用されます。規定値は「auto」ですので、値をリセットしたい場合にはautoを指定します。

positionプロパティ配置方法を指定し、top・leftプロパティで位置を指定
p {
    position: relative;
    top: 10px;
    left: 10px;
}

positionプロパティの値

positionプロパティの値によってどのような配置指定ができるようになるのかを見ていきましょう。

値:static(規定値)

staticは規定値で、ブロックボックスの性質を持つ要素は通常のフロー(前の要素の下に配置され、特に指定がなければ親要素の横幅いっぱいに広がり、要素の前後には自動的に改行が入る)で配置されます。

値がstaticの場合、要素の位置はtop、left、right、bottomプロパティによって調整することができません。4つのプロパティは無効になっていますので、たとえこれらのプロパティに値を指定したとしても位置が変わることがありません。

次の例では、positionプロパティの値をstaticのままですので、topとleftプロパティを指定してもその値は無効で、要素の位置に変化はありません。

CSSを適用するHTMLコード
<div class="container">
    <p>要素1</p>
    <p class="position">要素2</p>
    <p>要素3</p>
</div>
positionプロパティの値をstaticのままtop・leftプロパティを指定
p {
    margin: 0;
    padding: 10px;
    text-align: center;
    background-color: #0064ff;
    color: #ffffff;
}
.position {
    position: static; /* 規定値なので未設定でも同じ */
    top: 10px; /* staticではこのプロパティは無効 */
    left: 10px; /* staticではこのプロパティは無効 */
    background-color: #80b2ff;
}
Note

positionプロパティの値をstaticのときには、z-indexプロパティも指定しても無効になります。z-indexプロパティは、要素の重なり順を決めるプロパティです。要素を移動させることで要素同士が重なった時にその重なりの前後(手前と後)をコントロールするためのプロパティです。staticではz-indexプロパティの値は0になっており、変更することができません。

値:relative

positionプロパティの値をrelativeにすると、通常の表示位置を基準とした相対的な位置に配置することができます。ただし、相対配置であっても、ドキュメントの通常のフローに留まる(通常の表示位置にサイズが保持される)ため、次の要素の配置に影響を与えます。自身の幅は指定がない限り、親要素の幅いっぱいに広がり、親の限界値を超えることはありません。

position: relativeでは通常の表示位置に対して相対的に配置
position: relativeでは通常の表示位置に対して相対的に配置

positionプロパティの値をrelativeにしただけでは、top、bottom、left、rightなどのプロパティを指定しなければstaticと同様に表示位置に変化はりません。値をrelativeにすることでtop、bottom、left、rightプロパティが有効になると考えたほうが良いでしょう。

次の例では、positionプロパティの値をrelativeに変更することで、topとleftプロパティの指定が有効になり、要素の位置が本来の表示位置から変更されました。

positionプロパティの値をrelativeに指定
.position {
    position: relative; /* このプロパティの値を変更 */
    top: 10px; /* relativeでこのプロパティが有効になる */
    left: 10px; /* relativeでこのプロパティが有効になる */
    background-color: #80b2ff;
}

値:absolute

positionプロパティの値をabsoluteにすると、親要素の表示位置を基準に絶対的な位置を指定することができます。

absoluteでは、通常の表示フローから外れ周りの要素に影響を受けません。親要素に余白が入っている場合でも、親要素の基準位置からの配置になります。absoluteを指定された要素は他の要素への影響もなくなります。他の要素はあたかもその要素が存在しないかのように振る舞い、レイアウトされます。また、自身の幅も親要素一杯まで広がらず、中身のコンテンツの幅となります。

注意しなければならない点は、基準となるのはpositionプロパティがstaticではないもっとの近い親(祖先)要素であるということです。
親要素のどれにもpositionプロパティにrelative、absolute、fixedが指定されていなければ、最上位の親要素であるbody要素までさかのぼって、body要素を基準として配置されることになります。

position: absoluteでは親要素の表示位置を基準に絶対的な位置に配置

次の例では、positionプロパティの値をabsoluteに変更することで、基準位置が変わります。親要素にはpositionプロパティを指定されたものはありませんのでこの要素に表示の基準は最上位の親要素であるbody要素になります。
親要素のdiv要素「container」に背景色をつけて、親要素との位置関係と基準位置をわかりやすくしています。

positionプロパティの値をabsoluteに指定
.container {
    padding: 20px;
    background-color: #eef2ff;
}
.position {
    position: absolute; /* このプロパティの値を変更 */
    top: 0px; /* このプロパティの値を変更 */
    left: 0px; /* このプロパティの値を変更 */
    background-color: #80b2ff;
}

top、leftプロパティで指定されたとおり、body要素の左上を基準に表示されます。

先ほども述べたように、absoluteに指定された要素の基準位置は、positionプロパティの値がstaticではない最も近い親要素となります。基準位置を変更するために、親要素であるdiv要素「container」にposition: relativeを追加します。

position: absoluteでの配置の基準となる親要素との関係
親要素のpositionプロパティの値をrelativeに指定
.container {
    position: relative; /* このプロパティを追加 */
    padding: 20px;
    background-color: #eef2ff;
}

基準となる親要素が、 body要素から div要素「container」に変わっているのがわかります。

値:fixed

positionプロパティの値をfixedにすると、要素をウィンドウを基準とした絶対的な位置に配置することができます。指定された要素は画面に固定されスクロールしても位置は変りません

position: fixedではウインドウを基準に位置に配置され、スクロールしない
CSSを適用するHTMLコード
<div class="fixed">要素1</div>
positionプロパティの値をfixedに指定
.fixed {
    position: fixed;
    top: 20px;
    left: 20px;
    padding: 10px;
    text-align: center;
    background-color: #0064ff;
    color: #ffffff;
}