スクロールスナップ

Scroll snapping

別名: スクロールスナップ、スナップスクロール、Scroll snap、CSS Scroll Snap

生態(さわってみる)

一言定義

スクロールの手を離すと、あらかじめ定めた区切り位置へ自動的に吸着して止まるスクロール挙動のUI。

分類

使う場面

  • 画像ギャラリーやフルスクリーンセクションを、区切りよく1枚・1画面ずつ見せたいとき
  • JSを書かずCSSだけでスナップ挙動を実現し、実装コストを抑えたいとき

避ける場面

  • 自由な位置で止まれる、連続的なスクロール体感をそのまま保ちたいとき
  • 現在何枚目・何番目かをドットなど専用コントロールで明示したいとき(→カルーセル)

近縁種との比較

スクロールスナップはCSS Scroll Snap仕様(scroll-snap-type/scroll-snap-align)だけで実現できる、JSを必要としないスナップ挙動である。カルーセルとは、複数の項目を順に切り替えて見せる点で似ているが、カルーセルがドットやアクティブスライドの管理、自動再生、前後ボタンといったJS制御の専用ウィジェットであるのに対し、スクロールスナップはブラウザネイティブのスクロールに区切りの制約を加えるだけで、現在位置の可視化や自動再生などの機能は持たない。パララックスとは、どちらもセクション単位の縦スクロール表現に関わる点で近縁だが、パララックスが前景・背景の速度差という視覚効果を作るのに対し、スクロールスナップはスクロールの停止位置そのものを制御する挙動であり、両者は組み合わせて使うこともできる別レイヤーの技術である。

実例リンク

アクセシビリティ

role
特別なroleは不要。スクロールコンテナはoverflow-x/yを持つ通常の要素のまま
キーボード操作
矢印キー・PageUp/PageDown・Tabによる要素間移動など、ブラウザネイティブのスクロール操作がそのまま機能する(CSSのみの実装であるため)
補足
prefers-reduced-motionが有効な環境ではscroll-behavior: smoothによる滑らかな移動を無効化する。scroll-snap-type自体は動きではなく停止位置の制約なので、無効化の対象に含めなくてよい