ポインターイベント

レベル 3

W3C勧告

この文書の詳細
このバージョン:
https://www.w3.org/TR/2026/REC-pointerevents3-20260630/
最新公開バージョン:
https://www.w3.org/TR/pointerevents3/
履歴:
https://www.w3.org/standards/history/pointerevents3/
コミット履歴
テストスイート:
https://wpt.fyi/pointerevents/
実装レポート:
https://w3c.github.io/pointereventswg/implementation-reports/wpt-pointerevents-2026-05-06.html
以前の勧告:
https://www.w3.org/TR/pointerevents2
編集者:
Patrick H. Lauke (TetraLogical)
Robert Flack (Google)
以前の編集者:
Matt Brubeck (Mozilla)
Rick Byers (Google)
Navid Zolghadr (Google)
フィードバック:
GitHub w3c/pointerevents (プルリクエスト, 新規イシュー, オープンイシュー)
public-pointer-events@w3.org 件名 [pointerevents3] … メッセージのトピック … (アーカイブ)
正誤表:
正誤表があります.
ブラウザー対応状況:
caniuse.com

関連して 翻訳も参照してください。


要約

本仕様の機能は、ポインターイベントに含まれる機能を拡張または修正します。ポインターイベントは、マウス、ペン、タッチスクリーンなど、ハードウェアに依存しないポインター入力の取り扱いのためのイベントおよび関連インターフェースを記述したW3C勧告です。既存のマウスベースのコンテンツとの互換性のために、本仕様では他のポインター入力機器タイプにおいてもマウスイベントを発火させるマッピングについても記載しています。

この文書のステータス

この節では、この文書が公開された時点での ステータスを説明します。現在のW3C 公開文書の一覧およびこの技術レポートの最新版は、 W3C標準および草案 インデックスにあります。

この仕様は、[PointerEvents2]の更新版です。

この改訂には、次の新機能が含まれます:

この改訂には、次の明確化も含まれます:

Pointer Eventsのこの改訂版は、[PointerEvents2]を置き換えます。

この文書は、Pointer Events Working Groupによって、 勧告 トラックを使用した勧告として公開されました。

W3Cは、この仕様をWebの標準として広く展開することを 推奨します。

W3C勧告とは、広範な 合意形成を経た後、 W3Cおよびそのメンバーによって承認され、 Working Groupメンバーから、実装に対する ロイヤリティフリーのライセンス許諾 の確約がある仕様です。

この文書は、 W3C 特許 ポリシーの下で活動するグループによって作成されました。 W3Cは、 グループの成果物に関連して行われた あらゆる特許開示の公開リスト を維持しています。そのページには、 特許を開示するための手順も含まれています。ある個人が、 その個人が 必須請求項 を含むと考える特許について実際の知識を有している場合、 その情報を W3C特許ポリシー第6節に従って開示しなければなりません。

この文書は、 2025年8月18日付W3Cプロセス文書に準拠します。

1. はじめに

このセクションは規範的ではありません。

今日、ほとんどの [HTML] コンテンツはマウス入力とともに使用され、かつ/またはマウス入力向けに設計されている。入力を カスタムな方法で処理するものは、通常 [POINTEREVENTS4] Mouse Events に合わせてコードを書く。しかし、 今日のより新しいコンピューティングデバイスは、タッチスクリーンやペン入力を含む、他の形式の入力を組み込んでいる。 これらの入力形式を個別に処理するためのイベント型が提案されてきた。しかし、その アプローチでは、新しい入力型のサポートを追加するときに、ロジックとイベント処理のオーバーヘッドが不必要に重複することが多い。 これは、1 種類のデバイス型だけを念頭に置いてコンテンツが書かれている場合に、互換性の問題を生じさせることが多い。 さらに、既存のマウスベースのコンテンツとの互換性のために、ほとんどのユーザーエージェントは、すべての入力型に対して Mouse Events を発火する。 これにより、Mouse Event が実際のマウスデバイスを表しているのか、互換性のために 別の入力型から生成されているのかが曖昧になり、両方のデバイス型に同時に対応するコードを書くことが難しくなる。

複数の入力型に対応するコードを書くコストを削減し、また上で説明した Mouse Events に関する曖昧さに対処するために、 この仕様は、ポインターと呼ばれる、より抽象的な入力形式を定義する。ポインターは、 マウスカーソル、ペン、タッチ(マルチタッチを含む)、またはその他のポインティング 入力デバイスによって画面上に作られる任意の接触点でありうる。このモデルにより、ユーザーがどのような ハードウェアを持っているかに関わらず適切に動作するサイトやアプリケーションを書きやすくなる。デバイス固有の処理が望まれるシナリオのために、この仕様はまた、 イベントを生成したデバイス型を調べるためのプロパティも定義する。主な目標は、クロスデバイスのポインター入力に対するより容易なオーサリングを可能にする 単一のイベントおよびインターフェイスの集合を提供しつつ、拡張された体験に必要な場合にのみ デバイス固有の処理も可能にすることである。

追加の重要な目標は、マルチスレッドのユーザーエージェントが、パンおよびズームのための直接操作 アクション(たとえば、タッチスクリーン上の指やスタイラスによるもの)を、スクリプト実行でブロックされることなく処理できるようにすることである。

この仕様はさまざまなポインター入力のための統一イベントモデルを定義するが、このモデルは キーボードやキーボードに似たインターフェイスなどの他の形式の入力(たとえば、 タッチスクリーンのみのデバイス上で動作し、ユーザーがフォーカス可能なコントロールおよび要素を順次ナビゲーションできるようにする スクリーンリーダーまたは同様の支援技術)を対象としていない。ユーザーエージェントが これらのインターフェイスに応じてポインターイベントも生成することを選ぶ可能性はあるが、このシナリオは この仕様では対象としない。

第一に、作者は focusblur、および click などの高水準イベントに応答することで、すべての形式の 入力に対して同等の機能を提供することが推奨される。しかし、低水準イベント(Pointer Events など)を使用する場合、作者は すべての種類の入力がサポートされることを確保することが推奨される。キーボードおよび キーボードに似たインターフェイスの場合、これは明示的なキーボードイベント処理の追加を必要とする可能性がある。詳細については、 キーボードアクセス可能 [WCAG22] を参照。

ポインター入力はマウス、ペン、タッチなど様々な入力ソースを統合します
1 ポインターは、画面上の特定の座標(または座標群)をターゲットできる入力機器群のハードウェア非依存な表現です。

汎用的なポインター入力のためのイベントは、マウスのイベントと非常によく似ています:pointerdownpointermovepointeruppointeroverpointeroutなどです。これにより、Mouse EventsからPointer Eventsへの容易な移行が可能となります。 Pointer Eventsは、Mouse Eventsと同様にclient座標、ターゲット要素、ボタンの状態などのプロパティに加え、他の入力形態に合わせて圧力や接触ジオメトリ、傾きなど新たなプロパティも提供します。著者はPointer Eventsを利用して、入力種別ごとに適宜ロジックを共通化したり、必要に応じて特定の入力タイプ向けの最適化も容易に行えます。

Pointer Eventsはさまざまな入力機器から発生しますが、他のデバイス固有のイベントから生成されるものと定義されているわけではありません。互換性のために推奨される場合もありますが、本仕様では他のデバイス固有イベント(マウスイベントやタッチイベント等)のサポートを義務付けていません。ユーザーエージェントはPointer Eventsのみをサポートし、他のデバイスイベントをサポートしなくてもかまいません。マウス固有イベント向けに書かれたコンテンツとの互換性のため、本仕様ではマウス以外の機器からのポインター入力を元に互換性マウスイベントを生成する方法についても、参考として記載しています。

注記

本仕様は、[TOUCH-EVENTS] で定義されるTouch EventsとPointer Eventsの両方に対応するユーザーエージェントの動作について助言するものではありません。これら2つの仕様の関係についての詳細は、Touch Events Community Groupを参照してください。

2. 適合性

非規範的と記載されたセクションのほか、本仕様におけるすべての著者指針、図式、例、および注記は規範的ではありません。それ以外は全て規範的内容です。

この文書における MAYMUSTMUST NOTOPTIONALSHOULD というキーワードは、 BCP 14 [RFC2119]および [RFC8174] で示されるとおり、ここに示すようにすべて大文字で現れる場合に、かつその場合にのみ解釈されます。

3.

このセクションは規範的ではありません。

以下に、本仕様のAPIの一部の使用例を示します。より具体的な例は、各該当セクションにも記載されています。

1: 機能検出とイベントバインディング
/* Pointer Events または従来の touch/mouse にバインドする */

if (window.PointerEvent) {
    // Pointer Events がサポートされている場合は pointer 系のみをリッスン
    target.addEventListener("pointerdown", function(e) {
        // 必要に応じてe.pointerTypeで入力タイプごとにロジックを分岐
        // (touch/pen/mouseごとの処理)
        ...
    });
    ...
} else {
    // 従来の touch/mouse 用イベントハンドラ
    target.addEventListener('touchstart', function(e) {
        // 互換マウスイベントやclickの発生を防ぐ
        e.preventDefault();
        ...
    });
    ...
    target.addEventListener('mousedown', ...);
    ...
}

// キーボード対応用のイベントリスナー追加など
...
2: ユーザーの入力タイプの検出
window.addEventListener("pointerdown", detectInputType);

function detectInputType(event) {
    switch(event.pointerType) {
        case "mouse":
            /* マウス入力 */
            break;
        case "pen":
            /* ペン/スタイラス入力 */
            break;
        case "touch":
            /* タッチ入力 */
            break;
        default:
            /* pointerTypeが空(検出不可)またはUA固有カスタムタイプ */
    }
}
3: 接触ジオメトリに合わせて要素のサイズを変更
<div style="position:absolute; top:0px; left:0px; width:100px;height:100px;"></div>
<script>
window.addEventListener("pointerdown", checkPointerSize);

function checkPointerSize(event) {
    event.target.style.width = event.width + "px";
    event.target.style.height = event.height + "px";
}
</script>
4: スクリプトから非信頼ポインターイベントを発火
const event1 = new PointerEvent("pointerover",
  { bubbles: true,
    cancelable: true,
    composed: true,
    pointerId: 42,
    pointerType: "pen",
    clientX: 300,
    clientY: 500
  });
eventTarget.dispatchEvent(event1);

let pointerEventInitDict =
{
  bubbles: true,
  cancelable: true,
  composed: true,
  pointerId: 42,
  pointerType: "pen",
  clientX: 300,
  clientY: 500,
};
const p1 = new PointerEvent("pointermove", pointerEventInitDict);
pointerEventInitDict.clientX += 10;
const p2 = new PointerEvent("pointermove", pointerEventInitDict);
pointerEventInitDict.coalescedEvents = [p1, p2];
const event2 = new PointerEvent("pointermove", pointerEventInitDict);
eventTarget.dispatchEvent(event2);

4. ポインターイベントとインターフェース

4.1 PointerEvent インターフェース

WebIDLdictionary PointerEventInit : MouseEventInit {
    long        pointerId = 0;
    double      width = 1;
    double      height = 1;
    float       pressure = 0;
    float       tangentialPressure = 0;
    long        tiltX;
    long        tiltY;
    long        twist = 0;
    double      altitudeAngle;
    double      azimuthAngle;
    DOMString   pointerType = "";
    boolean     isPrimary = false;
    sequence<PointerEvent> coalescedEvents = [];
    sequence<PointerEvent> predictedEvents = [];
};

[Exposed=Window]
interface PointerEvent : MouseEvent {
    constructor(DOMString type, optional PointerEventInit eventInitDict = {});
    readonly        attribute long        pointerId;
    readonly        attribute double      width;
    readonly        attribute double      height;
    readonly        attribute float       pressure;
    readonly        attribute float       tangentialPressure;
    readonly        attribute long        tiltX;
    readonly        attribute long        tiltY;
    readonly        attribute long        twist;
    readonly        attribute double      altitudeAngle;
    readonly        attribute double      azimuthAngle;
    readonly        attribute DOMString   pointerType;
    readonly        attribute boolean     isPrimary;
    [SecureContext] sequence<PointerEvent> getCoalescedEvents();
    sequence<PointerEvent> getPredictedEvents();
};
pointerId

イベントを引き起こしたポインターの一意な識別子。ユーザーエージェントは、プライマリマウスポインターのために汎用のpointerId0 または 1を予約してもよい(MAY)。pointerId-1は予約され、ポインティングデバイス以外によって生成されたイベントを示すために使用しなければならない(MUST)。その他のポインターについて、ユーザーエージェントはpointerId値の割り当て方法において、さまざまな戦略や手法を実装してもよい。なお、アクティブなポインターは[HTML]で定義されるトップレベル閲覧コンテキスト内で一意でなければならず、識別子は他のトップレベル閲覧コンテキストに影響されてはならない(MUST NOT)。(すなわち、あるトップレベル閲覧コンテキストは、そのポインターが閲覧コンテキスト外に移動して別のトップレベル閲覧コンテキストに入ったときに、同じpointerIdになると仮定できない)。

