スクロール時に表示領域に画面がくっつくようになる処理をCSSだけで実現する「scroll-snap」

この記事の要約
- 親要素に
scroll-snap-type: mandatory;を指定する - 子要素に
scroll-snap-align: start;を指定する widthやheightで幅の指定をする- 親要素に
overflow: scroll;を指定
IE11は古い仕様の記述方法のため注意が必要。
画面領域いっぱいにセクションが広がって、スクロールすると画面にキレイにピタッとくっついてくれる。このような処理を実装するためにはいままでJavaScriptを使う必要がありましたが、scroll-snapを使えばCSSだけで簡単に実装できます。
基本的な使い方
1番基本的なscroll-snapの挙動を実装したいときは、HTMLの親要素と子要素に下記の指定をするだけで実装ができます。
- 親要素に
scroll-snap-type: mandatory;を指定する - 子要素に
scroll-snap-align: start;を指定する widthやheightで幅の指定をする- 親要素に
overflow: scroll;を指定
See the Pen scroll-snap-type by Masakazu Saito (@31mskz10) on CodePen.
幅の指定やoverflow: scroll;を指定していないと、動かないときがあります。
scroll-snapの指定をしているはずなのにちゃんと機能しない場合は、この辺りを疑うようにしましょう。
scroll-snap-typeの指定
親要素に指定するscroll-snap-typeでは、「スクロールの方向」「スクロール調整の強さ」を指定します。
スクロールの方向はx・y・bothの3種類があり、それぞれ横方向・縦方向・両方(省略可)にスクロールしたときにくっつくようになります。
スクロール調整の強さはmandatoryとproximityの2種類があります。
mandatoryを使う場合は、必ずスナップ位置にスクロールするようになります。
逆にproximityの場合は境界線に近づくとピタッとくっつきますが、境界線との距離が遠い場合はくっつかなくなります。
scroll-snap-alignの指定
子要素に指定するscroll-snap-alignでは、「スナップする位置」を指定します。
値はstart・end・centerの3種類があり、それぞれ要素の開始・終了・真ん中でスナップするようになります。
基本的にはstartを設定することになりそうです。
ブラウザ対応状況
そして気になるブラウザ対応状況ですが、IE11では古い仕様での記述がサポートとなっています。
古い仕様の記述方法は、親要素に下記のように書きます。
scroll-snap-type: mandatory;
scroll-snap-points-y: repeat(500px);子要素側への記述がなくなった代わりに、scroll-snap-points-yというプロパティでスナップする間隔を指定します。
そのため、IE11だと等間隔にしかスナップできません。
めずらしくIE11も対応なのかと思いきや、理想的な対応状況とは言えないですね。

Nuxt.jsの基本と最初のセットアップ「プロジェクトの作成と起動をするまでの流れ」
HTTP通信をラクに実装できる「axios」の基本
コーディングで「スペース」と「タブ」のどちらを使えばいいのか?
既存プロジェクトにCompassが導入されている場合に備えて、最低限Sassのコンパイルだけでも行えるようにしておく
URLを変更するときに必要なリダイレクトに関する基礎知識
gulpのwatch機能を使って、監視ファイルに変更があった時にタスクを実行する
ウェブ上でLaTeXで数式をキレイにプレビューするJavaScriptライブラリ「MathJax」
Nuxt.jsでページを作成・追加する方法|Nuxt.jsの基本
AirPodsで片耳を外しても再生が止まらないようにする方法
MacのKeynoteにハイライトされた状態でコードを貼り付ける方法
iTerm2でマウスやトラックパッドの操作を設定できる環境設定の「Pointer」タブ
DeepLで「インターネット接続に問題があります」と表示されて翻訳できないときに確認すること
Ulyssesの「第2のエディタ」表示を使って2つのシートを横並びに表示する
Neovimを使い始める最初の一歩として便利な「LazyVim」
iPhoneでコピペ時に表示される「ペーストを許可」モーダルを非表示にする方法
DeepL翻訳をAlfred上で完結させるAlfred Workflow「DeepL-Translate」
Keyboard Maestroのこれだけ覚えておけば良さそうなアクション紹介
1Passwordでウェブサイトの入力フォームを一瞬で入力する方法
Path Finderの「閉じたタブの開き直し」ショートカットキーを他アプリに合わせる
Vue.jsで値段を表示するときに3桁ごとにカンマを入れる方法
1Passwordを便利に使うための小技や整理術!
Chrome拡張機能のVimiumを使ってキーボードだけでブラウザを操作する
ブログに見出しを設置できるjQueryプラグイン「TOC | jQuery Table of Contents」