目次
タイトルの通りなんですが、tailwind cssを使っていてstickyが効かいことがありました。
無事対処できたので、備忘録を残します。
原因
親または祖先要素(コンポーネント)にoverflow-hiddenが存在しているとstickyは効かなくなるみたいです。
overflow-hidden
がstickyに影響を与えるのか
なぜoverflow-hiddenとstickyに対応するcssであるoverflow: hiddenおよびposition: stickyについて説明します。
- スクロールの仕組み:
position: sticky
が機能するためには、要素がスクロールする祖先要素に対して相対的に固定される必要があります。overflow: hidden
はスクロールバーを表示しないため、ユーザーにとって視覚的にはスクロールの仕組みを持たないように見えますが、内部的には要素がスクロールコンテキストを持つとみなされます。 - 固定される位置の計算:
position: sticky
は、要素がスクロールする祖先要素の境界に基づいて位置を計算します。祖先要素にoverflow: hidden
が設定されていると、その要素がスクロールコンテキストを持つため、sticky
要素はその中で固定位置を計算しますが、スクロールが発生しないため実際には固定されません。
すなわちoverflow-hidden
もスクロールの仕組みを持つ要素とされるため、sticky
が効かなくなります。
解決法
当たり前ではありますが、原因であるoverflow-hiddenを削除すればstickyが効くようになります。
overflow-hiddenとstickyを併用したい。
overflow-clipを使う
overflow-hiddenでやっていたようなことをstickyを聞く状態でやりたい場合はoverflow-hiddenではなくoverflow-clipを使うと良いみたいです。
なぜoverflow-clipだとstickyが使えるのか?
overflow-clipとstickyに対応するcssであるoverflow: clipおよびposition: stickyについて説明します。
- スクロールコンテキストを作成しない:
overflow: clip
はスクロールコンテキストを作成しないため、position: sticky
の動作を妨げません。 - 単に内容を隠す:
overflow: clip
は要素の内容がコンテナの境界を超えた場合にその部分を隠すだけであり、スクロールバーは表示されません。 - stickyの位置計算に影響を与えない:
overflow: clip
は要素の位置計算に影響を与えないため、sticky
要素が正しく機能します。
すなわちoverflow-clip
は、スクロールの仕組みを持たない要素とされるため、sticky
が機能します。
参考