ユーザーエージェントは、過去のアクティブなポインターからすでに引退したpointerIdを再利用してもよい(MAY)。または、特定のポインティングデバイスに対して常に同じpointerIdを再使用してもよい(たとえば、マルチユーザーの協調アプリケーションで特定ユーザーの特定のペン/スタイラス入力を一意に識別するため)。ただし後者の場合、フィンガープリントやページ/ドメイン間の追跡の可能性を最小化するために、そのpointerIdは当該ページ/セッションの存続期間において明示的にその特定のポインティングデバイスのみに紐づくべきであり(MUST)、そのデバイスが新しいセッションで再び使用される際には新たにランダム化されたpointerIdを選ばなければならない(MUST)。

注記

pointerIdの選択アルゴリズムは実装依存です。著者は、他のアクティブなポインターと異なる一意な識別子であること以外の意味を持つと仮定すべきではありません。例として、ユーザーエージェントは、アクティブになった順に0から番号を単純に割り当てる場合がありますが、これらの値が単調増加であることは保証されません。特定のポインティングデバイスに対して同じpointerIdを再使用するかどうかは個々の実装に委ねられているため、著者がこれに依存することは強く推奨されません。

width

ポインターの接触ジオメトリの、CSS ピクセル([CSS21]参照)におけるX軸方向の大きさ。与えられたポインターに対して、この値は各イベントで更新されてもよい(MAY)。通常、接触ジオメトリを持たない入力(伝統的なマウスなど)や、ハードウェアが実際のジオメトリを検出しない場合、ユーザーエージェントはデフォルト値1を返さなければならない(MUST)。

height

ポインターの接触ジオメトリの、CSS ピクセル([CSS21]参照)におけるY軸方向の大きさ。与えられたポインターに対して、この値は各イベントで更新されてもよい(MAY)。通常、接触ジオメトリを持たない入力(伝統的なマウスなど)や、ハードウェアが実際のジオメトリを検出しない場合、ユーザーエージェントはデフォルト値1を返さなければならない(MUST)。

pressure

ポインター入力の正規化された圧力を[0,1]の範囲で表す。01はそれぞれ、ハードウェアが検出可能な最小および最大圧力を表す。圧力をサポートしないハードウェアやプラットフォームでは、アクティブボタン状態のとき値は0.5、それ以外は0でなければならない(MUST)。

tangentialPressure

ポインター入力の正規化された接線圧(別名バレル圧)。範囲は[-1,1]で、0はコントロールの中立位置を意味する。ハードウェアによっては[0,1]の正の値のみをサポートする場合がある。接線圧をサポートしないハードウェアやプラットフォームでは、値は0でなければならない(MUST)。

注記
プロパティ名とは裏腹に、実際にはこのプロパティの値を生成するハードウェアのコントロール/センサーが必ずしも圧力感知であるとは限りません。たとえば多くの場合、エアブラシ用スタイラスの指先ホイールは自由に設定でき、ゼロ位置に戻らないように継続的な圧力をかけ続ける必要はありません。
tiltX

Y-Z平面と、トランスデューサ(例:ペン/スタイラス)の軸とY軸を含む平面とのなす角(度単位、[-90,90]の範囲)。正のtiltXは右方向(X値が増加する方向)。tiltXtiltYと組み合わせて、デジタイザに対するトランスデューサの法線からの傾きを表現できる。傾きや角度を報告しないハードウェアやプラットフォームでは、値は0でなければならない(MUST)。

tiltX の説明図
2 正の tiltX
tiltY

X-Z平面と、トランスデューサ(例:ペン/スタイラス)の軸とX軸を含む平面とのなす角(度単位、[-90,90]の範囲)。正のtiltYはユーザー側(Y値が増加する方向)。tiltYtiltXと組み合わせて、デジタイザに対するトランスデューサの法線からの傾きを表現できる。傾きや角度を報告しないハードウェアやプラットフォームでは、値は0でなければならない(MUST)。

tiltY の説明図
3 正の tiltY
twist

トランスデューサ(例:ペン/スタイラス)が自身の主軸の周りに回転する時計回りの角度(度単位、[0,359]の範囲)。ツイストを報告しないハードウェアやプラットフォームでは、値は0でなければならない(MUST)。

altitudeAngle

トランスデューサ(例:ペン/スタイラス)の仰角(ラジアン)。範囲は[0,π/2]で、0は表面(X-Y平面)と平行、π/2は表面に垂直。傾きや角度を報告しないハードウェアやプラットフォームでは、値はπ/2でなければならない(MUST)。

注記
ここで定義される altitudeAngle のデフォルト値は π/2 で、トランスデューサが表面に対して垂直であることを意味します。これは Touch Events - Level 2 仕様の altitudeAngle プロパティの定義(デフォルト値が 0)とは異なります。
altitudeAngle の説明図
4 例: altitudeAngleπ/4(X-Y 平面から45度)。
azimuthAngle

トランスデューサ(例:ペン/スタイラス)の方位角(ラジアン)。範囲は[0, 2π]で、0はX-Y平面上でキャップがX値増加方向(真上から見て「3時」方向)を向く状態を表し、時計回りに値が増加する(「6時」でπ/2、「9時」でπ、「12時」で3π/2)。トランスデューサが表面に完全に垂直(altitudeAngleπ/2)な場合、値は0でなければならない(MUST)。傾きや角度を報告しないハードウェアやプラットフォームでは、値は0でなければならない(MUST)。

azimuthAngle の説明図
5 例: azimuthAngleπ/6(「4時」)。
pointerType

イベントを発生させたデバイス種別(マウス、ペン、タッチなど)を示します。ユーザー エージェントがマウス、 ペン/スタイラス、またはタッチ入力デバイスに対してポインターイベントを発火する場合、 pointerTypeの値は、次の表に従わなければなりません:

ポインターデバイス種別 pointerType
マウス mouse
ペン / スタイラス pen
タッチ接触 touch

デバイス種別をユーザーエージェントが検出できない場合、その値は空文字列で なければなりません。ユーザーエージェントが上記に列挙されていないポインターデバイス 種別をサポートする場合、異なる デバイス種別の名前の衝突を避けるため、pointerTypeの値にはベンダープレフィックスを付ける べきです。将来の仕様は、他のデバイス種別に対して追加の 規範値を提供することがあります

pointerTypeをどのように使用できるかの基本的な デモについては、例2を参照してください。また、開発者は、 独自のカスタムpointerType値を 実装している可能性のあるユーザーエージェントや、 pointerTypeが単に空文字列である状況に対応するため、 何らかの既定の処理を含めるべきであることにも注意してください。
isPrimary

そのポインターが、このポインター種別の主要ポインターを表すかどうかを示します。

getCoalescedEvents()

合成イベントの一覧を返すメソッドです。

getPredictedEvents()

予測イベントの一覧を返すメソッドです。

PointerEventInit 辞書は、PointerEvent インターフェイスのコンストラクターによって、 信頼されない(合成)ポインターイベントを構築するための仕組みを提供するために使用される。これは、現在 [POINTEREVENTS4] で定義される MouseEventInit 辞書から継承する。信頼されないポインターイベントを発火する方法を示すサンプルコードについては、を参照。

PointerEventイベント 構築ステップは、PointerEventInitcoalescedEvents合体イベントリストへ複製し、 PointerEventInitpredictedEvents予測イベントリストへ複製する。

PointerEvent インターフェイスは、Pointer Events で定義される MouseEvent から継承する。 また、CSSOM View Module における提案された拡張にも注意。これは、 小数座標を許容するために、各種座標プロパティを long から double へ変更する。この提案された拡張を PointerEvent についてすでに実装しているが、通常の MouseEvent については実装していない ユーザーエージェントには、 clickauxclick、および contextmenu イベントに関して追加の要件がある。

4.1.1 ボタンの状態

4.1.1.1 複数ボタンの組み合わせ操作

マウスやペンなど、一部のポインターデバイスは複数のボタンをサポートする。[POINTEREVENTS4] Mouse Event モデルでは、各ボタン押下は mousedown および mouseup イベントを生成する。この ハードウェア差をより適切に抽象化し、クロスデバイス入力のオーサリングを簡素化するために、Pointer Events は、 コード化されたボタン押下(ポインターデバイス上の別のボタンがすでに 押下されている間に追加のボタンを押下すること)に対して、重複するpointerdown および pointerup イベントを発火しない。

代わりに、コード化されたボタン押下は、button および buttons プロパティの変化を調べることで検出できる。button および buttons プロパティは、 MouseEvent インターフェイスから継承されるが、以下の節で概説するように、意味論と値が変更されている。

button および buttons プロパティへの変更は、 ポインターイベントにのみ適用される。ただし、clickauxclick および contextmenu については、button および buttons の値は、互換性マウスイベントの場合と同様に、[POINTEREVENTS4] に従わなければならない(MUST)。

4.1.1.2 button プロパティ

任意のポインターイベント(pointerdownおよびpointerupだけでなく)におけるボタン状態の遷移を識別するため、 buttonプロパティは、状態変化によってイベントを発火させたデバイスボタンを 示します。

デバイスボタンの変化 button
前回のイベント以降、ボタンもタッチ/ペン接触も変化していない -1
左マウスボタン、
タッチ接触、
ペン接触
0
中央マウスボタン 1
右マウスボタン、
ペンのバレルボタン
2
X1(戻る)マウスボタン 3
X2(進む)マウスボタン 4
ペン消しゴムボタン 5
マウスドラッグ中、pointermoveイベント内のbutton プロパティの値は、mousemoveイベント内の値とは異なります。たとえば、右 ボタンを押したままマウスを移動している間、pointermoveイベントの button値は-1になりますが、mousemoveイベントの button値は2になります。
4.1.1.3 buttons プロパティ

buttonsプロパティは、デバイスボタンの現在の状態をビットマスクとして 示します(MouseEventの場合と同じですが、可能な値の集合が拡張されています)。

デバイスボタンの現在の状態 buttons
ボタンが押されていない状態でマウスが移動した
ボタンが押されていない状態でホバー中に ペンが移動した
0
左マウスボタン、
タッチ接触、
ペン接触
1
中央マウスボタン 4
右マウスボタン、
ペンのバレルボタン
2
X1(戻る)マウスボタン 8
X2(進む)マウスボタン 16
ペン消しゴムボタン 32

4.1.2 プライマリポインター

マルチポインター(例:マルチタッチ)のシナリオでは、isPrimary プロパティは、各ポインタータイプのアクティブなポインター集合の中からマスターポインターを識別するために使用される。

  • 任意の時点で、各ポインタータイプにつきプライマリポインターは最大1つに限られる。
  • 特定のポインタータイプにおいて最初にアクティブになったポインター(例:マルチタッチ操作で最初に画面に触れた指)が、そのタイプのプライマリポインターとなる。
  • プライマリポインターのみが 互換マウスイベント を生成する。複数のプライマリポインターが存在する状況では、これらのポインターはすべて互換マウスイベントを生成する。
注記
単一ポインターのインタラクションを望む著者は、非プライマリのポインターを無視することでこれを実現できる(ただし、複数のプライマリポインターに関する注記を参照)。
注記
2種類以上のポインターデバイスが同時に使用されている場合、複数のポインター(各 pointerType ごとに1つ)がプライマリと見なされる。例:タッチ接触とマウスカーソルが同時に動いた場合、両方ともプライマリと見なされる。
注記
デバイス、OS、ユーザーエージェントによっては、偶発的なインタラクションを避けるために複数種類のポインター入力の同時使用を無視する場合がある。たとえば、タッチとペンの両方に対応するデバイスでは、ユーザーがペンを使用中はタッチ入力を無視し、ユーザーがペン使用中に手のひらを画面に置けるようにする(一般に「パームリジェクション」と呼ばれる機能)。現在、この挙動を著者が抑制することはできない。
注記
状況によっては、プライマリポインターとしてマークされたポインターが存在しない状態でポインターイベントが発火することがある。たとえば、特定タイプのアクティブなポインターが複数ある(マルチタッチ等)ときにプライマリポインターが取り除かれる(例:画面から離れる)と、プライマリポインターが存在しなくなる場合がある。また、デバイス上で同タイプのすべてのアクティブなポインター(ユーザーエージェント以外のアプリに向けられているものを含む)を用いてプライマリポインターが決定されるプラットフォームでは、最初の(プライマリ)ポインターがユーザーエージェント外にあり、他の(非プライマリ)ポインターがユーザーエージェント内に向けられている場合、ユーザーエージェントisPrimaryfalse として他のポインターのイベントを発火してもよい(MAY)。
注記
現在のOSやユーザーエージェントには、通常、複数マウス入力の概念がない。複数のマウスデバイスが存在する場合(例:トラックパッドと外付けマウスを備えたノートPC)、すべてのマウスデバイスは一般的に単一のデバイスとして扱われる—いずれのデバイスの移動も単一のマウスポインターの移動に変換され、デバイス間でボタン押下の区別はない。このため通常、マウスポインターは1つだけであり、そのポインターがプライマリになる。

4.1.3 PointerEvent インターフェースを用いたイベントの発火

ポインターイベントを発火することは、e という名前のイベントを発火し、PointerEvent を用いて、PointerEvent インターフェースおよび 属性とデフォルトアクションで定義されるとおりに属性を設定することを意味する。

イベントが gotpointercapturelostpointercaptureclickauxclickcontextmenu のいずれでもない場合、この PointerEvent に対して 保留中のポインターキャプチャの処理手順を実行する。

イベントが発火されるターゲットを次のようにして決定する:

