横スクロールをドラッグで操作
マウスを長押ししたまま左右へ動かすと、横並びのカルーセル領域がドラッグでスクロールする UI です。 overflow-x:auto で横スクロール可能にした行に対し、 pointerdown で開始位置と現在の scrollLeft を記録し、 pointermove でマウスの移動量だけ scrollLeft…
解説
マウスを長押ししたまま左右へ動かすと、横並びのカルーセル領域がドラッグでスクロールする UI です。overflow-x:auto で横スクロール可能にした行に対し、pointerdown で開始位置と現在の scrollLeft を記録し、pointermove でマウスの移動量だけ scrollLeft を動かします。ボタンを離す・領域から出ると pointerup や pointerleave で状態を解除します。ドラッグ中は is-drag クラスでカーソルを grab から grabbing に変え、user-select:none で文字の選択を防いでいるのが操作感のポイントです。
使う場面と注意
画像の横並びギャラリー、カードのカルーセル、タグやカテゴリの横スクロールなど、スクロールバーを出さずに動かしたい場面に向きます。pointer 系イベントを使っているのでマウスでもタッチでも同じコードで動きます。注意点として、領域内のリンクや画像は draggable の既定動作と競合することがあるため、画像に対して標準のドラッグを無効化しておくと安定します。タッチ端末ではブラウザ標準のスワイプでも動くので、その上に重ねる形になります。scroll-behavior をドラッグ中だけ auto にし、追従が遅れないようにしている点も覚えておくと調整が楽です。
よくある質問
スマホのタッチでも動きますか。
動きます。pointer 系のイベントを使っているためマウスとタッチの両方で同じように操作できます。タッチ端末ではブラウザ標準の横スワイプも併用される形になります。
ドラッグ中に画像が引っかかります。
画像の標準ドラッグ動作が干渉している可能性があります。対象領域の img のドラッグを無効化し、user-select を none にしておくと、テキストや画像の選択に邪魔されずスムーズに動きます。