知名度が低いウェブ標準ひとり Advent Calendar 2021 – 05 日目

マウス系イベントとタッチ系イベントを統合して拡張した Pointer Events というのがあります。

かつては mousemovetouchmove の両方のイベントでほとんど同じだけどちょっとだけ違うみたいなコードを書いてたんだけど、これを使うと一度書けば両方に対応できます。

なお CSS の pointer-events とは無関係。

基本的な使い方

こんな感じでイベントを置き換えられます。

マウス系 タッチ系 ポインター系
mousedown touchstart pointerstart
mousemove touchmove pointermove
mouseup touchend pointerend
- touchcancel pointercancel
mouseenter pointerenter
mouseleave pointerleave

あとプロパティ。

マウス系 タッチ系 ポインター系
button button
- touches touchId
pageX pageX pageX 他(そのまま)

イベントオブジェクト

PointerEvent コンストラクターは MouseEvent コンストラクターを継承しているので、飛んでくる event では button とかマウス系イベントのイベントオブジェクトと同じプロパティは全て使えます。しれっと pageX 等の座標系が倍精度になっていたりはする。

タッチは touches の代わりに pointerId で識別する感じです。ポインターごとにイベントが発火します。デモでは ID を表示したりしてるので見てみてください。

拡張

マウス系にもタッチ系にもない独自のものとして、pointerType というプロパティが追加されています。これを見てどの種類の装置による操作なのかを判断できます。値は文字列 (DOMString) で "mouse""touch" 及び "pen" になります。

そう、"pen" 。というわけでマウス、タッチの他にペンの操作を受け付けることができます。ペン用のプロパティとして、筆圧 pressure や傾き tiltX なども得られます。

おしまい

たしか Windows 8 で OS ごとタッチ対応したあたりで追加された機能だったと思う。なので IE も対応してます。

ちなみにドラッグ UI 作るだけの場合は draggable="true" 属性drag イベント使う方が楽かも。

参考