targetDocument を、ターゲットの ノードドキュメント [DOM] とする。

イベントが pointerdownpointermove、または pointerup の場合、当該イベントの アクティブドキュメントを、そのイベントのpointerIdに対して targetDocument に設定する。

イベントが pointerdown で、関連デバイスが直接操作デバイスであり、ターゲットが Element の場合、ポインターキャプチャを設定し、当該pointerIdのターゲット要素に対して 暗黙のポインターキャプチャとして記述されるとおりに設定する。

このイベントを発火する前に、ユーザーエージェントは、イベント順序を確保する [POINTEREVENTS4] 目的で、ポインティングデバイスが previousTarget から対象上へ移動したかのように、その対象を扱うべきである(SHOULD)。 needsOverEvent フラグが設定されている場合、対象要素が同じであっても、pointerover イベントが必要である。

決定したターゲットにイベントを発火する。

決定したターゲットを該当ポインターの previousTarget として保存し、needsOverEvent フラグを false にリセットする。previousTarget が、ある時点で [DOM] の connected でなくなる場合、previousTarget を、previousTarget へのイベントディスパッチに対応するイベントパスに従って、いまだ connected [DOM] である最も近い親に更新し、needsOverEvent フラグを true に設定する。

通常のヒットテスト結果の代わりに、ポインターキャプチャ 対象オーバーライドを対象として使用すると、[POINTEREVENTS4] で定義されるように、 一部の境界イベントが発火する可能性がある。これは、ポインターが以前の対象から離れ、この新しいキャプチャ対象に入るのと 同じである。キャプチャが解放されると、ポインターがキャプチャ対象から離れ、ヒットテスト対象に入るため、 同じシナリオが発生する可能性がある。
4.1.3.1 属性とデフォルトアクション

本仕様で定義されるイベントタイプの bubbles および cancelable プロパティとデフォルトアクションは、以下の表に示す。各イベントタイプの詳細は ポインターイベントの種類 を参照。

イベント種別 バブルする キャンセル可能 既定の動作
pointerover はい はい なし
pointerenter いいえ いいえ なし
pointerdown はい はい 場合による: ポインターが主要ポインターである場合、 mousedownイベントのすべての既定の動作
このイベントをキャンセルすると、後続の互換マウス イベントの発火も防止されます。
pointermove はい はい 場合による: ポインターが主要ポインターである場合、 mousemoveのすべての既定の動作
pointerrawupdate はい いいえ なし
pointerup はい はい 場合による: ポインターが主要ポインターである場合、mouseupのすべての既定の動作
pointercancel はい いいえ なし
pointerout はい はい なし
pointerleave いいえ いいえ なし
gotpointercapture はい いいえ なし
lostpointercapture はい いいえ なし

ビューポートの操作(パンやズーム)— 一般には 直接操作 の結果として発生する — は、意図的にポインターイベントのデフォルトアクションではない。つまり、これらの挙動(例:タッチスクリーン上で指を動かすことによるページのパン)は、ポインターイベントをキャンセルしても抑制できない。著者は代わりに touch-action を用いて、文書領域に対して明示的に 直接操作の挙動 を宣言しなければならない。イベントキャンセルへの依存を取り除くことで、ユーザーエージェントによるパフォーマンス最適化が容易になる。

pointerenter および pointerleave イベントについては、composed [DOM] 属性は false であるべきである(SHOULD)。上記の他のすべてのポインターイベントでは、属性は true であるべきである(SHOULD)。

上記のすべてのポインターイベントについて、[UIEVENTS] の detail 属性は 0 であるべきである(SHOULD)。

多くのユーザーエージェントは、レガシーコンテンツをサポートするために MouseEvents で非標準属性 fromElement および toElement を公開している。そのようなユーザーエージェントには、作者を標準化された代替 (target および relatedTarget)の使用へ移行させるために、 PointerEvents におけるそれらの(継承された)属性の値を null に設定することを推奨する。

MouseEventrelatedTarget と同様に、 relatedTarget は、ポインターがちょうどその境界を離れた要素(pointerover または pointerenter イベントの場合)、またはポインターがその境界へ入ろうとしている要素(pointerout または pointerleave の場合)に初期化されるべきである。他のポインターイベントでは、 この値は既定で null になる。要素がポインターキャプチャを受け取ると、そのポインターに対する 以降のすべてのイベントは、キャプチャしている要素の境界内にあるとみなされることに注意。

gotpointercapture および lostpointercapture イベントについては、上の表で定義された属性以外のすべての属性は、ユーザーエージェントが 保留中のポインターキャプチャの処理手順を実行して gotpointercapture および lostpointercapture を発火する原因となったポインターイベントと同じであるべきである。

4.1.3.2 保留中のポインターキャプチャの処理

ユーザーエージェントは、ポインターキャプチャを暗黙的に解除する場合や、gotpointercapturelostpointercapture 以外のポインターイベントを発火する場合に、以下の手順を実行しなければならない(MUST)。

  1. このポインターに対するポインターキャプチャのターゲット上書きが設定されており、保留中のポインターキャプチャのターゲット上書きと等しくない場合、lostpointercapture という名前のポインターイベントを ポインターキャプチャのターゲット上書きノードで発火する。
  2. このポインターに対する保留中のポインターキャプチャのターゲット上書きが設定されており、ポインターキャプチャのターゲット上書きと等しくない場合、gotpointercapture という名前のポインターイベントを 保留中のポインターキャプチャのターゲット上書きで発火する。
  3. ポインターキャプチャのターゲット上書きを、設定されていれば 保留中のポインターキャプチャのターゲット上書きに設定する。そうでなければ、ポインターキャプチャのターゲット上書きをクリアする。
注記

clickauxclickcontextmenu イベントのセクションで定義されるとおり、lostpointercapture イベントがディスパッチされた後でも、対応する clickauxclickcontextmenu(該当するもの)がキャプチャ先のターゲットにディスパッチされる。

4.1.3.3 ポインターイベントストリームの抑制

ユーザーエージェントは、特定の pointerId に関するポインターイベントを、そのウェブページが引き続き受け取る可能性が低いと検出した場合、MUST ポインターイベントストリームを抑制しなければならない。次のいずれかのシナリオがこの条件を満たす(他にもシナリオが存在してもMAY)。

  • ユーザーエージェントがモーダルダイアログやメニューを開いた。
  • ポインター入力デバイスが物理的に切断された、またはホバー可能なポインター入力デバイス(例:ホバー可能なペン/スタイラス)がデジタイザで検出可能なホバー範囲から外れた。
  • その後、ユーザーエージェントがページのビューポート操作(例:パンやズーム)にポインターを使用した。詳細は touch-action CSS プロパティのセクションを参照。
    注記
    ユーザーエージェントは複数のポインタータイプ(タッチやペンなど)でパンやズームをトリガーできるため、パンやズーム操作の開始は、異なるポインタータイプを含むさまざまなポインターの抑制につながりうる。
  • [HTML] の ドラッグ&ドロップ処理モデルで定義されるドラッグ操作の開始アルゴリズムの一環として、ドラッグ操作を引き起こしたポインターに対して。
注記

その他、ユーザーエージェントMAY ポインターイベントストリームを抑制するシナリオには、以下が含まれる:

  • ポインターがアクティブな間にデバイスの画面の向きが変更された。
  • ユーザーがデバイスのサポート数を超える同時ポインター入力で操作を試みた。
  • ユーザーエージェントが入力を偶発的なものと解釈した(例:ハードウェアがパームリジェクションをサポートしている)。

これらのシナリオを検出する方法は本仕様の範囲外である。

ユーザーエージェントは、MUST 次の手順を実行して ポインターイベントストリームを抑制しなければならない。

4.1.4 レイアウト変更によって発生する境界イベント

画面表面に対する相対移動があった、またはいずれかのプロパティに変化があったポインティングデバイスは、ポインターイベントの種類で定義されるさまざまなイベントを発火する。静止したポインティングデバイス(画面表面に対して移動せず、いずれのプロパティにも変化がない)に対しては、ポインターのヒットテストターゲットに影響するレイアウト変更の後に、ユーザーエージェントMUST 特定の境界イベントを発火しなければならない。詳細は pointeroverpointerenterpointeroutpointerleave を参照。ユーザーエージェントは、パフォーマンス上の理由(例:ヒットテスト過多や、境界イベントリスナーによるレイアウト変更の多発を避けるため)により、これらの境界イベントの発火を遅延してもMAY

注記
静止したポインティングデバイス(画面表面に対して移動せず、いずれのプロパティにも変化がない)は、pointermove イベントを発火することはない。

4.1.5 tiltX / tiltYaltitudeAngle / azimuthAngle の相互変換

Pointer Events には、トランスデューサの X-Y 平面に対する向きを表現するための相補的な2組の属性が含まれる。すなわち、(元の Pointer Events 仕様で導入された)tiltX / tiltY と、(Touch Events - Level 2 仕様から採用された)azimuthAngle / altitudeAngle である。

特定のハードウェアやプラットフォームに応じて、ユーザーエージェントは画面平面に対するトランスデューサの向きに関して、tiltX / tiltYaltitudeAngle / azimuthAngle のいずれか一方の値のみを受け取る可能性が高い。ユーザーエージェントは、これらの値を相互に変換するために、以下のアルゴリズムをMUST使用しなければならない。

ユーザーエージェントが azimuthAngle / altitudeAngle から tiltX / tiltY を算出する場合、最終的な整数値は Math.round [ECMASCRIPT] の規則に従って丸めるべきである(SHOULD)。

5: tiltX/tiltY と altitudeAngle/azimuthAngle の相互変換
/* Converting between tiltX/tiltY and altitudeAngle/azimuthAngle */

function spherical2tilt(altitudeAngle, azimuthAngle) {
  const radToDeg = 180/Math.PI;

  let tiltXrad = 0;
  let tiltYrad = 0;

  if (altitudeAngle == 0) {
    // the pen is in the X-Y plane
    if (azimuthAngle == 0 || azimuthAngle == 2*Math.PI) {
      // pen is on positive X axis
      tiltXrad = Math.PI/2;
    }
    if (azimuthAngle == Math.PI/2) {
      // pen is on positive Y axis
      tiltYrad = Math.PI/2;
    }
    if (azimuthAngle == Math.PI) {
      // pen is on negative X axis
      tiltXrad = -Math.PI/2;
    }
    if (azimuthAngle == 3*Math.PI/2) {
      // pen is on negative Y axis
      tiltYrad = -Math.PI/2;
    }
    if (azimuthAngle>0 && azimuthAngle<Math.PI/2) {
      tiltXrad = Math.PI/2;
      tiltYrad = Math.PI/2;
    }
    if (azimuthAngle>Math.PI/2 && azimuthAngle<Math.PI) {
      tiltXrad = -Math.PI/2;
      tiltYrad = Math.PI/2;
    }
    if (azimuthAngle>Math.PI && azimuthAngle<3*Math.PI/2) {
      tiltXrad = -Math.PI/2;
      tiltYrad = -Math.PI/2;
    }
    if (azimuthAngle>3*Math.PI/2 && azimuthAngle<2*Math.PI) {
      tiltXrad = Math.PI/2;
      tiltYrad = -Math.PI/2;
    }
  }

  if (altitudeAngle != 0) {
    const tanAlt = Math.tan(altitudeAngle);

    tiltXrad = Math.atan(Math.cos(azimuthAngle) / tanAlt);
    tiltYrad = Math.atan(Math.sin(azimuthAngle) / tanAlt);
  }

  return {"tiltX":tiltXrad*radToDeg, "tiltY":tiltYrad*radToDeg};
}

function tilt2spherical(tiltX, tiltY) {
  const tiltXrad = tiltX * Math.PI/180;
  const tiltYrad = tiltY * Math.PI/180;

  // calculate azimuth angle
  let azimuthAngle = 0;

  if (tiltX == 0) {
    if (tiltY > 0) {
      azimuthAngle = Math.PI/2;
    }
    else if (tiltY < 0) {
      azimuthAngle = 3*Math.PI/2;
    }
  } else if (tiltY == 0) {
    if (tiltX < 0) {
      azimuthAngle = Math.PI;
    }
  } else if (Math.abs(tiltX) == 90 || Math.abs(tiltY) == 90) {
    // not enough information to calculate azimuth
    azimuthAngle = 0;
  } else {
    // Non-boundary case: neither tiltX nor tiltY is equal to 0 or +-90
    const tanX = Math.tan(tiltXrad);
    const tanY = Math.tan(tiltYrad);

    azimuthAngle = Math.atan2(tanY, tanX);
    if (azimuthAngle < 0) {
      azimuthAngle += 2*Math.PI;
    }
  }

  // calculate altitude angle
  let altitudeAngle = 0;

  if (Math.abs(tiltX) == 90 || Math.abs(tiltY) == 90) {
      altitudeAngle = 0
  } else if (tiltX == 0) {
    altitudeAngle = Math.PI/2 - Math.abs(tiltYrad);
  } else if (tiltY == 0) {
    altitudeAngle = Math.PI/2 - Math.abs(tiltXrad);
  } else {
    // Non-boundary case: neither tiltX nor tiltY is equal to 0 or +-90
    altitudeAngle =  Math.atan(1.0/Math.sqrt(Math.pow(Math.tan(tiltXrad),2) + Math.pow(Math.tan(tiltYrad),2)));
  }

  return {"altitudeAngle":altitudeAngle, "azimuthAngle":azimuthAngle};
}

