【CSS】position: stickyが効かないときの原因と対処法まとめ

【CSS】position: stickyが効かないときの原因と対処法まとめ HTML/CSS

position: stickyは、要素をスクロールに応じて固定表示させたいときに便利なCSSプロパティです。しかし、実装しても「なぜか効かない」「意図通りに動作しない」といったトラブルに遭遇することも少なくありません。

本記事では、position: stickyが効かないときによくある原因とその対処法をわかりやすく解説します。

position: stickyとは?

position: stickyは、通常のフローに従って表示されつつ、スクロール位置に応じて指定した位置で固定されるプロパティです。top, bottom, left, rightなどのオフセットと一緒に使うことで効果を発揮します。

.sticky-box {
  position: sticky;
  top: 0;
}

stickyが効かない主な原因と対処法

以下の表に代表的な原因とその対処法をまとめました。

原因 説明 対処法
親要素にoverflow: hiddenoverflow: autoが指定されている 親要素のスクロールコンテナがstickyを無効にすることがある overflowvisibleに変更するか、sticky要素の親構造を見直す
sticky要素にtopなどの位置指定がない オフセットがないとstickyのトリガーが発動しない top: 0top: 10pxなど明示的に指定する
stickyの親要素に高さがない stickyの判定には親の高さが必要 親要素に適切なheightmin-heightを設定する
display: table-cellflex環境下での制限 特定のレイアウト環境ではstickyが効きにくい blockinline-blockに変更するか、構造を見直す
スクロールコンテナがbody以外になっている スクロール対象が親要素で、そこにstickyが効かない sticky対象とスクロール要素の関係を再確認する

実践例 stickyが効かないケースと解決法

NG例(効かない)

<div class="wrapper" style="overflow: hidden;">
  <div class="sticky-box" style="position: sticky; top: 0;">固定したい要素</div>
</div>

→ wrapperにoverflow: hiddenがあるため、stickyは効きません。

OK例(効く)

<div class="wrapper">
  <div class="sticky-box" style="position: sticky; top: 0;">固定したい要素</div>
</div>

→ 親のoverflowを削除すれば、stickyが正しく機能します。

ブラウザ対応について

position: stickyはモダンブラウザでは広くサポートされていますが、IE11では無効です。サポート対象を確認し、必要に応じてJavaScriptによる代替実装も検討しましょう。

まとめ

position: stickyが効かないときは、以下のポイントを確認しましょう。

  • オフセット(topなど)を指定しているか?
  • 親要素にoverflow: hiddenが指定されていないか?
  • stickyの親に十分な高さがあるか?
  • flexやtableの中で使っていないか?

小さな見落としがstickyの動作を妨げる原因になります。ぜひ本記事をチェックリストとして活用してください。