CSSで要素をスクロールに追従させるために便利なposition: sticky;
。ところが、親要素にoverflow: hidden;
が指定されていると、思ったようにsticky
が機能しないことがあります。この記事では、その原因と対処法についてわかりやすく解説し、最近注目されているoverflow: clip;
を使った解決方法もご紹介します。
なぜ position: sticky;
が効かなくなるのか?
position: sticky;
は、要素の親要素が「スクロールコンテナ」として機能しているときに効果を発揮します。しかし、親要素に overflow: hidden;
が指定されていると、その要素が「スティッキーの制約コンテナ」となり、子要素の sticky
が意図したとおりに働かないことがあります。
つまり、親の overflow: hidden;
が、position: sticky;
の基準を壊してしまうのです。
解決策は overflow: clip;
の活用
CSSのoverflow
にはさまざまな値がありますが、2021年頃から使えるようになったoverflow: clip;
は、hidden
と似た見た目を持ちながら、内部的な挙動が異なります。
・overflow: hidden;
→ スクロールコンテナを分断する(stickyが効かない)
・overflow: clip;
→ スクロールコンテナを分断しない(stickyが効く)
そのため、親要素に overflow: clip;
を指定することで、position: sticky;
が正常に動作するようになります。
まとめ
overflow: hidden;
は便利なプロパティですが、何も考えずに使うと sticky
や z-index
などの思わぬCSSバグにつながります。今後は、目的に応じて overflow: clip;
も選択肢に入れるようにすると、より柔軟で意図どおりのレイアウトが可能になります。