4.2 ポインターイベントの種類

以下に本仕様で定義されるイベントタイプを示す。

プライマリポインターの場合、これらのイベント(gotpointercapturelostpointercapture を除く)は、互換マウスイベントも発火しうる。

4.2.1 pointerover イベント

ユーザーエージェントは、次のいずれかが発生したとき、MUST pointerover という名前のポインターイベントを発火しなければならない。

4.2.2 pointerenter イベント

ユーザーエージェントは、次のいずれかが発生したとき、MUST pointerenter という名前のポインターイベントを発火しなければならない。

このイベント型は pointerover に似ているが、2 つの 違いがある:pointerenter はバブルせず、またその 配送は、子孫要素であってもヒットテスト境界を考慮する。
このイベント型、[POINTEREVENTS4] で説明される mouseenter イベント、 および [CSS21] で説明される CSS :hover 疑似クラスの間には類似点がある。 pointerleave イベントも参照。

4.2.3 pointerdown イベント

ユーザーエージェントは、ポインターがアクティブボタン状態に入ったとき、MUST pointerdown という名前のポインターイベントを発火しなければならない。マウスでは未押下から少なくとも1つのボタン押下に遷移したとき、タッチではデジタイザに物理的に接触したとき、ペンではボタン未押下のままデジタイザに物理接触したとき、またはホバー中に未押下から少なくとも1つのボタン押下に遷移したときである。

注記
マウス(やその他の複数ボタンのポインターデバイス)では、pointerdown および pointerup は、mousedown および mouseup とまったく同じ状況で発火するわけではない。詳細は 複数ボタンの組み合わせ操作 を参照。

ホバーをサポートしない入力デバイスでは、ユーザーエージェントは、MUST pointerdown をディスパッチする前に、pointerover、続いて pointerenter という名前のポインターイベントも発火しなければならない。

注記
著者は、(isPrimary プロパティが true の場合)一部の互換マウスイベントの発火を、pointerdown イベントをキャンセルすることで防ぐことができる。これにより、そのポインターに PREVENT MOUSE EVENT フラグが設定される。ただし、mouseovermouseentermouseoutmouseleave の発火は防止されない点に注意。

4.2.4 pointermove イベント

ユーザーエージェントは、ポインターが pointerdownpointerup を発火させない種類のプロパティをいずれか変更したとき、MUST pointermove という名前のポインターイベントを発火しなければならない。これには、座標、圧力、接線圧、傾き、ねじれ、接触ジオメトリ(widthheight)、または 組み合わせボタン のいずれかの変化が含まれる。

ユーザーエージェントは、MAY パフォーマンス上の理由などにより、pointermove のディスパッチを遅延してもよい。 この場合、単一のディスパッチ済み pointermove に対して、合成イベント情報は getCoalescedEvents メソッドを通じて公開される。 このようなイベントの最終座標は、イベントのターゲット決定に使用されるべきである。

4.2.5 pointerrawupdate イベント

ユーザーエージェントは、MUST pointerrawupdate という名前のポインターイベントを発火 しなければならず、その発火は セキュアコンテキスト 内に限られる。これは、ポインターが pointerdownpointerup を発火しないプロパティを変更したときである。該当プロパティの一覧は pointermove イベントを参照。

pointermove と対照的に、ユーザーエージェントは pointerrawupdate を可能な限り早く、かつ JavaScript が処理可能な頻度でディスパッチするべきである(SHOULD)。

pointerrawupdatetarget は、pointermove のそれと異なる可能性がある。これは pointermove が遅延または合成され得るためであり、target 決定に用いられるイベントの最終位置が、その合成イベントの位置と異なり得るからである。

同一の pointerId を持ち、まだ イベントループ でディスパッチされていない別の pointerrawupdate がすでに存在する場合、ユーザーエージェントは、新規の pointerrawupdate を新たな タスクとして作成する代わりに、それに合成してもMAY。この結果、pointerrawupdate が合成イベントを持つことがあり、イベントループで処理され次第、それらは1つの pointerrawupdate の合成イベントとしてまとめて配信される。詳細は getCoalescedEvents を参照。

pointerrawupdatepointermove の順序に関して、プラットフォームからの更新が両イベントを引き起こす場合、ユーザーエージェントは、MUST 対応する pointermove より前に pointerrawupdate をディスパッチしなければならない。

target を除けば、最後の pointermove 以降にディスパッチされたすべての pointerrawupdate の合成イベントリストの連結は、次の pointermove の合成イベントと、他のイベント属性に関して同一である。pointerrawupdate の属性は、pointermove とほぼ同じだが、cancelable だけは pointerrawupdate に対して MUST false でなければならない。

ユーザーエージェントは、SHOULD 互換マウスイベントpointerrawupdate に対して発火しないべきである。

注記
pointerrawupdate のリスナーを追加すると、ユーザーエージェントの実装によってはページのパフォーマンスに悪影響を与える可能性がある。大半のユースケースでは他の pointerevent タイプで十分である。pointerrawupdate リスナーは、JavaScript が高頻度イベントを必要とし、同等の速度で処理できる場合にのみ追加すべきである。このような場合、他の種類のポインターイベントをリッスンする必要はおそらくない。

4.2.6 pointerup イベント

ユーザーエージェントは、ポインターがアクティブボタン状態を離れたとき、MUST pointerup という名前のポインターイベントを発火しなければならない。マウスでは少なくとも1つのボタン押下から未押下に遷移したとき、タッチではデジタイザから物理的な接触が離れたとき、ペンではボタン未押下でデジタイザとの物理接触が離れたとき、またはホバー中に少なくとも1つのボタン押下から未押下に遷移したときである。

ホバーをサポートしない入力デバイスでは、ユーザーエージェントは、MUST pointerup をディスパッチした後に、pointerout、続いて pointerleave という名前のポインターイベントも発火しなければならない。

すべての pointerup イベントにおいて、pressure の値は 0 である。

ユーザーエージェントは、ポインターが現在キャプチャされている場合、MUST ポインターキャプチャを暗黙的に解除しなければならない。

注記
マウス(やその他の複数ボタンのポインターデバイス)では、pointerdown および pointerup は、mousedown および mouseup とまったく同じ状況で発火するわけではない。詳細は 複数ボタンの組み合わせ操作 を参照。

4.2.7 pointercancel イベント

ユーザーエージェントは、ポインターイベントストリームを抑制するシナリオを検出したとき、MUST pointercancel という名前のポインターイベントを発火しなければならない。

pointercancel イベントの次のプロパティの値は、同じ pointerId を持つ最後に配送されたポインターイベントの値と一致しなければならない(MUST):widthheightpressuretangentialPressuretiltXtiltYtwistaltitudeAngleazimuthAnglepointerTypeisPrimary、および [POINTEREVENTS4] から継承される座標。pointercancel イベント内の coalescedEvents および predictedEvents リストは空でなければならず(MUST)、イベントの cancelable 属性は false でなければならない(MUST)。

4.2.8 pointerout イベント

ユーザーエージェントは、次のいずれかが発生したとき、MUST pointerout という名前のポインターイベントを発火しなければならない。

4.2.9 pointerleave イベント

ユーザーエージェントは、次のいずれかが発生したとき、MUST pointerleave という名前のポインターイベントを発火しなければならない。

このイベント型は pointerout に似ているが、2 つの 違いがある:pointerleave はバブルせず、またその 配送は、子孫要素であってもヒットテスト境界を考慮する。
このイベント型、[POINTEREVENTS4] で説明される mouseleave イベント、 および [CSS21] で説明される CSS :hover 疑似クラスの間には類似点がある。 pointerenter イベントも参照。

4.2.10 gotpointercapture イベント

ユーザーエージェントは、要素がポインターキャプチャを受け取ったとき、MUST gotpointercapture という名前のポインターイベントを発火しなければならない。このイベントはキャプチャを受ける要素で発火される。以後、そのポインターに関するイベントはこの要素で発火される。ポインターキャプチャの設定保留中のポインターキャプチャの処理 を参照。

4.2.11 lostpointercapture イベント

ユーザーエージェントは、ポインターのキャプチャが解除された後、MUST lostpointercapture という名前のポインターイベントを発火しなければならない。このイベントは、キャプチャが削除された要素で発火される。キャプチャ解除後の、そのポインターに関する後続のイベントは、clickauxclickcontextmenu イベントを除き、(本仕様の範囲外である)通常のヒットテストの仕組みに従ってイベントターゲットが決定される。ポインターキャプチャの解除ポインターキャプチャの暗黙的な解除、および 保留中のポインターキャプチャの処理 を参照。

4.2.12 clickauxclickcontextmenu イベント

この節は、[POINTEREVENTS4] で定義される clickauxclick および contextmenu イベントに対する追加である。これらのイベントは通常、ユーザーインターフェイスの有効化に結び付けられており、 キーボードなどの非ポインター入力デバイスからであっても発火される。

これらのイベントは MUST PointerEvent 型でなければならず、本セクションの残りで述べる追加要件の対象となる。

4.2.12.1 イベント属性

これらのイベントについて、本仕様(この spec)で定義される PointerEvent 固有属性は、pointerIdpointerType を除き、すべてデフォルト値でなければならない(MUST)。加えて:

  • イベントがポインティングデバイスによって生成された場合、それらの pointerIdpointerType は、これらのイベントを引き起こした PointerEvent と同一でなければならない(MUST)。
  • イベントが非ポインティングデバイス(音声認識ソフトウェアやキーボード操作など)によって生成された場合、pointerId-1 でなければならず(MUST)、pointerType は空文字列でなければならない(MUST)。
4.2.12.2 イベント座標

PointerEvent で述べたように、CSSOM View Module は、小数座標を許容するために、各種座標プロパティ (screenXscreenYpageXpageYclientXclientYxyoffsetXoffsetY)を double として再定義することを提案している。 しかし、この変更を通常の MouseEvent には適用せず、PointerEvent にのみ適用した場合、 clickauxclick、および contextmenu の場合に、 レガシーコードとの Web 互換性の問題につながることが判明している。この 理由により、CSSOM View Module における提案された 変更を PointerEvent に対してのみ実装したユーザーエージェントは、clickauxclick、および contextmenu の各種座標プロパティを、Math.floor [ECMASCRIPT] を用いて、(元の UI Events で定義される)long 値へ変換しなければならない(MUST)。

4.2.12.3 イベントのディスパッチ

clickauxclick、または contextmenu イベントは、イベント対象が 以下のアルゴリズムを用いて上書きされることを除き、[POINTEREVENTS4] 仕様で定義される配送プロセスに従わなければならない(MUST):

  1. event を、配送されている clickauxclick、または contextmenu イベントとし、userEventevent の発火を 引き起こしたユーザー操作イベントとする。

    イベント userEvent は非 PointerEvent でありうる;たとえば、 checkbox 要素上でスペースバーを押すことにより click イベント配送が 引き起こされる場合、それは KeyboardEvent である。

    userEventPointerEvent である場合、userEventclick または auxclick イベントに対しては pointerup であり、 contextmenu イベントに対しては(ネイティブプラットフォームの慣習に応じて) pointerdown または pointerup イベントのいずれかである。

  2. userEventPointerEvent でない場合、event 対象を上書きせずに [UIEVENTS] 仕様に従って event を配送し、 以下の残りのステップをスキップする。
  3. target を次のように定義する:

    eventcontextmenu イベントである、または userEvent が 対応するポインターがキャプチャされている間に配送されたなら、targetuserEvent の対象とする。

    そうでなければ(eventclick または auxclick イベントであり、 userEvent がキャプチャされずに配送された pointerup イベントである場合)、 target を、event が配送されている時点における DOM 内の、対応する pointerdown 対象と pointerup 対象の最も近い共通包含祖先とする。

  4. [UIEVENTS] 仕様に従って、eventtarget へ配送する。

    userEvent がキャプチャされていた場合、同じ lostpointercapture イベントが、同じ pointerId ですでに 配送されていたとしても、eventuserEvent のキャプチャ対象へ 配送される。

5. Element インターフェースの拡張

次のセクションでは、ポインターキャプチャの設定および解除を容易にするため、既存の Element インターフェースへの拡張について説明する。

WebIDLpartial interface Element {
  undefined setPointerCapture (long pointerId);
  undefined releasePointerCapture (long pointerId);
  boolean hasPointerCapture (long pointerId);
};
setPointerCapture()

引数の pointerId で識別されるポインターについて、ポインターキャプチャを設定し、このメソッドが呼び出された要素にキャプチャする。以後そのポインターのイベントに対しては、キャプチャ先ターゲットが通常のヒットテスト結果を置き換え、ポインターが常にキャプチャ先ターゲット上にあるかのように扱われ、キャプチャが解除されるまで常にこの要素をターゲットにしなければならない(MUST)。このメソッドが有効になるには、ポインターが アクティブボタン状態 にある必要があり、そうでない場合は黙って失敗する。与えられたメソッド引数がいずれのアクティブなポインターとも一致しない場合は、throw を行い、"NotFoundError" の DOMException を投げる。

releasePointerCapture()

