position: stickyは、要素をスクロールに応じて固定表示させたいときに便利なCSSプロパティです。しかし、実装しても「なぜか効かない」「意図通りに動作しない」といったトラブルに遭遇することも少なくありません。
本記事では、position: stickyが効かないときによくある原因とその対処法をわかりやすく解説します。
position: stickyとは?
position: stickyは、通常のフローに従って表示されつつ、スクロール位置に応じて指定した位置で固定されるプロパティです。top, bottom, left, rightなどのオフセットと一緒に使うことで効果を発揮します。
.sticky-box {
position: sticky;
top: 0;
}
stickyが効かない主な原因と対処法
以下の表に代表的な原因とその対処法をまとめました。
原因 | 説明 | 対処法 |
---|---|---|
親要素にoverflow: hidden やoverflow: auto が指定されている |
親要素のスクロールコンテナがstickyを無効にすることがある | overflow をvisible に変更するか、sticky要素の親構造を見直す |
sticky要素にtop などの位置指定がない |
オフセットがないとstickyのトリガーが発動しない | top: 0 やtop: 10px など明示的に指定する |
stickyの親要素に高さがない | stickyの判定には親の高さが必要 | 親要素に適切なheight やmin-height を設定する |
display: table-cell やflex 環境下での制限 |
特定のレイアウト環境ではstickyが効きにくい | block やinline-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の動作を妨げる原因になります。ぜひ本記事をチェックリストとして活用してください。