0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

JavaScript ポインターイベントで、マウスとタッチに楽に両対応

0
Last updated at Posted at 2025-04-06

ポインターイベントとは?

JavaScriptで、ドラッグ操作などをPCとモバイルに両対応したいときがあります。私は今まで、MouseEventTouchEventをどちらも登録していましたが、かなりめんどくさい。
そこで役に立つのが、ポインターイベントです。

使い方

ポインターイベントは、マウスイベントと対応するようなイベントが存在します。

(mousedownに対してpointerdown
mousemoveに対してpointermove
mouseupに対してpointerup)
例えば、ドラッグの移動量を検出したい場合は、

element.addEventListener('pointermove', e => {
  e.movementX // 直前からの移動量X
  e.movementY // 直前からの移動量Y
})

このイベント1つで、マウスとタッチに両対応することができます。
リスナーで受け取るイベントeは、MouseEventを継承しているので、マウスイベントからの移行は簡単です。
さらに、movementXmovementYを一発で取れるのはとても便利です。

追記

Mozillaのドキュメントを見ると

警告: ブラウザーはmovementXscreenXに 仕様で定義されているものとは異なる単位を使用します。ブラウザーとオペレーティングシステムによって、movementXの単位は物理ピクセルであったり、論理ピクセルであったり、 CSS ピクセルであったりします。

と書いてあります...。これはマズいやつや。

具体的なブラウザごとの使用単位は、

Edge:    物理ピクセル
Chrome:  物理ピクセル
Firefox: CSSピクセル
Safari:  論理ピクセル

とのこと。これでは、想定していた移動量とスケールがズレてしまいそう。これは使えない...。
やはり、直前の座標を保存して、移動量を自分で算出するのがベストなようです。

気をつける所

ポインターイベントは、それぞれのポインターに対して発火します。
例えば、3本指でドラッグした時は、pointermoveが3回ダブってしまいます。
モバイルで個別の対応が必要になることもあるかもしれません。

ブラウザの対応状況

主要ブラウザは、2020年には全て対応したみたいです。安心して使えそうです。

参考

0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?