引数の pointerId で識別されるポインターについて、ポインターキャプチャを解除し、このメソッドが呼び出された要素から解放する。以後そのポインターのイベントは、イベントターゲットの決定にあたり(本仕様の範囲外である)通常のヒットテストの仕組みに従う。与えられたメソッド引数がいずれのアクティブなポインターとも一致しない場合は、throw を行い、"NotFoundError" の DOMException を投げる。

hasPointerCapture

このメソッドが呼び出された要素が、引数の pointerId で識別されるポインターに対して ポインターキャプチャ を保持しているかどうかを示す。特に、保留中のポインターキャプチャのターゲット上書き が、pointerId に対してこの要素に設定されている場合は true を返し、そうでない場合は false を返す。

注記
このメソッドは、setPointerCapture() を呼び出した直後に、当該要素がまだ gotpointercapture イベントを受け取っていなくても、true を返す。そのため、暗黙のポインターキャプチャ を、pointerdown イベントリスナー内から検出するのに有用である。

6. GlobalEventHandlers ミックスインの拡張

次のセクションでは、イベントハンドラーの登録を容易にするため、既存の GlobalEventHandlers ミックスインへの拡張について説明する。

WebIDLpartial interface mixin GlobalEventHandlers {
    attribute EventHandler onpointerover;
    attribute EventHandler onpointerenter;
    attribute EventHandler onpointerdown;
    attribute EventHandler onpointermove;
    [SecureContext] attribute EventHandler onpointerrawupdate;
    attribute EventHandler onpointerup;
    attribute EventHandler onpointercancel;
    attribute EventHandler onpointerout;
    attribute EventHandler onpointerleave;
    attribute EventHandler ongotpointercapture;
    attribute EventHandler onlostpointercapture;
};
onpointerover
イベントハンドラー IDL 属性pointerover イベントタイプ用。
onpointerenter
イベントハンドラー IDL 属性pointerenter イベントタイプ用。
onpointerdown
イベントハンドラー IDL 属性pointerdown イベントタイプ用。
onpointermove
イベントハンドラー IDL 属性pointermove イベントタイプ用。
onpointerrawupdate
イベントハンドラー IDL 属性pointerrawupdate イベントタイプ用。
onpointerup
イベントハンドラー IDL 属性pointerup イベントタイプ用。
onpointercancel
イベントハンドラー IDL 属性pointercancel イベントタイプ用。
onpointerout
イベントハンドラー IDL 属性pointerout イベントタイプ用。
onpointerleave
イベントハンドラー IDL 属性pointerleave イベントタイプ用。
ongotpointercapture
イベントハンドラー IDL 属性gotpointercapture イベントタイプ用。
onlostpointercapture
イベントハンドラー IDL 属性lostpointercapture イベントタイプ用。

7. Navigator インターフェースの拡張

Navigator インターフェースは [HTML] で定義されている。本仕様は、デバイス検出のサポートを提供するために Navigator インターフェースを拡張する。

WebIDLpartial interface Navigator {
    readonly  attribute long maxTouchPoints;
};
maxTouchPoints

デバイスがサポートする同時タッチ接点の最大数。複数のデジタイザ(例:複数のタッチスクリーン)を備えるデバイスの場合、値は各デジタイザでサポートされる最大接点数の集合の最大値でなければならない(MUST)。

例えば、あるデバイスに 3 つのタッチスクリーンがあり、それぞれが 2、5、10 の同時タッチ接点をサポートするとする。このとき maxTouchPoints の値は 10 となる。

注記
maxTouchPoints の値が 0 より大きいことは、ユーザーのデバイスがタッチ入力をサポート可能であることを示すが、ユーザーが必ずしもタッチ入力を使用するという意味ではない。著者は、マウス、ペン、スクリーンリーダーなど、システムに存在しうる他の入力モダリティも考慮するよう注意すべきである。
注記
maxTouchPoints は、コンテンツのインタラクションモデルが現在のハードウェアで認識可能であることを保証するためにしばしば用いられる。性能の低いハードウェアを持つユーザーには UI 上の工夫を提供できる。正確なタッチポイント数が不明なプラットフォームでは、認識が保証される最小数が提供される。そのため、実際に認識されるタッチポイント数が maxTouchPoints の値を上回る可能性がある。

8. 直接操作の挙動の宣言

属性と既定の動作 で述べたように、ビューポートの操作(パンおよびズーム)は、ポインターイベントをキャンセルしても抑止できない。代わりに、著者はどの挙動を許可し、どれを抑止するかを、touch-action CSS プロパティを用いて宣言的に定義しなければならない。

注記
ビューポートの操作に用いられるポインターの問題は一般的にはタッチ入力に限定される(ユーザーの指がコンテンツと相互作用する一方でページのパン/ズームも行えるため)が、特定のユーザーエージェントは他のポインター種別に対しても同種の(直接/間接の)操作を許可する場合がある。例えば、モバイル/タブレット端末では、スタイラスでもスクロールできることがある。歴史的経緯から、本仕様で定義する touch-action CSS プロパティはタッチ入力のみに言及しているように見えるが、実際にはパンやズームのための直接操作を可能にするあらゆるポインター入力に適用される。

8.1 touch-action CSS プロパティ

Name: touch-action
Value: auto | none | [ pan-x || pan-y ] | manipulation
Initial: auto
Applies to: 以下を除くすべての要素:非置換インライン要素、表の行、行グループ、表の列、および列グループ
Inherited: no
Percentages: N/A
Media: visual
Computed value: 指定値と同じ
Canonical order: 文法順
Animation type: アニメーション不可

touch-action CSS プロパティは、(プロパティ名に反してタッチに限定されない)直接操作の相互作用がユーザーエージェントのパンおよびズームの挙動を引き起こしてよいか(MAY)を決定する。touch-action の値のセクションを参照。

パンやズームを開始する直前に、以下のすべての条件が真であれば、ユーザーエージェントMUST ポインターイベントストリームを抑制しなければならない。

一部のユーザーエージェントは、一連の 別々の離散的なジェスチャを含むが、すべて単一の連続したジェスチャの一部として扱われる挙動のために、 複雑なジェスチャを実装する。たとえば、タッチスクリーン上の「フリングしてスクロール」ジェスチャを考える: ユーザーが素早い指の動きで文書のパンを開始し、タッチスクリーンから指を離すと、文書はシミュレートされた慣性で パンを継続する。文書がまだ動いている間に、ユーザーはタッチスクリーン上に指を置いて別の「フリング」を実行し、 パンにさらなる運動量を与えたり、現在のパンに逆らってそれを遅くしたり、パンを完全に停止したり、 パンの方向を反転させたりすることができる。この仕様は、ジェスチャおよび挙動がどのように 実装されるかを規範的に定義しないため、2 回目のタッチが(2 回目の「フリング」または現在のパンへの対抗として 解釈される前に)ポインターイベントを発火するかどうかを決定することは、ユーザーエージェントに委ねられる。
touch-action は埋め込み閲覧コンテキストには適用されず、またカスケードしない。 たとえば、touch-action<iframe> に適用しても、 <iframe> 自体の内部でのパンおよびズームのための直接操作インタラクションの挙動には 何の効果もない。

8.2 サポートされる直接操作の挙動の判定

ユーザーが直接操作ポインター(タッチスクリーンのタッチやスタイラスなど)で要素と相互作用する場合、その入力の効果は、以下のように、touch-action プロパティの値と、当該要素およびその祖先の既定の直接操作の挙動によって決定される。

注記
一部のユーザーエージェントは、複数の同時ポインター(例:マルチタッチ)によるパンおよびズームの相互作用をサポートする。複数の同時ポインターの touch-action 値を処理または関連付ける方法は本仕様の範囲外である。

8.3 touch-action の値の詳細

touch-action プロパティは、ビューポートのパンおよびズームに関連する直接操作の挙動を対象とする。テキスト選択/ハイライト、リンクやフォームコントロールのアクティベーションなど、その他のユーザーエージェントの挙動は、この CSS プロパティによって影響を受けてはならない(MUST NOT)。

注記
「パン」と「スクロール」は同義と見なされる(より正確には、「パン」は直接操作入力による「スクロール」)。パン/スクロールや、autonone の値に対する挙動を引き起こすための相互作用/ジェスチャーの定義は本仕様の範囲外である。
auto
ユーザーエージェントは、当該要素上で始まるビューポートのパンおよびズームに関連する許可された直接操作の挙動を考慮してもよい(MAY)。
none
当該要素上で始まる直接操作の相互作用は、ビューポートのパンおよびズームに関連する挙動を引き起こしてはならない(MUST NOT)。
pan-x
pan-y
ユーザーエージェントは、当該要素上で始まる直接操作の相互作用のうち、列挙された値のすべてで指定された方向のいずれかで開始するパンに限って考慮してもよい(MAY)。パンが開始された後は、たとえ逆方向から開始するパンが不許可であっても、ユーザーは方向を反転できる。対照的に、(pan-x または pan-y により)パンが単一の軸に制限されている場合、パン中に軸を変更することはできない。
manipulation
ユーザーエージェントは、当該要素上で始まる直接操作の相互作用のうち、パンと連続的なズーム(ピンチズームなど)の目的に限り考慮してもよい(MAY)。一方、一定時間内に複数回のアクティベーションを必要とするその他の関連挙動(ダブルタップでズーム、ダブルタップ長押しによる片手ズームなど)を引き起こしてはならない(MUST NOT)。
追加の touch-actionのうち実装で一般的なものは、[COMPAT] で定義される。
touch-action プロパティは、CSS の width および height プロパティの両方をサポートする要素にのみ適用される ([CSS21] を参照)。 この制限は、パンおよびズームのための低レイテンシー直接操作に対するユーザーエージェントの最適化を促進するよう設計されている。既定では サポートされない要素、たとえば非置換インライン 要素である <span> などについては、作者は display CSS プロパティを、 width および height をサポートする block などの値に設定できる。将来の仕様は この API をすべての要素へ拡張する可能性がある。

方向固有の pan 値は、一部のオーバースクロール挙動をカスタマイズするのに有用である。 たとえば、単純なプルツーリフレッシュ効果を実装するには、スクロール位置が 0 のときは文書の touch-actionpan-x pan-down に設定し、 それ以外の場合は pan-x pan-y に設定できる。 これにより、ポインターイベントハンドラーは、文書の先頭から開始する上方向のパン/スクロールの 挙動を定義できる。

方向固有の pan 値は、ネイティブにスクロールする要素内でポインターイベント処理による カスタムパンを実装するコンポーネントを構成するためにも使用できる(または その逆も同様である)。 たとえば、画像カルーセルは、文書の垂直方向のパンを妨げることなく、任意の水平方向のパン操作について ポインターイベントを受け取ることを確保するために pan-y を使用できる。 カルーセルが最右端に達したとき、その touch-actionpan-y pan-right に変更することで、その範囲を超える後続のスクロール操作が、可能であれば ビューポート内の文書をスクロールできるようにすることができる。 パン/スクロール操作が行われている間に、その挙動を変更することはできない。

パンおよびズームのための一部の既定の直接操作挙動を無効にすると、 ユーザーエージェントが他の挙動により迅速に応答できる場合がある。たとえば、auto では、ユーザー エージェントは通常、ダブルタップジェスチャを処理できるようにするために、click の前に 300ms の遅延を追加する。 このような場合、touch-action: none または touch-action: manipulation を明示的に設定すると、この遅延は取り除かれる。タップまたは ダブルタップジェスチャを判定する方法は、この仕様の範囲外であることに注意。
Example 6: すべての直接操作の挙動を不許可にする
<div style="touch-action: none;">
    This element receives pointer events for all direct manipulation interactions that otherwise lead to panning or zooming.
</div>
Example 7: 水平パンのみを許可する
<div style="touch-action: pan-x;">
    This element receives pointer events when not panning in the horizontal direction.
</div>
Example 8: パンとズームの直接操作の挙動を不許可にする子領域
<div style="overflow: auto;">
    <div style="touch-action: none;">
        This element receives pointer events for all direct manipulation interactions that otherwise lead to panning or zooming.
    </div>
    <div>
        Direct manipulation interactions on this element MAY be consumed for manipulating the parent.
    </div>
</div>
Example 9: パンとズームの直接操作の挙動を不許可にする中間の親
<div style="overflow: auto;">
    <div style="touch-action: pan-y;">
        <div style="touch-action: pan-x;">
            This element receives pointer events for all direct manipulation interactions because
            it allows only horizontal panning yet an intermediate ancestor
            (between it and the scrollable element) only allows vertical panning.
            Therefore, no direct manipulation behaviors for panning/zooming are
            handled by the user agent.
        </div>
    </div>
</div>

9. ポインターキャプチャ

9.1 導入

このセクションは参考であり、規範的ではない。

ポインターキャプチャを用いると、特定のポインターに関するイベント(互換マウスイベントを含む)を、通常のポインター位置のヒットテスト結果とは異なる特定の要素へリターゲットできる。これは、カスタムスライダーコントロール(例えば [HTML] の <input type="range"> コントロールに類似)などの場面で有用である。スライダーのつまみ要素にポインターキャプチャを設定することで、ポインターがつまみから外れても、ユーザーはコントロールを前後にスライドできる。

カスタム音量スライダー
Figure 6 つまみ要素を前後にスライドして値を選択するカスタムスライダーの例。つまみに対して pointerdown が行われた後、ポインターキャプチャを用いると、ポインターがつまみから外れてもスライドできる。

