【CSS】 absoluteなどのpositionの動きを把握しよう
CSSでは、relative
とabsolute
を組み合わせた要素の重ね合わせ、fixed
を用いた画面上の固定表示など、位置を操作できます。最もよく利用するのはrelative
とabsolute
の組み合わせです。
近年追加されたsticky
の動きについても見ていきましょう!
positionの種類
positionには5種類あります。
値 | 動作 |
---|---|
static | 要素は通常通り配置されます。top , left , bottom , right , z-index は無視されます。 |
relative | 要素は通常通り配置されます。この要素自体にtop , left , bottom , right を設定すると、その分だけこの要素が移動します。 |
absolute | 要素は普通の配置から外れます。つまり、他の要素はこの要素が無いものとして配置されます。また、兄弟要素にabsolute でない要素がある場合、それより上に表示されます。right 等が指定された場合、祖先の要素のうち最も近いrelative が指定された要素基準で、指定した数値の座標に配置されます。 |
fixed | 画面上の固定位置に表示されます。スクロールしても場所は変わりません。また、他の要素はこの要素が無いものとして配置されます。 |
sticky | スクロールした時、親要素の範囲内でright 等が指定された座標に表示されます。 |
sticky
は少々複雑なので、まずは他から見ていきましょう。
static
これは普通に配置されるもので、デフォルトはこれです。
left
等は無視されます。
See the Pen Untitled by Totori (@souki202) on CodePen.
relative
static
のように普通に配置されますが、left
などで場所を動かせます。
場所を動かした場合、動かす前の場所基準で他の兄弟要素が配置されます。
See the Pen css position relative by Totori (@souki202) on CodePen.
absolute
親や祖先の要素のうち、relative
を指定しているものがあれば、その要素の左上を基準として配置されます。移動する場合はright
等を用います。z-index
も適用されます。
ここで、兄弟要素の位置は、この要素が無いものとして配置されます。同時に、親要素の大きさに影響しません。
bottom: xx;
と指定した場合、要素の下側が祖先のrelative
な要素の下側と接します。right: xx;
と指定した場合も同様に、祖先のrelative
な要素の右側と接します。
もしrelative
な要素が祖先にない場合はbody
基準になりますが、殆どはrelative
と組み合わせると思います。
See the Pen css position absolute by Totori (@souki202) on CodePen.
- HTMLを見ると
bbb
はabsolute bottom...
と書かれている要素より後に書かれていますが、実際の配置は手前のabsoluteな要素を無視した配置になっています。また、bottom
とright
は、親のrelative
な要素の右下とabsolute
が基準になっていますね。 top
,left
,bottom
,right
全て0、大きさをauto
とすると、親要素全体に広がっていることが分かります。大きさをpx
などで指定するとうまく広がらないので注意しましょう。relative
な要素の子にrelative
な要素があり、その子にabsolute
となっています。この場合、absolute
な要素は、祖先で最も近いrelative
基準で配置されていますね。relative
とabsolute
を組み合わせて中央揃えにする典型的な方法です。要素の左上を親要素の中心に持ってきた後、transform: position(...)
でabsolute
な要素の縦横半分だけ逆に移動することで中央に持ってきています。- 親要素は
static
で、その親がrelative
なパターンです。static
なものは無視され、親の親にあるrelative
基準に配置されています。
また、下の例のように、画像と重ねるパターンはよくあります。(CardText
の部分がabsolute
)
See the Pen css position absolute2 by Totori (@souki202) on CodePen.
この例だと、画像とCardText
が兄弟要素として並んでいます。その親がrelative
の指定ですね。画像は普通にstatic
で配置で良いですが、そこに重ねるため、CardText
をabsolute
にして要素が重なるようにしています。absolute
にすると、親要素のサイズに影響を与えなくなるということも重要なポイントです。
fixed
画面上の特定位置に表示されます。位置は、left
等で指定します。
兄弟要素は、fixed
な要素を無視した場所に配置されます。親要素の大きさにも影響しません。
See the Pen css position fixed by Totori (@souki202) on CodePen.
sticky
最近実装された値です。スクロールして要素がはみ出た時、親要素からはみ出ない範囲で固定位置に表示されます。つまり、普段はstatic
の挙動、スクロールすると、top
やbottom
で指定した場所より外に行かないように固定表示、ただしそれは親要素の範囲に収まる場所、ということです。
sticky
な要素の親要素は自動的にスティッキーコンテナとなり、sticky
な要素はそこからはみ出ないように表示されます。
See the Pen css position sticky by Totori (@souki202) on CodePen.
縦スクロールの場合はtop
とbottom
が、横スクロールの場合はleft
とright
が効きます。
上の例でスクロールすると、header
がついてきますね。しかし、下の方までスクロールするとついてこなくなります。これは、固定表示するとスティッキーコンテナからはみ出てしまうためです。sticky
な要素は、親要素からはみ出ない範囲でしか移動しません。
まとめ
特にrelative
とabsolute
を組み合わせた挙動は頻出します。画像の上にテキストを重ねるなど、要素を重ね合わせる場合に極めてよく使用します。
sticky
は親要素の範囲からは出ないため、もし利用する場合は親要素の構成を考える必要があります。
複雑なレイアウトを組むにはpositionの理解は重要です。どのように配置されるか把握しましょう!