TL;DR

スクロール操作が終わったときに、特定の位置へ「吸い寄せられる」ように移動する機能。

なぜ必要か

カルーセルやスライドを Web ブラウザで見せるときに役に立つ。

仕組み

スクロールコンテナに scroll-snap-type を指定して、スナップする軸(x、y、block、inline、both)と厳しさを決める。mandatory では、スクロールしていないときは必ずスナップ位置に合わせる。proximity では、スナップするかどうかをブラウザがスクロールの状況から決める。軸だけを指定したときは proximity になる。子要素には scroll-snap-align で、どの端を揃えるかを指定する。

例

scroll-snap-type プロパティの MDN のページにあるサンプルが分かりやすい。

#example-element {
  overflow-x: scroll;
  display: flex;
  scroll-snap-type: x mandatory;
}
 
#example-element > div {
  flex: 0 0 250px;
  scroll-snap-align: start;
}

出典