9.2 ポインターキャプチャの設定

ポインターキャプチャは、Element 型の element に対して element.setPointerCapture(pointerId) メソッドを呼び出すことで設定される。 このメソッドが呼び出されたとき、ユーザーエージェントは以下の手順をMUST 実行する。

  1. pointerId としてメソッドの 引数に与えられたものが、いずれのアクティブポインターにも一致しないなら、"NotFoundError" DOMException投げる
  2. pointer を、与えられた pointerId によって指定されるアクティブポインターとする。
  3. element接続済みでないなら [DOM]、"InvalidStateError" DOMException投げる
  4. elementノード文書 [DOM] が ロックされた要素([PointerLock] pointerLockElement)を持つ間に このメソッドが呼び出されたなら、"InvalidStateError" DOMException投げる
  5. pointerアクティブボタン状態にない、または elementノード文書pointerアクティブ文書でないなら、これらのステップを終了する。
  6. 指定されたpointerId について、保留中のポインターキャプチャ対象オーバーライドを、このメソッドが呼び出されたElement に設定する。
ポインターキャプチャを設定または解放する呼び出しが、以前の設定または解放の呼び出しが 保留中の状態にある間に行われた場合(保留中のポインター キャプチャを処理するを参照)、2 回目の呼び出しが成功すれば、2 回目の呼び出しが 1 回目の呼び出しを上書きし、 そうでなければ 1 回目の呼び出しは有効なままである。これは、pointerdown リスナーで暗黙的ポインターキャプチャを解放しようとして失敗した場合にも当てはまる。

9.3 ポインターキャプチャの解除

ポインターキャプチャは、要素に対して element.releasePointerCapture(pointerId) メソッドを明示的に呼び出すことで解除される。このメソッドが呼び出されたとき、ユーザーエージェントは以下の手順をMUST 実行する。

  1. メソッド引数として提供された pointerId が、いずれのアクティブなポインターにも一致せず、かつこれらの手順がポインターキャプチャの暗黙的な解除の結果として呼び出されていない場合、throw を行い、"NotFoundError" の DOMException を投げる。
  2. 指定された pointerId に対し、当該 ElementhasPointerCapture が false の場合、これらの手順を終了する。
  3. 指定された pointerId について、設定されていれば 保留中のポインターキャプチャのターゲット上書きをクリアする。
注記
セクション ポインターキャプチャの設定 の注記を参照。

9.4 暗黙のポインターキャプチャ

パンおよびズームの直接操作の相互作用を実装する入力(タッチスクリーンでのタッチやスタイラスなど)は、setPointerCapture が、任意の pointerdown リスナーの呼び出し直前にターゲット要素で呼ばれたかのように、正確に振る舞うべきである(SHOULD)。例えば(pointerdown リスナー内などで)hasPointerCapture API を用いて、これが行われたかどうかを判定できる。次のポインターイベントが発火する前に当該ポインターに対して releasePointerCapture が呼ばれない場合、キャプチャが有効であることを示す gotpointercapture イベントが(通常どおり)ターゲットにディスパッチされる。

注記
これは [PointerEvents] からの破壊的変更だが、既存のコンテンツの大多数には影響しない。典型的なプラットフォーム UX の慣習に合致することに加え、暗黙のキャプチャのこの設計により、ユーザーエージェントはヒットテストを明示的に開発者がオプトインしない限り、タッチ移動イベントで呼び出す必要をなくすパフォーマンス最適化(既存の主要なネイティブ/ウェブ API のタッチ入力におけるパフォーマンス特性と一致)を実現できる。
注記
加えて、ユーザーエージェントは、特定の UI ウィジェット(入力レンジコントロールなど)に対し、すべての入力デバイスで暗黙のポインターキャプチャ挙動を実装してもよい(相互作用の間、フォームコントロール自体の外にある程度指がはみ出すことを許容する)。

9.5 ポインターキャプチャの暗黙的な解除

pointerup または pointercancel イベントを発火した直後に、 ユーザーエージェントは、当該イベントの pointerup または pointercancelpointerId について、保留中のポインターキャプチャのターゲット上書き をクリアし、 その後 保留中のポインターキャプチャの処理 手順を実行して、必要に応じて lostpointercapture を発火しなければならない(MUST)。 保留中のポインターキャプチャの処理 を実行した後、ポインターがホバーをサポートする場合、ユーザーエージェントはキャプチャなしの現在位置を反映するのに必要な境界イベントも送信しなければならない(MUST)。

ポインターキャプチャのターゲット上書き が [DOM] の接続済みでなくなった場合、 ポインターキャプチャのターゲット上書き はドキュメントに設定されるべきである(SHOULD)。

保留中のポインターキャプチャのターゲット上書き が [DOM] の接続済みでなくなった場合、 保留中のポインターキャプチャのターゲット上書き ノードはクリアされるべきである(SHOULD)。

注記
直前の 2 つの段落の結果として、キャプチャされたポインターに対応する lostpointercapture イベントが、 キャプチャノードが削除された後、次回の 保留中のポインターキャプチャの処理 の際にドキュメントで発火される。

要素に対してポインターロック([PointerLock])が正常に適用された場合、ユーザーエージェントは、いずれかの要素がキャプチャ中もしくはキャプチャ予定であるなら、releasePointerCapture メソッドが呼ばれたかのように手順を実行しなければならない(MUST)。

10. 合成イベントと予測イベント

注記
本仕様は、ユーザーエージェントがポインター移動データをどのように合成(coalesce)または予測するかを定義しない。ここでは、この情報へアクセスするための API のみを規定する。

10.1 合成イベント

パフォーマンス上の理由から、ユーザーエージェントはポインターのpointermoveイベントを、ポインターの測定可能プロパティ (座標、圧力、接線圧、傾き、ねじれ、接触ジオメトリなど)が更新される度に必ずしも送信しない選択を行うかもしれない。代わりに複数の変化を 1 つの pointermove または pointerrawupdate イベントに合成(結合/統合)する場合がある。この手法は ユーザーエージェントMUST 行うイベント処理量を減らすのに役立つ一方で、特に高速かつ大きな移動においてポインター位置追跡の粒度と忠実度を低下させる。getCoalescedEvents メソッドを用いることで、アプリケーションは未合成の生の位置変化へアクセスでき、より精密なポインター移動データ処理が可能となる。例えば描画アプリケーションでは、未合成イベントを用いてポインターの実際の動きにより近い滑らかな曲線を描画できる。

曲線の拡大図。合成済みと未合成ポイントの比較
Figure 7 描画アプリケーションにおける曲線の例 — pointermove イベントの合成済み座標(灰色の点)のみを使うと、線は角ばってギザギザになる;getCoalescedEvents() が提供するより細かいポイント(赤い円)で同じ線を描画すると、ポインター移動をより滑らかに近似できる。

PointerEvent は関連付けられた 合成イベントリスト(0 個以上の PointerEvent のリスト)を持つ。信頼できる(trusted) pointermove および pointerrawupdate イベントの場合、このリストはそのイベントへ合成されたすべての PointerEvent の列である。信頼できる「親」pointermovepointerrawupdate イベントはこれら合成イベントの蓄積結果を表すが、(ディスプレイのリフレッシュレートに合わせるなど)追加処理を含む場合がある。その結果、これらイベントの合成イベントリストには常に少なくとも 1 つのイベントが含まれる。その他のすべての信頼できるイベントタイプでは空リストとなる。信頼されない(untrusted)イベントでは、合成イベントリストはコンストラクタに渡された値で初期化される。

注記
信頼できる親イベントは合成イベントの要約/集約であるため、開発者は親イベントかすべての合成イベントかのどちらか一方のみを処理すればよく、両方を処理する必要はない。
注記
信頼できるイベント(合成イベントリストを含む)が JavaScript から再ディスパッチされた場合、イベントディスパッチアルゴリズムはイベントの isTrusted ビットを false に設定するが、合成イベントリスト内の同一ビットは元の true のまま変更されない。

信頼できるイベントの合成イベントリスト内のイベントは以下を持つ:

Example 10: 合成イベントリストを利用する基本的なキャンバス描画アプリ
<style>
    /* キャンバス要素上の全イベントをアプリ側で受け取るため、
    既存のユーザーエージェントの直接操作(パンやズームなど)を無効化する。 */

    canvas { touch-action: none; }
</style>

<canvas id="drawSurface" width="500px" height="500px" style="border:1px solid black;"></canvas>

<script>
    const canvas = document.getElementById("drawSurface"),
    context = canvas.getContext("2d");

    canvas.addEventListener("pointermove", (e)=> {

        if (e.getCoalescedEvents) {
            for (let coalesced_event of e.getCoalescedEvents()) {
                paint(coalesced_event); // 生(未合成)ポイントをすべて描画
            }
        } else {
            paint(e); // 最終的に合成されたポイントを描画
        }
    });

    function paint(event) {
        if (event.buttons>0) {
            context.fillRect(event.clientX, event.clientY, 5, 5);
        }
    }

</script>
注記
PointerEvent の属性は、合成イベントリスト内のイベントを最も適切に表現できるよう初期化される。ユーザーエージェントがこれを行う具体的手順は本仕様では扱わない。

これらディスパッチされたイベントの順序は、元のイベントの実際の順序と一致していなければならない(MUST)。例えば、ある pointerdown イベントが合成 pointermove イベント群のディスパッチを引き起こす場合、ユーザーエージェントはまずその pointerId の合成イベントをすべて含む 1 つの pointermove イベントをディスパッチし、その後で pointerdown イベントをディスパッチしなければならない。

注記

以下は増加する timeStamp 値を伴う実際のイベントと、ユーザーエージェントがディスパッチするイベントの例である。

実際のイベント ディスパッチされたイベント
ポインター (pointerId=2) 座標変更 pointerrawupdate (pointerId=2) 合成イベント 1 件
ポインター (pointerId=1) 座標変更 pointerrawupdate (pointerId=1) 合成イベント 1 件
ポインター (pointerId=2) 座標変更 pointerrawupdate (pointerId=2) 合成イベント 1 件
ポインター (pointerId=2) 座標変更 pointerrawupdate (pointerId=2) 合成イベント 1 件
ポインター (pointerId=1) 座標変更 pointerrawupdate (pointerId=1) 合成イベント 1 件
ポインター (pointerId=2) 座標変更 pointerrawupdate (pointerId=2) 合成イベント 1 件
ポインター (pointerId=1) ボタン押下 pointermove (pointerId=1) 合成イベント 2 件
pointermove (pointerId=2) 合成イベント 4 件
pointerdown (pointerId=1) 合成イベント 0 件
ポインター (pointerId=2) 座標変更 pointerrawupdate (pointerId=2) 合成イベント 1 件
ポインター (pointerId=2) 座標変更 pointerrawupdate (pointerId=2) 合成イベント 1 件
ポインター (pointerId=1) ボタン解放 pointermove (pointerId=2) 合成イベント 2 件
pointerup (pointerId=1) 合成イベント 0 件

10.2 予測イベント

一部のユーザーエージェントには、確定したポインター移動の一連の後で、現在のジェスチャーにおける直前のイベントや移動の速度/軌道に基づき、将来のポインター移動の位置を予測できるアルゴリズムが組み込まれている。アプリケーションはこの情報を getPredictedEvents メソッドで利用し、知覚遅延を減らすために先読み描画を行い、実際のポイントが到着したら予測ポイントを破棄できる。

合成ポイントで描画された線と、将来の予測ポイント
Figure 8 描画アプリケーションの線の例(左下から右上へのジェスチャー結果)。pointermove イベントの合成座標に加え、ユーザーエージェントの予測する将来ポイント(灰色の円)を表示。

PointerEvent は関連付けられた 予測イベントリスト(0 個以上の PointerEvent のリスト)を持つ。信頼できる pointermove イベントでは、ユーザーエージェントが将来続くと予測する PointerEvent の列である。その他の信頼できるイベントタイプでは空リストとなる。信頼されないイベントでは、予測イベントリストはコンストラクタに渡された値で初期化される。

pointerrawupdate イベントは空でない合体イベントリストを持つ可能性があるが、 その予測イベントリストは、性能上の理由から、 通常は空リストになる。

予測イベントリストを含む信頼済みイベントが JavaScript から再配送されると、イベント配送アルゴリズムはそのイベントの isTrusted ビットを false に設定するが、予測 イベントリスト内の同じビットは、元の true 値のまま変更されない。

リスト内のイベント数と、それらが現在のタイムスタンプからどれだけ離れているかは、 ユーザーエージェントおよびそれが使用する予測アルゴリズムによって決定される。

信頼済みイベントの予測イベントリスト内のイベントは、次を持つ:

作者は、次のポインターイベントが配送されるまでの間だけ、予測イベントを有効な予測とみなすべきであることに 注意。ユーザーエージェントがどれだけ未来までイベントを予測するかによっては、 通常のポインターイベントが、1 つ以上の予測イベントのタイムスタンプよりも早く配送される可能性がある。

Example 11: 合成イベントと予測イベントを用いた描画の概念的アプローチ

