【CSS】要素の配置を操りたい時に読んでほしい！positionについて

# はじめに
こんにちは、エンジニア2年目の嶋田です。
まずは、この記事を開いていただきありがとうございます！

CSSを使って要素を配置するとき、どちらのポジショニング方法を使えばいいのか迷ったことはありませんか？
CSSのpositionプロパティを使って、要素の位置を自由に指定することができ、実現できる事が増えます！
この記事では、それぞれの使い方と使用例を解説します。
私自身、absoluteとrelativeがわからなくなってしまうことがあるので備忘録としてアウトプットすることにしました！
なるべくわかりやすくまとめるので、よかったら最後までお付き合いください😄

# 目次
- [CSSのpositionプロパティとは](#cssのpositionプロパティとは)
    - [positionプロパティの基本概念](#positionプロパティの基本概念)
    - [positionとセットで使うtop,bottom,left,right](#positionとセットで使うtop,bottom,left,right)
- [staticの特徴](#staticの特徴)
- [relativeの特徴](#relativeの特徴)
    - [relativeの使い方](#relativeの使い方)
- [absoluteの特徴](#absoluteの特徴)
    - [absoluteの使い方](#absoluteの使い方)
- [fixedの特徴](#fixedの特徴)
    - [fixedの使い方](#fixedの使い方)
- [最後に](#最後に)

# CSSのpositionプロパティとは

CSSのpositionプロパティは、要素を配置する際に使用される重要なプロパティの1つです。
このプロパティを使うことで、要素の位置を自由に指定できます。positionプロパティは、要素を通常のドキュメントフローから取り除いたり、特定の位置に配置したりするのに役立ちます。

## positionプロパティの基本概念

`position`プロパティは、要素の配置方法を指定するために使用されます。
例えば、要素の位置を20pxだけ右に動かすというようなことができたり、要素の上に別の要素を重ねてのせることができたり、また画面の決まった位置に要素を固定して表示させることができたりします。

主な使い方は以下の通りです。

```css
セレクタ {position : 値}
```
セレクタって何…？となった方は**CSSの基本**をまとめた記事があるのでこちらも是非！

https://qiita.com/shimada_slj/items/f2da347639729b9c9e48

1. `static`:初期値(指定することはほとんどないと思います…)

2. `relative`:現在の位置を基準に**相対的**な位置を決める

3. `absolute`:親要素を基準に**絶対的**な位置を決める

4. `fixed`:画面の決まった位置に固定する

たとえば、class名が”test”の要素の相対的な位置を指定したいときには、`.test {position: relative}`というように書きます！

## positionとセットで使うtop,bottom,left,right
`position`とセットで使う`top` , `right` , `bottom` , `left` の各プロパティが、配置された要素の最終的な位置を決めます。

位置を指定する流れは以下の通りです。
1. `positon`で基準を決める
2. `top` , `right` , `bottom` , `left` で具体的な位置を数字で調整

- `top`：基準の上からの距離
- `bottom`：下からの距離
- `left`：左からの距離
- `right`：右からの距離

基準の上からの距離を10pxにしたいときは`.test {top: 10px}`というように書きます！
基本的には上記4つのうち縦方向と横方向の2つを組み合わせて使います。
leftとright、またはtopとbottomを同時に指定することはほとんどありません。

※ ちなみに`top`と`bottom`を同時に0に指定すると要素は縦いっぱいに広がり、`left`と`right`を同時に0にすると要素は横いっぱいに広がります。

# staticの特徴
staticの主な特徴は以下の4点です。
1. 初期値：CSSで何も指定していなければ`static`で指定している位置と同じになっている
2. 要素は通常の位置：上下左右に動かすことができない
3. 要素の位置を調整できない：`top`や`left`などを指定しても効かない
4. z-indexを指定できない：要素の重なり順を変えられない

staticは「静的な」という意味です。
positionの初期値がstaticなので基本的にstaticを指定することはないと思います。
ただ、**positionをリセットしたい時**などには使えます！使います！

# relativeの特徴
relativeは「相対的な」という意味です。
`position: relative`は現在の表示位置から相対的に要素の位置を動かしたいときに使います。
要素から相対的に位置指定をしたい場合、その要素に対してrelativeを設定します。
`position:relative`と指定しても、`top`や`bottom`を指定しなければ`static`と同じ位置に表示されます。

## relativeの使い方
<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="XWoBqBM" data-user="tusegela-the-sasster" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/tusegela-the-sasster/pen/XWoBqBM">
  css-relative</a> by shimada (<a href="https://codepen.io/tusegela-the-sasster">@tusegela-the-sasster</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

本来の表示位置を基準とし、上から10px（`top:10px`）、左から10px（`left:10px`）分、移動しました！

# absoluteの特徴
absoluteは「絶対的な」という意味です。
`position: absolute`単体では基本的に使いません。
主に`position: relative`や、`fixed`と一緒に使用します。
要素がどんな形でも、間に他の要素や余白が入っていても、その位置に配置してくれるので使い方を覚えておくと幅がぐっと広がります！

## absoluteの使い方
指定しない場合は以下です。
<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="vYvajvQ" data-user="tusegela-the-sasster" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/tusegela-the-sasster/pen/vYvajvQ">
  css-absolutenone</a> by shimada (<a href="https://codepen.io/tusegela-the-sasster">@tusegela-the-sasster</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

次に、要素②をabsoluteにした場合です。

<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="dywjeLq" data-user="tusegela-the-sasster" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/tusegela-the-sasster/pen/dywjeLq">
  css-absolute2</a> by shimada (<a href="https://codepen.io/tusegela-the-sasster">@tusegela-the-sasster</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

左上にきちんと表示されていますね！
`bottom:0`と`right:0`と指定すれば、親要素の右下にピッタリとくっつきます。
他の要素があろうと重なって表示されるところから見ても、absoluteは絶対的な位置指定であるということがわかると思います。
absoluteを使って位置調整するときは、親要素に`position:relative`（もしくは`fixed`）を指定しておきましょう。これを忘れると基準位置がずれて思ったように表示されません。absoluteを使うときは、親要素もセットで指定するように覚えておきましょう。
画像に文字を重ねたかったりする時にすごく使えるのでぜひ！

# fixedの特徴
fixedは画面から見た位置で要素を固定させたい時に使用する値です。
例えば、スクロールしても位置が変わらないメニューバーやソーシャルボタンを表示したいときに使うと便利です。
absoluteと指定方法がほとんど同じですが、位置の基準は親要素ではなく「ウィンドウ全体」です。そのため、要素の位置に関係なく`top: 0`と指定したら画面の最上部に表示されます。

## fixedの使い方
<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="eYbjKNE" data-user="tusegela-the-sasster" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/tusegela-the-sasster/pen/eYbjKNE">
  css-fixed</a> by shimada (<a href="https://codepen.io/tusegela-the-sasster">@tusegela-the-sasster</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

スクロールしても常に上側に要素を固定することができました。
このように何かを固定するときにfixedは使えます、使います！

# 最後に
最後までお付き合いいただき、ありがとうございます。
コードを入れて視覚的にもわかりやすくなるように意識してみました。
少しでもお役に立てていたら幸いです！

私自身、まだまだ勉強中ですので何か誤った情報がありましたらお手数おかけしますがコメントにて教えていただけると大変ありがたいです。よろしくお願いいたします。

今後とも、インプットとアウトプットを繰り返し精進していきます！

# 参考文献

https://developer.mozilla.org/ja/docs/Web/CSS/position