CSS positionプロパティジェネレーター

static・relative・absolute・fixed・stickyの5種類のpositionをGUIで切り替え、top/right/bottom/left・z-indexの効果をリアルタイムのプレビューで確認しながらCSSコードを生成できる無料ツール。

使い方のヒント

  • position: relativeにしてtop/leftを設定すると、Box Bが本来の位置から見た目だけずれます。Box C(後の要素)の位置は変わらない点に注目してください。
  • position: absoluteまたはfixedに切り替えると、Box Bが通常のフローから完全に外れるため、直後のBox Cがその分だけ詰めて配置される様子が確認できます。
  • z-indexは複数の要素が重なったときの重なり順を決めますが、position: staticの要素には効果がありません。「z-indexを指定する」を試す前にpositionを変えてみてください。
  • position: stickyはスクロール可能なコンテナの中でのみ効果を発揮します。プレビュー枠を実際にスクロールして、途中で固定される様子を確認してください。
  • 生成されたCSSコードはコピーしてそのまま自分のスタイルシートに貼り付けられます。実際のページでも同じ見た目になるか確認してみましょう。

よくある質問

absoluteは「最も近い位置指定された祖先要素(position: static以外の親)」を基準に配置され、祖先がなければ最終的にページ全体(初期包含ブロック)が基準になります。一方fixedは常にブラウザのビューポートを基準に配置されるため、ページをスクロールしても画面上の同じ位置に留まり続けます。

stickyが効かない主な原因は、親要素に overflow: hidden や overflow: auto が指定されている、親要素の高さがsticky要素とほぼ同じで固定される余地がない、またはtop/bottom等のオフセットが1つも指定されていないことです。加えてstickyの効果は親コンテナの範囲内でしか発揮されないため、親要素自体をスクロール領域として設計する必要があります。

relativeは要素自身がposition: staticだった場合の本来の位置を基準に、top/right/bottom/leftの指定分だけ見た目上ずらします。要素が占めるスペース(他の要素への影響)は元の位置のまま確保され続ける点がabsoluteとの大きな違いです。

z-indexはposition: static以外(relative・absolute・fixed・sticky)の要素にしか効果がありません。また、親要素にz-indexとposition以外のスタイル(transformやopacityなど)が指定されていると独自の重なり文脈(stacking context)が作られ、子要素のz-indexが期待通りに働かないことがあります。

基準にしたい親要素にposition: relativeを指定するのが定番の方法です。offsetの値を指定しなくても、position: relativeを付けるだけで「位置指定された要素」となり、その子孫のabsolute要素はその要素の内側を基準に配置されるようになります。
ツールくん

余談ですが ― position: stickyが標準化されるまでの道のり

CSSのposition プロパティは古くからstatic・relative・absolute・fixedの4種類が存在していましたが、「スクロールに応じて途中から固定される」ヘッダーやサイドバーを実現するには、長らくJavaScriptでスクロールイベントを監視し、position: fixedへの切り替えを手動で行うしかありませんでした。CSSだけで完結する仕組みは存在しなかったのです。

position: stickyの構想自体は2012年頃からCSSの仕様(CSS Positioned Layout Module Level 3)に盛り込まれていましたが、実装が難しく、SafariがWebKitのベンダープレフィックス付き(-webkit-sticky)で先行実装したのが2013年頃でした。Chromeが標準のstickyキーワードに対応したのは2017年で、Firefoxを含む主要ブラウザで安心して使える状態になったのはさらに数年後の2020年前後のことです。

position: stickyの「途中で固定される」挙動は、実装上はrelativeとfixedのハイブリッドとして説明されます。通常はrelativeとして通常のフローに従い、スクロール位置が指定したオフセットに達すると、その場でfixedに切り替わったかのように振る舞います。この切り替えが親要素のスクロール範囲内でしか発生しない点が、意図せずstickyが「効かない」と感じる原因の多くを占めています。

現在ではテーブルの見出し行を固定する・目次をスクロールに追従させるなど、stickyはWebデザインの定番テクニックとして広く使われています。JavaScriptによるスクロール監視が不要になったことは、パフォーマンスとコードの単純さの両面で大きな進歩でした。