let predicted_points = [];
window.addEventListener("pointermove", function(event) {
    // 以前に描画した予測ポイントをクリア。
    for (let e of predicted_points.reverse()) {
        clearPoint(e.pageX, e.pageY);
    }

    // 最後に受け取ったイベント以降に実際に発生した移動を描画。
    for (let e of event.getCoalescedEvents()) {
        drawPoint(e.pageX, e.pageY);
    }

    // 知覚遅延を減らすため、現在の予測ポイントを描画。
    predicted_points = event.getPredictedEvents();
    for (let e of predicted_points) {
        drawPoint(e.pageX, e.pageY);
    }
});

10.3 合成イベントリストと予測イベントリストの充填および維持

信頼できる PointerEvent が生成されたとき、ユーザーエージェントは、合成イベントリスト および 予測イベントリスト の各イベントに対して以下の手順を実行すべきである(SHOULD)。

  1. イベントの pointerIdpointerTypeisPrimaryisTrusted を「親」ポインターイベントの対応するプロパティに一致させる。
  2. イベントの cancelable および bubbles を false に設定(これらイベントは単独でディスパッチされることがないため)。
  3. イベントの 合成イベントリスト および 予測イベントリスト を空リストに設定。
  4. その他すべての属性を既定の PointerEvent 値に初期化する。

信頼できる PointerEventtarget が変更されたとき、ユーザーエージェントは 合成イベントリスト および 予測イベントリスト の各イベントに対し以下を実行すべきである(SHOULD)。

  1. イベントの target を親ポインターイベントの target と一致させる。

11. マウスイベントとの互換マッピング

現在存在するウェブコンテンツの大多数は Mouse Events のみを対象に記述されている。以下では、ユーザーエージェント がこのコンテンツとの互換性のために汎用ポインター入力をマウスイベントへマッピングする方法のアルゴリズムを説明する(MAY)。

マウスイベントとの互換マッピングは本仕様の任意(OPTIONAL)機能である。ユーザーエージェントは既存のレガシーコンテンツとの互換性を最大化するため、この機能をサポートすることが推奨される。

注記

高レベルでは、互換マウスイベントは対応するポインターイベントと「インターリーブ」されることを意図している。しかし、この具体的な順序は必須ではなく、互換マウスイベントを実装するユーザーエージェントは、相対順序が一貫している限り、マウスイベントのディスパッチを遅延またはグループ化してもよい(MAY)。

特にタッチスクリーン入力の場合、ユーザーエージェントは(著者が touch-action により明示的に抑止しない限り)ジェスチャー認識のため追加のヒューリスティクスを適用するかもしれない。pointerdown から pointerup までのイベント列において、ジェスチャー認識はジェスチャーの検出/無視のため pointerup まで待機する必要がある場合がある。その結果、相互作用が特定のジェスチャーを意図していないと判断された場合は、シーケンス全体の互換マウスイベントが最後の pointerup イベント後にまとめてディスパッチされる可能性がある。これらジェスチャー認識の詳細は本仕様で定義されず、実装間で差異がありうる。

互換マウスイベントへの対応に関係なく、ユーザーエージェントは常に clickauxclickcontextmenu イベントをサポートしなければならない(MUST)。これらのイベントは PointerEvent 型であり、互換マウスイベント ではないためである。ポインターイベント中に preventDefault を呼び出しても、clickauxclickcontextmenu が発火するかどうかには影響を与えてはならない(MUST NOT)。

注記

一部高レベルイベント(contextmenufocusblur など)のポインターイベントとの相対順序は未定義であり、ユーザーエージェント間で異なる。例えば、あるユーザーエージェントでは contextmenupointerup の後に続くことが多い一方、別のユーザーエージェントでは pointeruppointercancel に先行する場合があり、状況によっては対応するポインターイベントなしに(キーボード操作などの結果として)発火することもある。

さらに、ユーザーエージェントは clickauxclickcontextmenu イベントを発火すべきかどうかを判断する独自のヒューリスティクスを適用する場合がある。同種の他の(非プライマリ)ポインターや別タイプの他のプライマリポインターが存在する場合、これらイベントを発火しない選択をすることがある。また、指の接触中に過度の移動が含まれるなど「クリーン」なタップ/クリック/長押しと見なされない行為について、clickauxclickcontextmenu を発火しない場合がある。これらユーザーエージェントの挙動は本仕様で定義されず、実装間で差異がありうる。

特に断りがない限り、マッピングされた任意のマウスイベントのターゲットは、対象のポインターイベントと同一であるべきである(SHOULD)。ただしターゲットがもはやその ownerDocument のツリーに参加していない場合は、マウスイベントは当該ターゲットがツリーから除去された時点での最も近い祖先ノード(依然として ownerDocument のツリーに参加している)で発火されるべきであり、そのノードに基づく新しいイベントパスがマウスイベント用に構築される。

著者は pointerdown イベントをキャンセルすることで、特定の互換マウスイベントの生成を防ぐことができる。

マウスイベントはポインターが押下状態(down)のときのみ防ぐことができる。ホバー中のポインター(例:ボタン未押下のマウス)はそのマウスイベントを防止できない。

mouseovermouseoutmouseentermouseleave イベントは(ポインターが押下状態でも)決して防止されない。

互換マウスイベントは、ポインターイベントの EventListenerpassive [DOM] に設定されている場合は防止できない。

11.1 レガシーマウスポインターの有効位置の追跡

プライマリポインターだけが互換性マウスイベントを生成できるが、複数のプライマリポインターが同時にアクティブになり、それぞれが 独自の互換性マウスイベントを生成できる。MouseEvents に依存するスクリプトとの互換性のために、 マウス遷移イベント(mouseovermouseoutmouseenter および mouseleave)は、単一の レガシーマウス入力の移動をシミュレートするべきである(SHOULD)。 これは、すべてのイベント対象について入退場状態が、[POINTEREVENTS4] に従って有効であることを意味する。ユーザーエージェントは、 文書内のレガシーマウスポインターの有効位置を次のように維持することによって、 これを保証するべきである(SHOULD)。

pointerdownpointeruppointermove イベント、または window での pointerleave イベントを発火する直前に、ユーザーエージェントは以下の手順を実行すべきである(SHOULD)。

  1. T を、配送されている pointerdownpointerup、または pointermove イベントの対象とする。pointerleave イベントについては、T を未設定にする。
  2. T と現在のレガシーマウスポインターの有効位置が どちらも未設定である、またはそれらが等しいなら、これらのステップを終了する。
  3. 現在のレガシー マウスポインターの有効位置から T へ移動するマウスについて、[POINTEREVENTS4] に従って mouseovermouseoutmouseenter および mouseleave イベントを配送する。現在のレガシーマウスポインターの有効位置または T のいずれかの未設定値は、ウィンドウ外のマウス位置とみなす。
  4. レガシーマウスポインターの有効位置T に設定する。
注記

レガシーマウスポインターの有効位置 は、ポインター遷移イベント(pointeroverpointeroutpointerenterpointerleave)と対応するレガシーマウス遷移イベント(mouseovermouseoutmouseentermouseleave)を常に直接 1 対 1 でマッピングできるわけではないことを表す。次のアニメーションは、単一のレガシーマウス入力で 2 つのプライマリポインターを調停するために、ユーザーエージェントがポインター遷移イベントより多くのレガシーマウス遷移イベントをディスパッチする必要があるケースを示す。

Figure 9 同時発生するマウスポインター(白いカーソル)とタッチポインター(白い「手」カーソル)が、単一のレガシーマウス入力(オレンジのカーソル)を 2 つのポインター間で移動させる例。

このアニメーションでは、マウスクリックとタッチタップの間の時間に着目すると、ボタン 1 は pointerout を受け取らない(「実際の」マウスポインターがその期間中にボタン矩形を離れていないため)が、タッチタップで レガシーマウスポインターの有効位置 がボタン 2 へ移動した際には mouseout を受け取る。同様に、タッチタップとマウスがボタン 1 を離れる直前の間、ボタン 1 は同じ理由で pointerover を受け取らないが、レガシーマウスポインターの有効位置 が再びボタン 1 内に戻った際 mouseover を受け取る。

11.2 ホバーをサポートするデバイスのマッピング

ユーザーエージェントがホバーをサポートするデバイスのポインターイベントをディスパッチする際は、以下の手順を実行すべきである(SHOULD)。

  1. ディスパッチ対象のポインターイベントの isPrimary プロパティが false の場合、ポインターイベントをディスパッチして手順を終了する。
  2. ディスパッチ対象のポインターイベントが pointerdownpointeruppointermove イベント、または window での pointerleave イベントなら、レガシーマウスポインターの有効位置の追跡 で述べる互換マウス遷移イベントをディスパッチする。
  3. ポインターイベントをディスパッチする。
  4. ディスパッチされたポインターイベントが pointerdown で、イベントが キャンセル された場合、当該 pointerType に対して PREVENT MOUSE EVENT フラグを設定する。
  5. PREVENT MOUSE EVENT フラグが当該 pointerType に設定されていない場合、かつディスパッチされたポインターイベントが以下のいずれかであれば:
  6. ディスパッチされたポインターイベントが pointerup または pointercancel の場合、当該 pointerTypePREVENT MOUSE EVENT フラグをクリアする。

11.3 ホバーをサポートしないデバイスのマッピング

多くのタッチスクリーンのように、アクティブ状態でない間に座標(または座標集合)をホバーできないデバイスがある。既存の多くのマウスイベント向けコンテンツは入力としてマウスを仮定し、一般に以下が成り立つ:

注記
ホバーは、マウス用に設計されたコンテンツ内で UI 要素の表示/非表示切り替え(例:「ホバーメニュー」)に用いられることがある。この種のコンテンツはしばしば ホバーをサポートしないデバイス と互換性がない。本仕様はこのシナリオとの互換性のためのマッピングや挙動を定義しない。将来の版で検討される。

これにより、この種の入力デバイスに対してユーザーエージェントは異なるマッピングを提供する必要がある。ユーザーエージェントが ホバーをサポートしない デバイスのポインターイベントをディスパッチする際は、以下の手順を実行すべきである(SHOULD)。

  1. ディスパッチ対象のポインターイベントの isPrimaryfalse の場合、ポインターイベントをディスパッチして終了。
  2. ディスパッチ対象のポインターイベントが pointerover で、当該ポインターの pointerdown がまだディスパッチされていない場合、mousemove を発火(レガシーなマウス特化コードとの互換性のため)。
  3. ディスパッチ対象のポインターイベントが pointerdownpointeruppointermove、または window での pointerleave なら、レガシーマウスポインターの有効位置の追跡 に従って互換マウス遷移イベントをディスパッチ。
  4. ポインターイベントをディスパッチ。
  5. ディスパッチされたポインターイベントが pointerdown でイベントが キャンセル された場合、当該 pointerTypePREVENT MOUSE EVENT フラグを設定。
  6. PREVENT MOUSE EVENT フラグが設定されていない場合、かつディスパッチされたポインターイベントが以下なら:
  7. ディスパッチされたポインターイベントが pointerup または pointercancel の場合、当該 pointerTypePREVENT MOUSE EVENT フラグをクリア。

ユーザーエージェントが [TOUCH-EVENTS] で定義される Touch Events と Pointer Events の両方をサポートする場合、ユーザーエージェント は、本セクションで述べられる互換マウスイベントと [TOUCH-EVENTS] に記載される フォールバックマウスイベント の双方を生成してはならない(MUST NOT)。

注記

ホバーをサポートしないデバイス(例:タッチスクリーン上の単一指)によるプライマリポインターで要素をアクティベート(click)する場合、典型的なイベントシーケンスは次のとおり:

  1. mousemove
  2. pointerover
  3. pointerenter
  4. mouseover
  5. mouseenter
  6. pointerdown
  7. mousedown
  8. 移動に応じて 0 回以上の pointermove および mousemove
  9. pointerup
  10. mouseup
  11. pointerout
  12. pointerleave
  13. mouseout
  14. mouseleave
  15. click

ただし、この相互作用中に pointerdown イベントが キャンセル された場合、イベントシーケンスは次のようになる:

  1. mousemove
  2. pointerover
  3. pointerenter
  4. mouseover
  5. mouseenter
  6. pointerdown
  7. 移動に応じて 0 回以上の pointermove
  8. pointerup
  9. pointerout
  10. pointerleave
  11. mouseout
  12. mouseleave
  13. click

12. セキュリティおよびプライバシーに関する考慮事項

この付録では、Pointer Events の実装におけるセキュリティおよびプライバシーに関する考慮事項を論じる。ここでの議論は、本仕様で定義されるイベントモデル、API、およびイベントの実装から直接生じるセキュリティとプライバシーの問題に限定する。

本仕様で定義される多くのイベント型は、ユーザーの操作に応じてディスパッチされる。これは、悪意のあるイベントリスナーが、ユーザーが通常は機密と考える情報(たとえば、ページと対話中のユーザーのマウス/スタイラス/指の正確な経路/動き)へアクセスできる可能性を生む。

ポインターイベントには、(ユーザーのデバイスが対応している場合)ペン入力が保持される角度や傾き、接触面のジオメトリ、スタイラスやタッチスクリーンに加えられる圧力などの追加情報が含まれる。角度、傾き、ジオメトリ、圧力に関する情報はユーザーのデバイス上のセンサーに直接関係するため、本仕様はオリジンに対してこれらのセンサーへのアクセスを許可することになる。

