LoginSignup
2
0

display:contens 要素にscroll-snap-typeが使えなかったので調べてみた

Last updated at Posted at 2023-12-23

これはなに

2022年ぐらいに、使えるようになったばかりの display: contents; を試してみたくて安易に指定したことがあります。
すると scroll-snap-type が思ったような挙動をしてくれなくなりました。
当時は実装を優先していたので、振り返りをまとめなかったのですが、原因を改めてまとめてみようと思います。

scroll-snap-type とは

MDNによると下記の説明があります。

scroll-snap-type はCSSのプロパティで、スナップ点が存在する場合にスクロールコンテナーにどれだけ厳密にスナップ点を強制するかを設定します。

デモ

まずはデモをご覧ください。

See the Pen Untitled by gilly135 (@gilly135) on CodePen.

やりたかったこと

scroll-snap-type を使って、横軸方向にスナップし、特定の位置にスナップが止まるようなUIをコーディングしようとしました。
UIはデモ01を参照してください。

なので、デモの .scrollContents に下記の記述をしました。

.scrollContents {
  scroll-snap-type: x mandatory;
}

やらかしたこと

実際にCSSスクロールスナップをしたかったUIは画像だったのですが、このときにデモの.carddisplay: contents; を指定しました。
冒頭にも述べましたが、当時使えるようになったばかりの display: contents; を試してみたくて、実験で使ってみた記憶があります。
すると scroll-snap-type が思ったような挙動をしてくれなくなりました。

display: contens; とは

MDNによると下記の説明があります。

これらの要素は自身のために特定のボックスを生成しません。擬似ボックスやその子ボックスで置き換えられます。

ChromeのDevtoolのUIを借りて説明すると、 display: contents; は青い要素の部分だけになります。

ChromeのDevtoolのスクリーンショット

marginborderpaddingがなくなります。
あと background-color もなくなります。

なので、.card の中身の数字だけが表示される要素となってしまいます。

考察

CSSスクロールスナップでは、 scroll-padding や scroll-margin などのプロパティも存在します。
このことから、コンテンツのボックスが存在しなければ利用できないと考えられます。

display: contents; を指定したことで、コンテンツのボックスが存在しなくなったため、CSSスクロールスナップが機能しなくなったのだと思われます。

まとめ

  • display: contents; はコンテンツのボックスを生成しない
  • CSSスクロールスナップするためには、コンテンツのボックスが必要

この記事が誰かのお役に立てると幸いです。

参考

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0