親要素にoverflow:hiddenが付いているとき、position:stickyが効かなくなる時の対処法



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;は便利なプロパティですが、何も考えずに使うと stickyz-index などの思わぬCSSバグにつながります。今後は、目的に応じて overflow: clip; も選択肢に入れるようにすると、より柔軟で意図どおりのレイアウトが可能になります。

トラックバックURL