このセンサーのデータや、使用された入力機構(マウス、タッチ、ペン)の種類を判別できる能力は、ユーザー、またはユーザーのデバイスや環境の特性を推測するために用いられる可能性がある。推測された特性や、デバイス/環境に関するあらゆる情報自体が機微なものである場合がある — たとえば、悪意のあるサイトがユーザーが支援技術を使用しているかどうかをさらに推測できてしまう可能性がある。この情報は、ユーザープロファイルの構築や、特定のユーザーを「フィンガープリント」して追跡する目的に使用され得る。

緩和策として、ユーザーエージェントは、特定のセンサーデータ(角度、傾き、圧力など)へのアクセスをユーザーが無効化できる機能を含めること、またはユーザーの明示的なオプトイン後にのみ利用可能にすることを検討してもよい。

センサーの工場校正情報は、センサーデータの特有の変動や特性に基づき、個々のデバイスをフィンガープリントするために使用され得る。本仕様では多くのセンサー関連イベント属性を floatdouble の精度で定義しているが、実装では実用上有用な精度に公開するセンサーデータを制限することを推奨する:

本仕様は、著者が「予測イベント」へアクセスできる方法を定義するが、ユーザーエージェントが予測に用いるアルゴリズム自体は定義しない。仕様策定者は、これらのアルゴリズムが、ユーザーが現在実行中のジェスチャーに関連する直前のポインターイベントのみに依拠することを想定している。ユーザーエージェントは、予測アルゴリズムの具体的な実装が、ユーザーに関する機微な情報を明らかにしたり、ユーザーを「フィンガープリント」して追跡するために使用され得る、異なるサイト間でのユーザーの完全な操作履歴のような追加データに依拠しないことを確実にする責任を負う。

これらの考慮事項に加えて、ワーキンググループは本仕様が次のとおりであると考える:

13. 用語集

このセクションは参考であり、規範的ではない。

アクティブボタン状態
ポインターが buttons プロパティについて非ゼロ値を持つ状態。マウスの場合、これは デバイスで少なくとも 1 つのボタンが押下されているときである。タッチの場合、これはデジタイザーとの物理的接触が あるときである。ペンの場合、これはペンがデジタイザーと物理的に接触しているか、または ホバー中に少なくとも 1 つのボタンが押下されているときである。
アクティブ文書
すべてのアクティブポインターについて、そのポインターからの最後のイベントを 受け取った文書。
アクティブポインター
イベントを生成できる任意のタッチ接触、ペン/スタイラス、マウスカーソル、またはその他のポインター。ある ポインター(一意な pointerId によって識別される)が 文書内で追加のイベントを生成できる可能性があるなら、そのポインターはまだアクティブであるとみなされる。例:
  • デバイスに接続されたマウスは常にアクティブである。
  • 画面上のタッチ接触はアクティブであるとみなされる。
  • タッチ接触またはペン/スタイラスがデジタイザーの範囲外へ持ち上げられたなら、それは もはやアクティブであるとはみなされない。
一部のプラットフォームでは、アクティブポインターの集合には、 ユーザーエージェントを対象としていないもの(たとえば、他のアプリケーションを対象とするもの)を含む、 デバイスへのすべてのポインター入力が含まれる。
キャンセルされたイベント
preventDefault()、イベントハンドラー内で false を返すこと、または [UIEVENTS] および [HTML] によって定義されるその他の手段により、既定アクションが防止されたイベント。
接触ジオメトリ
デジタイザー上の入力(最も一般的にはタッチ)の境界ボックス。これは通常、 単一ピクセルより粗いポインター入力解像度を持つデバイスを指す。一部のデバイスはこのデータをまったく報告しない。
デジタイザー
表面が、接触している入力および/または近接している入力を検出できる種類の入力感知デバイス。 最も一般的には、これはタッチ接触またはペン/スタイラスからの入力を感知する表面である。
直接操作
特定のユーザーエージェント(タッチスクリーンデバイス上のブラウザーなど)は、ポインターがコントロールと 相互作用するだけでなく、現在のページを直接パンまたはズームするためにも使用され、直接的な物理的 接触の錯覚を提供する「直接操作」のメタファーを実装する。例として、タッチスクリーンデバイス上のユーザーは一般に、 指またはスタイラスを使ってページを「つかみ」、ポインターを動かすことによってページをパンし、ページを直接 操作できる。これは、通常のデスクトップ/ラップトップ上のマウスポインターとは対照的であり、そこではパンは ページを「ドラッグ」するのではなく、スクロールバーを使用して行われる。
場合によっては、タッチパッド(ラップトップに見られるものなど)により、ユーザーはタッチパッド上で 「ドラッグ」することでスクロールできる。しかし、これは一般にタッチパッドが「偽の」マウスホイールイベントを 生成することで実現されるため、これは直接操作には数えられない。
ヒット テスト
ユーザーエージェントがポインターイベントの対象要素を決定するプロセス。通常、これは ポインターの位置、および画面媒体上の文書内の要素の視覚的レイアウトを考慮することで決定される。
測定可能プロパティ

測定可能プロパティは、実数または大きな定義域の整数を用いて表現される、連続的なポインターセンサーデータに関係する値を表す。 ポインターイベントについては、widthheightpressuretangentialPressuretiltXtiltYtwistaltitudeAngleazimuthAngle、および [POINTEREVENTS4] Mouse Event モデルのプロパティ screenXscreenYclientXclientY は 測定可能プロパティである。

対照的に、pointerIdpointerTypeisPrimary、および [POINTEREVENTS4] Mouse Event モデルのプロパティ buttonbuttonsctrlKeyshiftKeyaltKey、および metaKey は測定可能プロパティとは みなされない。なぜなら、それらはセンサーデータに関係しないからである。

ポインター
マウス、ペン、またはタッチ接触など、画面上の特定の座標(または座標の集合)を対象にできる 入力デバイスの、ハードウェア非依存の表現。

A. 謝辞

本ドキュメントに取り入れられているものも含め、多くの提案および推奨をいただいた多くの方々に深く感謝する。グループの議長は、以下の過去および現在のグループメンバーおよび参加者の貢献をここに認める: Mustaq Ahmed、 Arthur Barstow、 Ben Boyle、 Matt Brubeck、 Rick Byers、 Marcos Cáceres、 Cathy Chan、 Bo Cupp、 Domenic Denicola、 Ted Dinklocker、 Adam Ettenberger、 Robert Flack、 Dave Fleck、 Mike Fraser、 Ella Ge、 Olga Gerchikov、 Scott González、 Kartikaya Gupta、 Dominique Hazael-Massieux、 Philippe Le Hégaret、 Hayato Ito、 Patrick Kettner、 Patrick H. Lauke、 Scott Low、 Sangwhan Moon、 Masayuki Nakano、 Olli Pettay、 Addison Phillips、 Alan Pyne、 Antoine Quint、 Jacob Rossi、 Kagami Sascha Rosylight、 Doug Schepers、 Ming-Chou Shih、 Brenton Simpson、 Dave Tapuska、 Liviu Tinta、 Asir Vedamuthu、 Lan Wei、 Jeffrey Yasskin、 Navid Zolghadr.

本モデルの初版の開拓に尽力された方々、とりわけ次の方々に特別な感謝を捧げる:Charu Chandiram、Peter Freiling、Nathan Furtwangler、Thomas Olsen、Matt Rakow、Ramu Ramanathan、Justin Rogers、 Jacob Rossi、Reed Townsend、Steve Wright。

B. 変更履歴

このセクションは参考であり、規範的ではない。

以下は、本仕様の各版の公開間における、[PointerEvents2] 仕様に対する重大かつ主要な編集上の変更の非規範的な要約である。 本仕様のエディターズドラフトの完全な変更履歴も参照のこと。

C. IDL 索引

WebIDLdictionary PointerEventInit : MouseEventInit {
    long        pointerId = 0;
    double      width = 1;
    double      height = 1;
    float       pressure = 0;
    float       tangentialPressure = 0;
    long        tiltX;
    long        tiltY;
    long        twist = 0;
    double      altitudeAngle;
    double      azimuthAngle;
    DOMString   pointerType = "";
    boolean     isPrimary = false;
    sequence<PointerEvent> coalescedEvents = [];
    sequence<PointerEvent> predictedEvents = [];
};

[Exposed=Window]
interface PointerEvent : MouseEvent {
    constructor(DOMString type, optional PointerEventInit eventInitDict = {});
    readonly        attribute long        pointerId;
    readonly        attribute double      width;
    readonly        attribute double      height;
    readonly        attribute float       pressure;
    readonly        attribute float       tangentialPressure;
    readonly        attribute long        tiltX;
    readonly        attribute long        tiltY;
    readonly        attribute long        twist;
    readonly        attribute double      altitudeAngle;
    readonly        attribute double      azimuthAngle;
    readonly        attribute DOMString   pointerType;
    readonly        attribute boolean     isPrimary;
    [SecureContext] sequence<PointerEvent> getCoalescedEvents();
    sequence<PointerEvent> getPredictedEvents();
};

partial interface Element {
  undefined setPointerCapture (long pointerId);
  undefined releasePointerCapture (long pointerId);
  boolean hasPointerCapture (long pointerId);
};

partial interface mixin GlobalEventHandlers {
    attribute EventHandler onpointerover;
    attribute EventHandler onpointerenter;
    attribute EventHandler onpointerdown;
    attribute EventHandler onpointermove;
    [SecureContext] attribute EventHandler onpointerrawupdate;
    attribute EventHandler onpointerup;
    attribute EventHandler onpointercancel;
    attribute EventHandler onpointerout;
    attribute EventHandler onpointerleave;
    attribute EventHandler ongotpointercapture;
    attribute EventHandler onlostpointercapture;
};

partial interface Navigator {
    readonly  attribute long maxTouchPoints;
};

D. 参考文献

D.1 規範参照

[CSS-OVERFLOW-3]
CSSオーバーフローモジュール Level 3. Elika Etemad; Florian Rivoal. W3C. 2025年10月7日. W3C作業草案. URL: https://www.w3.org/TR/css-overflow-3/
[CSS21]
Cascading Style Sheets Level 2 改訂1(CSS 2.1) 仕様. Bert Bos; Tantek Çelik; Ian Hickson; Håkon Wium Lie. W3C. 2011年6月7日. W3C勧告. URL: https://www.w3.org/TR/CSS2/
[CSSOM-VIEW]
CSSOM Viewモジュール. Simon Fraser; Emilio Cobos Álvarez. W3C. 2025年9月16日. W3C作業草案. URL: https://www.w3.org/TR/cssom-view-1/
[DOM]
DOM標準. Anne van Kesteren. WHATWG. リビング標準. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript言語仕様. Ecma International. URL: https://tc39.es/ecma262/multipage/
[HTML]
HTML標準. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. リビング標準. URL: https://html.spec.whatwg.org/multipage/
[infra]
Infra標準. Anne van Kesteren; Domenic Denicola. WHATWG. リビング標準. URL: https://infra.spec.whatwg.org/
[POINTEREVENTS4]
Pointer Events. Patrick Lauke; Robert Flack. W3C. 2026年6月16日. W3C作業草案. URL: https://www.w3.org/TR/pointerevents4/
[PointerLock]
Pointer Lock 2.0. Mustaq Ahmed; Vincent Scheib. W3C. 2026年2月25日. W3C作業草案. URL: https://www.w3.org/TR/pointerlock-2/
[RFC2119]
要求レベルを示すためにRFCで使用する キーワード. S. Bradner. IETF. 1997年3月. 現行最良慣行. URL: https://www.rfc-editor.org/info/rfc2119/
[RFC8174]
RFC 2119キーワードにおける大文字と 小文字の曖昧性. B. Leiba. IETF. 2017年5月. 現行最良慣行. URL: https://www.rfc-editor.org/info/rfc8174/
[TOUCH-EVENTS]
Touch Events. Doug Schepers; Sangwhan Moon; Matt Brubeck; Arthur Barstow. W3C. 2013年10月10日. W3C勧告. URL: https://www.w3.org/TR/touch-events/
[UIEVENTS]
UI Events. Xiaoqian Wu. W3C. 2026年2月21日. W3C作業草案. URL: https://www.w3.org/TR/uievents/
[WEBIDL]
Web IDL標準. Edgar Chen; Timothy Gu. WHATWG. リビング標準. URL: https://webidl.spec.whatwg.org/

D.2 参考参照

[COMPAT]
互換性標準. Mike Taylor. WHATWG. リビング標準. URL: https://compat.spec.whatwg.org/
[PointerEvents]
Pointer Events. Patrick Lauke; Robert Flack. W3C. 2026年6月16日. W3C作業草案. URL: https://www.w3.org/TR/pointerevents4/
[PointerEvents2]
Pointer Events. Matt Brubeck; Rick Byers; Patrick Lauke; Navid Zolghadr. W3C. 2019年4月4日. W3C勧告. URL: https://www.w3.org/TR/pointerevents2/
[WCAG22]
Webコンテンツアクセシビリティガイドライン(WCAG) 2.2. Michael Cooper; Andrew Kirkpatrick; Alastair Campbell; Rachael Bradley Montgomery; Charles Adams. W3C. 2024年12月12日. W3C勧告. URL: https://www.w3.org/TR/WCAG22/