ポインターイベント

レベル 4

W3C 作業草案

この文書の詳細情報
このバージョン:
https://www.w3.org/TR/2026/WD-pointerevents4-20260826/
最新の公開バージョン:
https://www.w3.org/TR/pointerevents4/
最新の編集者草案:
https://w3c.github.io/pointerevents/
履歴:
https://www.w3.org/standards/history/pointerevents4/
コミット履歴
テストスイート:
https://wpt.fyi/pointerevents/
最新の勧告:
https://www.w3.org/TR/pointerevents3
編集者:
Patrick H. Lauke (TetraLogical)
Robert Flack (Google)
以前の編集者:
Matt Brubeck (Mozilla)
Rick Byers (Google)
Navid Zolghadr (Google)
フィードバック:
GitHub w3c/pointerevents (プルリクエスト, 新しい Issue, 未解決の Issue)
public-pointer-events@w3.org に件名 [pointerevents4] … メッセージのトピック … を付けて送信してください (アーカイブ)
ブラウザーサポート:
caniuse.com

概要

Pointer Events 仕様は、マウス、タッチスクリーン、ペン/スタイラスを含む さまざまなデバイスからの入力を処理するための、ハードウェアに依存しない統一されたフレームワークを定義します。単一のイベントセット(例: pointerdown、pointermove、pointerup)を提供することで、開発者は各デバイス固有のロジックを記述することなく 多様な入力方法をサポートできます。

この仕様では、マウスイベントおよびホイールイベントに加え、他の ポインターデバイスタイプに対してマウスイベントを発火するためのマッピングも定義します。

この文書のステータス

この節では、公開時点におけるこの 文書のステータスについて説明します。現在の W3C 公開文書の一覧およびこの技術報告書の最新リビジョンは、 W3C 標準および草案 インデックスで確認できます。

この仕様は、[PointerEvents3] 仕様を更新するものです。また、 以前は [UIEVENTS] 仕様に含まれていたマウスイベントおよびホイールイベントも含みます。

このリビジョンには、次の新機能が含まれています:

この文書は、Pointer Events ワーキンググループによって、 勧告 トラックを使用して作業草案として公開されました。

作業草案としての公開は、 W3C およびそのメンバーによる承認を意味するものではありません。

これは草案文書であり、いつでも他の 文書によって更新、置換、または廃止される可能性があります。この文書を 作業中の文書以外のものとして引用することは適切ではありません。

この文書は、 W3C 特許 ポリシーの下で活動するグループによって作成されました。 W3C は、グループの成果物に関連して行われた 特許開示の公開一覧 を管理しています。そのページには、 特許を開示するための手順も記載されています。ある特許に 必須クレーム が含まれていると実際に認識している個人は、 W3C 特許ポリシーの第 6 節に従って、その情報を開示しなければなりません。

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

1. はじめに

この節は非規範的です。

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

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

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

注記

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

まず第一に、作者は focusblurclick などの高レベルイベントに応答することで、あらゆる形式の 入力に対して同等の機能を提供することが推奨されます。ただし、低レベルイベント(Pointer Events など)を 使用する場合、作者は、すべての種類の入力がサポートされるようにすることが推奨されます。キーボードや キーボードに似たインターフェイスの場合、明示的なキーボードイベント処理を追加する必要がある場合があります。詳細については、 キーボードによるアクセス [WCAG22] を参照してください。

ポインター入力は、マウス、ペン、タッチなどのさまざまな入力ソースを統合します
1 ポインターは、画面上の特定の座標(または座標の集合)を対象にできる入力デバイスを、 ハードウェアに依存せずに表現したものです。

汎用ポインター入力を処理するためのイベントは、マウス用のイベントと非常によく似ています: pointerdownpointermovepointeruppointeroverpointerout などです。これにより、コンテンツを マウスイベントからポインターイベントへ容易に移行できます。 ポインターイベントは、マウスイベントに存在する通常のプロパティ(クライアント座標、 対象要素、ボタンの状態を含む)すべてに加えて、圧力、 接触領域の形状、傾きなど、その他の形式の入力向けの新しいプロパティも提供します。作者は、適切な場合には異なる入力 タイプ間でロジックを共有するようにポインターイベントへ容易に対応でき、最良の 体験を得るために必要な場合にのみ、特定の入力タイプ向けにカスタマイズできます。

ポインターイベントはさまざまな入力デバイスを発生源としますが、他の何らかの デバイス固有イベントの集合から生成されるものとして定義されてはいません。互換性のためには可能であり推奨されますが、この仕様では、 その他のデバイス固有イベント(マウスイベントやタッチイベントなど)のサポートを要求しません。ユーザー エージェントは、その他のデバイスイベントを一切サポートせずにポインターイベントをサポートできます。 マウス固有イベント向けに記述されたコンテンツとの互換性のため、この仕様では、マウス以外の デバイスからのポインター入力に基づいて 互換マウスイベントを生成する方法を説明する任意の節を提供しています。

注記

この仕様では、Touch Events([TOUCH-EVENTS] で定義される)と Pointer Events の 両方をサポートするユーザーエージェントに期待される動作について、いかなる助言も提供しません。 これら 2 つの仕様の関係について詳しくは、Touch Events コミュニティグループを参照してください。

2. 適合性

非規範的と示されている節に加えて、この仕様内のすべてのオーサリングガイドライン、図、例、および注記は 非規範的です。この仕様内のそれ以外のすべては規範的です。

この文書におけるキーワード MAYMUSTMUST NOTOPTIONAL、および SHOULD は、 ここに示すように、すべて 大文字で記述されている場合にのみ、 BCP 14 [RFC2119] [RFC8174] に記載されているとおりに解釈されるものとします。

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

3.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;
    long        persistentDeviceId = 0;
    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;
    readonly        attribute long        persistentDeviceId;
    [SecureContext] sequence<PointerEvent> getCoalescedEvents();
    sequence<PointerEvent> getPredictedEvents();
};
pointerId

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

ユーザーエージェントは、 以前のアクティブなポインターから使用済みとなった pointerId の値を再利用しても よく、または特定のポインティングデバイスに対して常に同じ pointerId を再利用してもよいです(たとえば、複数ユーザーの共同作業アプリケーションで、特定のユーザーによる特定のペン/スタイラス 入力を一意に識別するため)。ただし、 後者の場合、異なるページや ドメイン間でのフィンガープリンティングや追跡の可能性を最小限に抑えるため、pointerId は、そのページ/セッションの存続期間に限って、その特定のポインティング デバイスに明示的に関連付けなければならず、その特定のポインティングデバイスが 新しいセッションで再び使用される次の機会には、新しいランダム化された pointerId を選択しなければなりません

注記

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

width

ポインターの 接触形状の幅(X 軸方向の大きさ)を CSS ピクセル単位で表します([CSS21] を参照)。 この値は、特定のポインターについてイベントごとに更新されてもかまいません。通常は接触形状を持たない入力 (従来のマウスなど)、および入力の実際の 形状がハードウェアによって検出されない場合、ユーザーエージェントは、デフォルト値 1 を返さなければなりません

height

ポインターの 接触形状の高さ(Y 軸方向の大きさ)を CSS ピクセル単位で表します([CSS21] を参照)。 この値は、特定のポインターについてイベントごとに更新されてもかまいません。通常は接触形状を持たない入力 (従来のマウスなど)、および入力の実際の 形状がハードウェアによって検出されない場合、ユーザーエージェントは、デフォルト値 1 を返さなければなりません

pressure

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

tangentialPressure

ポインター入力の正規化された接線圧力(バレル圧力とも呼ばれます)であり、通常は 追加のコントロール(たとえばエアブラシ用スタイラスのフィンガーホイール)によって設定されます。その範囲は [-1,1] で、0 はコントロールの中立位置です。 一部のハードウェアは [0,1] の範囲の正の値のみをサポートする場合があることに注意してください。 接線圧力をサポートしないハードウェアやプラットフォームでは、値は 0なければなりません

注記
プロパティ名に「pressure」とありますが、実際にはこのプロパティの 値を生成するハードウェアのコントロール/センサーが必ずしも圧力感知式であるとは限りません。たとえば、 多くのエアブラシ/ペイント用スタイラス実装のフィンガーホイールは通常、 ゼロ位置へ戻らないようにするためユーザーがホイールに一定の圧力を加え続ける必要はなく、 自由に設定できます。
tiltX

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

tiltX の説明図
2 正の tiltX
tiltY

X-Z 平面と、 トランスデューサー(たとえばペン/スタイラス)の軸および X 軸の両方を含む平面との間の平面角 (度単位、[-90,90] の範囲)です。正の tiltY はユーザーの方向、すなわち Y 値が増加する方向です。 tiltYtiltX と併用して、デジタイザーに対する トランスデューサーの法線からの傾きを表すことができます。傾きまたは角度を報告しない ハードウェアやプラットフォームでは、値は 0なければなりません

tiltY の説明図
3 正の tiltY
twist

トランスデューサー (たとえばペン/スタイラス)が自身の主軸を中心に時計回りに回転した角度 (度単位、[0,359] の範囲)です。twist を報告しないハードウェアやプラットフォームでは、 値は 0なければなりません

altitudeAngle

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

注記
ここで定義されている 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なければなりません。傾きまたは角度を 報告しないハードウェアやプラットフォームでは、値は 0なければなりません

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

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

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

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

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

ポインターが、この ポインタータイプの プライマリポインターを表すかどうかを示します。

persistentDeviceId

ポインティングデバイスの一意の識別子です。ハードウェアが複数のポインターをサポートする場合、 ポインティングデバイスから生成されたポインターイベントは、それらのポインターが セッション全体を通して一意に識別可能な場合にのみ persistentDeviceId を取得しなければなりません。 ポインターが一意に識別可能である場合、そのポインティングデバイスに割り当てられた persistentDeviceId は、セッションの 残りの期間を通して一定のままです。persistentDeviceId の値 0 は、 生成元デバイスを識別できなかったイベントを示すために 予約して使用しなければなりませんpointerId と同様に、異なるページやドメイン間での フィンガープリンティングや追跡の可能性を最小限にするため、 persistentDeviceId は、そのページ/セッションの存続期間に限って、 その特定のポインティングデバイスに明示的に関連付けなければならず、 その特定のポインティングデバイスが新しいセッションで再び使用される次の機会には、新しい ランダム化された persistentDeviceId を選択しなければなりません

注記
デジタイザーおよびポインティングデバイスのハードウェア上の制約により、 ポインティングデバイスからのすべてのポインターイベントで persistentDeviceId が利用可能であるとは限りません。 たとえば、pointerdownpersistentDeviceId を持つのに間に合うように、デバイスがハードウェア ID を デジタイザーへ報告しない場合があります。この場合、persistentDeviceId は 最初は 0 で、その後有効な値に変化することがあります。
getCoalescedEvents()

統合イベントのリストを返すメソッドです。

getPredictedEvents()

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

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

PointerEventイベント 構築手順では、 PointerEventInitcoalescedEvents統合イベントリストへ複製し、 PointerEventInitpredictedEvents予測イベントリストへ複製します。

注記
PointerEvent インターフェイスは MouseEvent を継承します。 また、CSSOM View Module で提案されている拡張にも注意してください。この拡張では、 小数座標を使用できるように、さまざまな座標プロパティを long から double に変更します。この提案された拡張をすでに PointerEvent には実装しているものの、通常の MouseEvent には実装していないユーザーエージェントには、 clickauxclick、 および contextmenu イベントに関して追加の要件があります。

3.1.1 ボタンの状態

3.1.1.1 複数ボタンの 同時操作

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

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

button および buttons プロパティへの変更は、 ポインターイベントにのみ適用されます。ただし、clickauxclick および contextmenu については、buttonbuttons の値は、 互換マウスイベントの場合と同様に、マウスイベントモデルに従わなければなりません

3.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 になります。
3.1.1.3 buttons プロパティ

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

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

3.1.2 プライマリポインター

マルチポインター(たとえばマルチタッチ)のシナリオでは、isPrimary プロパティを使用して、 各ポインタータイプについて アクティブなポインターの集合の中から 主となるポインターを識別します。

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

3.1.3 PointerEvent インターフェイスを使用した イベントの発火

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

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

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

targetDocument を、ターゲットの ノード文書とします [DOM]。

イベントが pointerdownpointermove、または pointerup の場合、イベントの pointerId に対する アクティブ文書targetDocument に設定します。

イベントが pointerdown で、関連する デバイスが直接操作デバイスであり、ターゲットが Element である場合、 暗黙的なポインターキャプチャーで説明されているとおり、この pointerId についてターゲット要素に ポインターキャプチャーを設定します

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

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

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

注記
通常のヒットテスト結果の代わりに ポインターキャプチャー ターゲットのオーバーライドをターゲットとして使用すると、一部の 境界イベントが発火する場合があります。これは、ポインターが以前のターゲットを離れて、この 新しいキャプチャーターゲットに入る場合と同じです。キャプチャーが解放されたときも、 ポインターがキャプチャーターゲットを離れてヒットテストターゲットに入るため、同じ状況が発生する場合があります。
3.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 であるべきです。上記の表にあるその他すべてのポインターイベントでは、この属性は true であるべきです

上記の表にあるすべてのポインターイベントについて、detail 属性は 0 であるべきです

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

MouseEventrelatedTarget と同様に、 relatedTarget は、ポインターが直前に境界から離れた要素 (pointerover または pointerenter イベントの場合)、またはポインターが境界内へ入ろうとしている要素( pointerout または pointerleave イベントの場合)に初期化するべきです。その他のポインターイベントでは、 この値はデフォルトで null になります。要素がポインターキャプチャーを受け取った場合、 そのポインターに対する以降のすべてのイベントは、キャプチャーしている 要素の境界内にあるものと見なされることに注意してください。

gotpointercapture および lostpointercapture イベントでは、上記の表で定義されたものを除くすべての 属性は、ユーザーエージェントに 保留中のポインターキャプチャーを処理する手順を実行させ、 gotpointercapture および lostpointercapture イベントを発火させたポインターイベントと同じであるべきです。

3.1.3.2 保留中のポインターキャプチャーを処理する

ユーザーエージェントは、 ポインター キャプチャーを暗黙的に解放する場合、および gotpointercapture または lostpointercapture ではないポインターイベントを発火する場合、次の手順を実行しなければなりません

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

clickauxclick、および contextmenu イベントの節で定義されているように、lostpointercapture イベントが ディスパッチされた後であっても、 対応する clickauxclick、または contextmenu イベントが存在する場合、それは引き続きキャプチャーターゲットにディスパッチされます。

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

ユーザーエージェントは、 ウェブページが特定の pointerId を持つポインターイベントを引き続き受信する可能性が低いと検出した場合、 ポインターイベントストリームを抑制しなければなりません。次のいずれの シナリオもこの条件を満たします(追加のシナリオが存在してもかまいません)。

  • ユーザーエージェントがモーダルダイアログまたはメニューを開いた。
  • ポインター入力デバイスが物理的に切断された、またはホバー可能なポインター入力デバイス(たとえば、 ホバー可能なペン/スタイラス)がデジタイザーで検出可能なホバー範囲を離れた。
  • その後、ユーザーエージェントがポインターを使用してページのビューポートを操作した(たとえば パンまたはズーム)。詳細については touch-action CSS プロパティの節を参照してください。
    注記
    ユーザーエージェントは、複数のポインタータイプ (タッチやペンなど)を通じてパンまたはズームを開始できるため、パンまたはズーム操作の開始によって、 異なるポインター タイプのポインターを含むさまざまなポインターが抑制される場合があります。
  • ドラッグ& ドロップ処理モデル [HTML] で定義されるドラッグ操作開始アルゴリズムの一部として、 ドラッグ操作を発生させたポインターについて。
注記

ユーザーエージェントポインターイベント ストリームを抑制してもよいその他のシナリオには、次のものがあります。

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

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

ユーザーエージェントは、ポインターイベントストリームを抑制するために、次の手順を実行しなければなりません

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

画面表面に対して移動した、またはその プロパティのいずれかに何らかの変化が生じたポインティングデバイスは、ポインターイベントの種類で定義されているさまざまなイベントを発火します。 静止したポインティングデバイス(画面表面に対して移動せず、 どのプロパティにも変化がないもの)については、ポインターの ヒットテストターゲットに影響を与えるレイアウト変更の後、ユーザーエージェントは 特定の境界イベントを発火しなければなりません。詳細については、pointeroverpointerenterpointerout、および pointerleave を参照してください。ユーザーエージェントは、パフォーマンス上の 理由(たとえば、過剰なヒットテストや境界イベントリスナーによって引き起こされるレイアウト変更を避けるため)により、 これらの境界イベントの発火を遅延してもかまいません

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

3.1.5 tiltX / tiltYaltitudeAngle / azimuthAngle の間の変換

ポインターイベントには、X-Y 平面に対する トランスデューサーの向きを表すための、相互補完的な 2 組の属性が含まれています。tiltX / tiltY (元の Pointer Events 仕様で導入)と、azimuthAngle / altitudeAngleTouch Events - Level 2 仕様から採用)です。

特定のハードウェアやプラットフォームによっては、ユーザーエージェントが画面平面に対する トランスデューサーの向きについて受け取る値の組は、tiltX / tiltY または altitudeAngle / azimuthAngle の どちらか一方のみである可能性が高いです。ユーザーエージェントは、これらの値を変換するために次のアルゴリズムを使用しなければなりません

ユーザーエージェントが azimuthAngle / altitudeAngle から tiltX / tiltY を計算する場合、最終的な整数値は Math.round [ECMASCRIPT] の規則を使用して丸めるべきです

1: tiltX/tiltY と altitudeAngle/azimuthAngle の間の変換
/* tiltX/tiltY と altitudeAngle/azimuthAngle の間の変換 */

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

  let tiltXrad = 0;
  let tiltYrad = 0;

  if (altitudeAngle == 0) {
    // ペンは X-Y 平面上にある
    if (azimuthAngle == 0 || azimuthAngle == 2*Math.PI) {
      // ペンは正の X 軸上にある
      tiltXrad = Math.PI/2;
    }
    if (azimuthAngle == Math.PI/2) {
      // ペンは正の Y 軸上にある
      tiltYrad = Math.PI/2;
    }
    if (azimuthAngle == Math.PI) {
      // ペンは負の X 軸上にある
      tiltXrad = -Math.PI/2;
    }
    if (azimuthAngle == 3*Math.PI/2) {
      // ペンは負の Y 軸上にある
      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;

  // 方位角を計算する
  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) {
    // 方位角を計算するための情報が不足している
    azimuthAngle = 0;
  } else {
    // 非境界ケース: tiltX も tiltY も 0 または +-90 ではない
    const tanX = Math.tan(tiltXrad);
    const tanY = Math.tan(tiltYrad);

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

  // 高度角を計算する
  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 {
    // 非境界ケース: tiltX も tiltY も 0 または +-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};
}

3.2 PointerEvent アルゴリズム

3.2.1 PointerEvent を初期化する

eventeventTypeeventTargetbubbles、および cancelable を用いて PointerEvent を初期化するには、次の手順を実行します。

  1. eventeventTypeeventTargetbubbles、および cancelable を用いて MouseEvent を初期化します
  2. その他すべての属性を、デフォルトの PointerEvent 値に初期化します。

3.2.2 PointerEvent を作成する

eventTypeeventTargetbubbles、および cancelable を用いて PointerEvent を作成するには、次の手順を実行します。

  1. event を、PointerEvent を使用して イベントを 作成した結果とします
  2. eventeventTypeeventTargetbubbles、および cancelable を用いて PointerEvent を初期化します
  3. event を返します

3.2.3 MouseEvent から PointerEvent を作成する

  1. eventType を、イベントタイプを含む DOMString とします
  2. mouseevent を、対応する MouseEvent とします
  3. event を、PointerEvent を使用して イベントを 作成した結果とします
  4. targetmouseevent.target とします
  5. eventeventType、および target を用いて PointerEvent を初期化します
  6. MouseEvent の属性を mouseevent から event にコピーします
  7. event を返します

3.2.4 必要に応じて pointerout イベントを送信する

  1. mouseout を、対応する mouseout MouseEvent とします
  2. pointerout を、"pointerout" および mouseout を用いて MouseEvent から PointerEvent を 作成した結果とします
  3. pointerevent 属性を設定します
    編集者注記

    TODO.

  4. targetmouseout.target とします
  5. pointerouttargetディスパッチします

3.2.5 必要に応じて pointerleave イベントを送信する

  1. mouseout を、対応する mouseout MouseEvent とします
  2. pointerout を、"pointerout" および mouseout を用いて MouseEvent から PointerEvent を 作成した結果とします
  3. pointerevent 属性を設定します
    編集者注記

    TODO.

  4. targetmouseout.target とします
  5. pointerouttargetディスパッチします

3.2.6 必要に応じて pointerover イベントを送信する

  1. mouseout を、対応する mouseout MouseEvent とします
  2. pointerout を、"pointerout" および mouseout を用いて MouseEvent から PointerEvent を 作成した結果とします
  3. pointerevent 属性を設定します
    編集者注記

    TODO.

  4. targetmouseout.target とします
  5. pointerouttargetディスパッチします

3.2.7 必要に応じて pointerenter イベントを送信する

  1. mouseout を、対応する mouseout MouseEvent とします
  2. pointerout を、"pointerout" および mouseout を用いて MouseEvent から PointerEvent を 作成した結果とします
  3. pointerevent 属性を設定します
    編集者注記

    TODO.

  4. targetmouseout.target とします
  5. pointerouttargetディスパッチします

3.2.8 必要に応じて pointermove イベントを送信する

  1. mouseout を、対応する mouseout MouseEvent とします
    編集者注記

    これは pointermove と pointerrawupdate を送信できますか?それとも 2 つのメソッドが必要ですか?

    編集者注記

    pointermove イベントがどのように統合されるかを適切に定義するには何が必要ですか?

  2. pointerout を、"pointerout" および mouseout を用いて MouseEvent から PointerEvent を 作成した結果とします
  3. pointerevent 属性を設定します
    編集者注記

    TODO.

  4. targetmouseout.target とします
  5. pointerouttargetディスパッチします

3.2.9 必要に応じて pointerdown イベントを送信する

  1. mouseout を、対応する mouseout MouseEvent とします
    注記

    mousedown イベントとは異なり、pointerdown イベントは、複数のボタンが押された場合でも入れ子になりません。 MouseEvent は、 フィールドを PointerEvent にコピーできるように渡されます。

  2. pointerout を、"pointerout" および mouseout を用いて MouseEvent から PointerEvent を 作成した結果とします
  3. pointerevent 属性を設定します
    編集者注記

    TODO.

  4. targetmouseout.target とします
  5. pointerouttargetディスパッチします

3.2.10 必要に応じて pointerrawupdate イベントを送信する

  1. mouseout を、対応する mouseout MouseEvent とします
  2. targetmouseout.target とします
  3. pointerouttargetディスパッチします

3.2.11 必要に応じて pointerup イベントを送信する

  1. mouseout を、対応する mouseout MouseEvent とします
    注記

    mouseup イベントとは異なり、pointerup イベントは、 複数のボタンが押された場合でも入れ子になりません。MouseEvent は、 フィールドを PointerEvent にコピーできるように渡されます。

  2. pointerout を、"pointerout" および mouseout を用いて MouseEvent から PointerEvent を 作成した結果とします
  3. pointerevent 属性を設定します
    編集者注記

    TODO.

  4. targetmouseout.target とします
  5. pointerouttargetディスパッチします

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

以下は、この仕様で定義されるイベントタイプです。

プライマリポインターの場合、これらのイベント(gotpointercapture および lostpointercapture を除く)は、互換マウスイベントも発火する場合があります。

3.3.1 pointerover

タイプ pointerover
インターフェイス PointerEvent
バブリング はい
キャンセル可能 はい
合成 はい
コンテキスト
(信頼されたイベント)

ユーザーエージェントは、 次のいずれかが発生した場合、pointerover という名前の ポインターイベントを発火しなければなりません

3.3.2 pointerenter

タイプ pointerenter
インターフェイス PointerEvent
バブリング いいえ
キャンセル可能 いいえ
合成 いいえ
コンテキスト
(信頼されたイベント)

ユーザーエージェントは、 次のいずれかが発生した場合、pointerenter という名前の ポインターイベントを発火しなければなりません

注記
このイベントタイプは pointerover と似ていますが、2 つの違いがあります。pointerenter はバブリングせず、その ディスパッチでは子孫要素の ヒットテスト境界も考慮されます。
注記
このイベントタイプ、mouseenter イベント、および [CSS21] で説明される CSS :hover 疑似クラスには類似点があります。 pointerleave イベントも参照してください。

3.3.3 pointerdown

タイプ pointerdown
インターフェイス PointerEvent
バブリング はい
キャンセル可能 はい
合成 はい
コンテキスト
(信頼されたイベント)

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

注記
マウス(またはその他の複数ボタンのポインターデバイス)の場合、これは pointerdown および pointerup が、 mousedown および mouseup とまったく同じすべての状況で発火するわけではないことを意味します。詳細については 複数ボタンの同時操作を参照してください。

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

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

3.3.4 pointermove

タイプ pointermove
インターフェイス PointerEvent
バブリング はい
キャンセル可能 はい
合成 はい
コンテキスト
(信頼されたイベント)

ユーザーエージェントは、 ポインターが pointerdown または pointerup イベントを発火させないいずれかの プロパティを変更したとき、pointermove という名前の ポインターイベントを発火しなければなりません。これには、 座標、圧力、接線圧力、 傾き、回転、接触形状(width および height)、または 複数ボタンの同時操作へのあらゆる変更が含まれます。

ユーザーエージェントは、pointermove イベントのディスパッチを (たとえばパフォーマンス上の理由で)遅延してもかまいません統合イベントの情報は、ディスパッチされた単一の pointermove イベントについて、getCoalescedEvents メソッドを介して公開されます。 このようなイベントの最終座標を、イベントのターゲットを見つけるために使用するべきです。

3.3.5 pointerrawupdate

タイプ pointerrawupdate
インターフェイス PointerEvent
バブリング はい
キャンセル可能 いいえ
合成 はい
コンテキスト
(信頼されたイベント)

ユーザーエージェントは、 ポインターが pointerdown または pointerup イベントを発火させない いずれかのプロパティを変更した場合、セキュアコンテキスト内でのみ、 pointerrawupdate という 名前の ポインターイベントを発火しなければなりません。 このようなプロパティの一覧については、pointermove イベントを参照してください。

pointermove とは対照的に、ユーザーエージェントは、 pointerrawupdate イベントを可能な限り早く、 JavaScript がイベントを処理できる限り高い頻度でディスパッチするべきです

pointerrawupdate イベントの target は、 pointermove イベントのものと異なる場合があります。 これは、pointermove イベントが 遅延または統合される場合があり、target を見つけるために使用されるイベントの最終位置が、 その統合イベントとは異なる可能性があるためです。

同じ pointerId を持つ別の pointerrawupdateイベントループ内でまだ ディスパッチされていない場合、ユーザーエージェントは、 新しい pointerrawupdate を、新しい タスクを作成する代わりに そのイベントと統合してもかまいません。 これにより pointerrawupdate が 統合イベントを持つ場合があり、 イベントが イベントループで処理されるとすぐに、 それらすべてが 1 つの pointerrawupdate イベントの 統合イベントとして配信されます。 詳細については getCoalescedEvents を参照してください。

pointerrawupdatepointermove の順序について、 ユーザーエージェントがプラットフォームから、pointerrawupdatepointermove の両方のイベントを発生させる更新を受信した場合、 ユーザーエージェントは、対応する pointermove より前に pointerrawupdate イベントをディスパッチしなければなりません

target を除き、最後の pointermove イベント以降にディスパッチされたすべての pointerrawupdate イベントの 統合イベントリストを連結したものは、その他のイベント 属性に関して、次の pointermove イベントの統合イベントと同じです。 pointerrawupdate の属性は、 ほとんど pointermove と同じですが、 pointerrawupdate では cancelable が false でなければならない点が例外です。

ユーザーエージェントは、pointerrawupdate に対して 互換マウスイベントを発火するべきではありません

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

3.3.6 pointerup

タイプ pointerup
インターフェイス PointerEvent
バブリング はい
キャンセル可能 はい
合成 はい
コンテキスト
(信頼されたイベント)

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

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

すべての pointerup イベントでは、pressure の値は 0 です。

ポインターが現在キャプチャーされている場合、ユーザーエージェントポインター キャプチャーを暗黙的に解放しなければなりません

注記
マウス(またはその他の複数ボタンのポインターデバイス)の場合、これは pointerdown および pointerup が、 mousedown および mouseup とまったく同じすべての状況で発火するわけではないことを意味します。詳細については 複数ボタンの同時操作を参照してください。

3.3.7 pointercancel

タイプ pointercancel
インターフェイス PointerEvent
バブリング はい
キャンセル可能 いいえ
合成 はい
コンテキスト
(信頼されたイベント)

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

pointercancel イベントの次のプロパティの値は、 同じ pointerId を持つ最後にディスパッチされたポインターイベントの値と 一致しなければなりません: widthheightpressuretangentialPressuretiltXtiltYtwistaltitudeAngleazimuthAnglepointerTypeisPrimary、およびマウスイベントから継承された座標。 pointercancel イベントの coalescedEvents および predictedEvents リストは空でなければならず、イベントの cancelable 属性は false でなければなりません

3.3.8 pointerout

タイプ pointerout
インターフェイス PointerEvent
バブリング はい
キャンセル可能 はい
合成 はい
コンテキスト
(信頼されたイベント)

ユーザーエージェントは、 次のいずれかが発生した場合、pointerout という名前の ポインターイベントを発火しなければなりません

3.3.9 pointerleave

タイプ pointerleave
インターフェイス PointerEvent
バブリング いいえ
キャンセル可能 いいえ
合成 いいえ
コンテキスト
(信頼されたイベント)

ユーザーエージェントは、 次のいずれかが発生した場合、pointerleave という名前の ポインターイベントを発火しなければなりません

注記
このイベントタイプは pointerout と似ていますが、2 つの違いがあります。pointerleave はバブリングせず、その ディスパッチでは子孫要素の ヒットテスト境界も考慮されます。
注記
このイベントタイプ、mouseleave イベント、および [CSS21] で説明される CSS :hover 疑似クラスには類似点があります。 pointerenter イベントも参照してください。

3.3.10 gotpointercapture

タイプ gotpointercapture
インターフェイス PointerEvent
バブリング はい
キャンセル可能 いいえ
合成 はい
コンテキスト
(信頼されたイベント)

ユーザーエージェントは、 要素がポインターキャプチャーを受け取ったとき、gotpointercapture という名前の ポインターイベントを発火しなければなりません。このイベントは、ポインター キャプチャーを受け取る要素で発火します。そのポインターに対する後続のイベントは、この要素で発火します。ポインターキャプチャーの設定および 保留中のポインターキャプチャーを処理する節を参照してください。

3.3.11 lostpointercapture

タイプ lostpointercapture
インターフェイス PointerEvent
バブリング はい
キャンセル可能 いいえ
合成 はい
コンテキスト
(信頼されたイベント)

ユーザーエージェントは、 ポインターについてポインターキャプチャーが解放された後、lostpointercapture という名前の ポインターイベントを発火しなければなりません。このイベントは、キャプチャーが解放された後の ポインターに対する後続のあらゆるイベントより前に発火しなければなりません。 このイベントは、ポインターキャプチャーが削除された要素で発火します。clickauxclick、および contextmenu イベントを除くポインターに対する後続のすべてのイベントは、 イベントターゲットを決定するために通常のヒットテスト機構(この仕様の範囲外)に従います。ポインター キャプチャーの解放ポインターキャプチャーの暗黙的な 解放、および 保留中のポインター キャプチャーを処理する節を参照してください。

3.3.12 clickauxclick、および contextmenu

この節は、clickauxclick、および contextmenu イベントに関する MouseEvent の定義を補足するものです。 これらのイベントは通常、ユーザーインターフェイスのアクティブ化に結び付いており、キーボードなどの ポインターではない入力デバイスからでも発火します。

これらのイベントは PointerEvent 型でなければならず、 この節の残りの部分で述べる追加要件の対象となります。

3.3.12.1 イベント属性

これらのイベントでは、pointerId および pointerType を除く、この仕様で定義されたすべての PointerEvent 固有の属性は デフォルト値を持たなければなりません。さらに、次のようになります。

  • イベントがポインティングデバイスによって生成された場合、その pointerId および pointerType は、これらのイベントを発生させた PointerEvents と同じでなければなりません
  • イベントがポインティングデバイス以外(音声認識ソフトウェアや キーボード操作など)によって生成された場合、pointerId-1なければならずpointerType は 空文字列でなければなりません
3.3.12.2 イベント座標

PointerEvent で述べたように、CSSOM View Module では、小数座標を使用できるように、 さまざまな座標プロパティ (screenXscreenYpageXpageYclientXclientYxyoffsetXoffsetY)を double として再定義することが提案されています。 しかし、この変更を通常の MouseEvent には適用せず、PointerEvent のみに適用した場合、 clickauxclick、および contextmenu について、 レガシーコードとのウェブ互換性の問題が発生することが確認されています。このため、CSSOM View Module で提案された 変更を PointerEvent のみに実装しているユーザーエージェントは、 clickauxclick、および contextmenu の各座標プロパティを、Math.floor [ECMASCRIPT] を使用して long 値(元のマウスイベントで定義されているもの)へ変換しなければなりません

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

clickauxclick、または contextmenu イベントは、 イベントターゲットが以下のアルゴリズムを使用してオーバーライドされる点を除き、 標準のディスパッチ処理に従わなければなりません

  1. event を、ディスパッチ中の clickauxclick、または contextmenu イベントとし、userEvent を、 event の発火を引き起こしたユーザー操作イベントとします。

    注記

    イベント userEventPointerEvent ではない場合があります。たとえば、 チェックボックス要素でスペースバーを押すことによって click イベントのディスパッチが 発生した場合、それは KeyboardEvent です。

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

  2. userEventPointerEvent でない場合、event の ターゲットをオーバーライドせずに event をディスパッチし、以下の残りの手順をスキップします。
  3. target を次のように定義します。

    eventcontextmenu イベントである場合、または対応するポインターが キャプチャーされている間に userEvent がディスパッチされた場合、 targetuserEvent のターゲットとします。

    それ以外の場合(eventclick または auxclick イベントで、 userEvent がキャプチャーされていない状態でディスパッチされた pointerup イベントである場合)、 target を、event がディスパッチされている時点の DOM における、 対応する pointerdown ターゲットと pointerup ターゲットの 最も近い共通の包含祖先とします。

  4. eventtarget にディスパッチします。

    注記
    userEvent がキャプチャーされていた場合、同じ pointerId を持つ lostpointercapture イベントが すでにディスパッチされていても、eventuserEvent のキャプチャーターゲットにディスパッチされます。

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

次の節では、ポインターキャプチャーの設定と解放を容易にするための、既存の Element インターフェイスの 拡張について説明します。

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

引数 pointerId によって識別される ポインターについて、このメソッドが呼び出された要素に ポインターキャプチャーを設定します。そのポインターの後続イベントでは、 ポインターが常にキャプチャーターゲット上にあるかのように、キャプチャーターゲットが 通常のヒットテスト結果の代わりとなり、キャプチャーが 解放されるまで、それらのターゲットは常にこの要素でなければなりません。 このメソッドを有効にするには、ポインターがその アクティブボタン状態なければならず、 そうでない場合は何もせず失敗します。指定されたメソッドの引数が、いずれの アクティブなポインターとも一致しない場合、"NotFoundError" DOMExceptionスローします

releasePointerCapture()

引数 pointerId によって識別されるポインターについて、このメソッドが呼び出された要素から ポインターキャプチャーを解放します。 ポインターの後続イベントでは、イベント ターゲットを決定するために通常のヒットテスト機構(この仕様の範囲外)に従います。 指定されたメソッドの引数が、いずれの アクティブなポインターとも一致しない場合、"NotFoundError" DOMExceptionスローします

hasPointerCapture

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

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

5. 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
pointerover イベントタイプ用の イベント ハンドラー IDL 属性です。
onpointerenter
pointerenter イベントタイプ用の イベント ハンドラー IDL 属性です。
onpointerdown
pointerdown イベントタイプ用の イベント ハンドラー IDL 属性です。
onpointermove
pointermove イベントタイプ用の イベント ハンドラー IDL 属性です。
onpointerrawupdate
pointerrawupdate イベントタイプ用の イベント ハンドラー IDL 属性です。
onpointerup
pointerup イベントタイプ用の イベント ハンドラー IDL 属性です。
onpointercancel
pointercancel イベントタイプ用の イベント ハンドラー IDL 属性です。
onpointerout
pointerout イベントタイプ用の イベント ハンドラー IDL 属性です。
onpointerleave
pointerleave イベントタイプ用の イベント ハンドラー IDL 属性です。
ongotpointercapture
gotpointercapture イベントタイプ用の イベント ハンドラー IDL 属性です。
onlostpointercapture
lostpointercapture イベントタイプ用の イベント ハンドラー IDL 属性です。

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

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

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

取得手順は次のとおりです。

  1. emulated maxTouchPoints を、 WebDriver BiDi のエミュレートされた最大タッチポイント数 [WEBDRIVER-BIDI] の結果とします。
  2. emulated maxTouchPoints が null でない場合、 emulated maxTouchPoints を返します。
  3. デバイスがサポートする同時タッチ接触の最大数を返します。 複数のデジタイザー(たとえば 複数のタッチスクリーン)を備えたデバイスの場合、値は各デジタイザーが サポートする最大接触数の集合の 最大値でなければなりません

    たとえば、あるデバイスに 3 つのタッチスクリーンがあり、それぞれが 2、5、 10 個の同時タッチ接触をサポートするとします。 maxTouchPoints の値は 10 であるべきです。

注記
maxTouchPoints の値が 0 より大きい場合、 ユーザーのデバイスがタッチ入力をサポートできることを示しますが、必ずしもユーザーが タッチ入力を使用することを意味するわけではありません。作者は、マウス、ペン、スクリーンリーダーなど、 システム上に存在する可能性のある他の入力方式も考慮するよう注意するべきです。
注記
maxTouchPoints は、コンテンツの操作モデルが 現在のハードウェアで認識できることを保証するためによく使用されます。能力の低い ハードウェアを使用するユーザーには、UI 上の操作手段を提供できます。タッチポイントの正確な数が不明な プラットフォームでは、認識されることが保証されている最小数が提供されます。そのため、 実際に認識されるタッチポイント数が maxTouchPoints の値を超える可能性があります。

7. 直接操作動作の宣言

属性とデフォルトアクションで述べたように、ビューポートの 操作(パンおよびズーム)は、ポインターイベントをキャンセルしても抑制できません。代わりに、作者は touch-action CSS プロパティを使用して、これらの動作のうちどれを許可し、どれを抑制するかを 宣言的に定義しなければなりません。

注記
ビューポートの操作に使用されるポインターの問題は、一般にはタッチ 入力(ユーザーの指がコンテンツを操作すると同時にページをパン/ズームできる場合)に限られますが、一部のユーザーエージェントでは 他のポインタータイプに対して同じ種類の(直接的または間接的な)操作を許可する場合もあります。たとえば、 モバイル/タブレットデバイスでは、ユーザーがスタイラスを使用してスクロールできる場合もあります。歴史的な 理由により、この仕様で定義される touch-action CSS プロパティは タッチ入力のみを対象としているように見えますが、実際にはパンおよびズームのための 直接操作を可能にするあらゆる形式のポインター入力に適用されます。

7.1 touch-action CSS プロパティ

名前: touch-action
値: auto | none | [ [ pan-x | pan-left | pan-right ] || [ pan-y | pan-up | pan-down ] ] | manipulation
初期値: auto
適用対象: 次を除くすべての要素: 置換されないインライン要素、表の行、行グループ、表の列、 および列グループ
継承: しない
パーセンテージ: 該当なし
メディア: 視覚
算出値: 指定値と同じ
正規順序: 文法に従う
アニメーションタイプ: アニメーション不可

touch-action CSS プロパティは、直接 操作によるインタラクション(プロパティ名に反してタッチに限定されません)が、ユーザーエージェントのパンおよびズーム動作を 引き起こしてもよいかどうかを決定します。touch-action の値に関する節を参照してください。

パンまたはズームを開始する直前に、次のすべての条件が真である場合、ユーザーエージェントポインターイベントストリームを抑制しなければなりません

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

7.2 サポートされる直接操作動作の決定

ユーザーが 直接操作ポインター(タッチスクリーン上の タッチやスタイラスなど)を使用して要素と対話する場合、その入力の効果は、 touch-action プロパティの値、および要素とその祖先のデフォルトの直接操作動作によって、次のように決定されます。

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

7.3 touch-action 値の詳細

touch-action プロパティは、ビューポートのパンおよびズームに関連する直接操作動作を対象とします。 テキストの選択/強調表示、リンクやフォームコントロールのアクティブ化など、その他のユーザーエージェントの動作は、 この CSS プロパティの影響を受けてはなりません

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

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

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

注記
パンおよびズームに関する一部のデフォルトの直接操作動作を無効にすると、 ユーザーエージェントが他の動作により迅速に応答できる場合があります。たとえば、auto では、 ユーザーエージェントは通常、ダブルタップジェスチャーを処理できるように、 click の前に 300ms の遅延を追加します。このような場合、touch-action: none または touch-action: manipulation を明示的に設定すると、この遅延がなくなります。 タップまたはダブルタップジェスチャーを判定する方法は、この仕様の範囲外であることに注意してください。
2: すべての 直接操作動作を禁止する
<div style="touch-action: none;">
    この要素は、通常であればパンまたはズームにつながるすべての直接操作インタラクションについてポインターイベントを受信します。
</div>
3: 水平方向の パンのみを許可する
<div style="touch-action: pan-x;">
    この要素は、水平方向にパンしていないときにポインターイベントを受信します。
</div>
4: パンおよびズームの 直接操作動作を禁止する子領域
<div style="overflow: auto;">
    <div style="touch-action: none;">
        この要素は、通常であればパンまたはズームにつながるすべての直接操作インタラクションについてポインターイベントを受信します。
    </div>
    <div>
        この要素上の直接操作インタラクションは、親を操作するために消費されてもよいです。
    </div>
</div>
5: パンおよびズームの直接操作動作を禁止する中間の親要素
<div style="overflow: auto;">
    <div style="touch-action: pan-y;">
        <div style="touch-action: pan-x;">
            この要素は、すべての直接操作インタラクションについてポインターイベントを受信します。これは、
            この要素が水平方向のパンのみを許可する一方、中間の祖先
            (この要素とスクロール可能な要素の間)が垂直方向のパンのみを許可するためです。
            したがって、パン/ズームの直接操作動作は
            ユーザーエージェントによって処理されません。
        </div>
    </div>
</div>
6: パンおよびズームで許可される直接操作動作を制限する中間の親要素
<div style="overflow: auto;">
    <div style="touch-action: pan-y pan-left;">
        <div style="touch-action: pan-x;">
            この要素は、左方向へパンしていないときにポインターイベントを受信します。
        </div>
    </div>
</div>

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

8.1 はじめに

この節は非規範的です。

ポインターキャプチャーにより、特定のポインターのイベント(あらゆる 互換マウスイベントを含む)を、ポインター位置の通常の ヒットテスト結果とは異なる特定の要素へ再ターゲットできます。これは、 カスタムスライダーコントロール(たとえば [HTML] の <input type="range"> コントロールに似たもの)のようなシナリオで役立ちます。ポインターキャプチャーをスライダーのつまみ 要素に設定することで、ポインターがつまみから外れた場合でも、ユーザーはコントロールを前後にスライドできます。

カスタム音量スライダー
6 つまみ 要素を前後にスライドして値を選択するカスタムスライダーコントロールの例。つまみ上で pointerdown が発生した後、ポインターキャプチャーを 使用することで、ポインターがつまみから外れた場合でもユーザーがつまみをスライドできるようにできます。

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

element.setPointerCapture(pointerId) メソッドを呼び出すことで、Element 型の element にポインターキャプチャーを設定します。 このメソッドが呼び出されたとき、ユーザーエージェントは、次の手順を実行しなければなりません

  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 リスナーで解放しようとして失敗した場合にも当てはまります。

8.3 ポインターキャプチャーの解放

element.releasePointerCapture(pointerId) メソッドを呼び出すことで、要素上のポインターキャプチャーを明示的に解放します。 このメソッドが呼び出されたとき、ユーザーエージェントは、次の手順を実行しなければなりません

  1. メソッドの引数として指定された pointerId が、いずれの アクティブなポインターにも一致せず、かつこれらの手順が ポインターキャプチャの暗黙的な 解放の結果として呼び出されているのではない場合、"NotFoundError" DOMExceptionスローします。
  2. 指定された pointerId を持つ Element に対して hasPointerCapture が false の場合、これらの 手順を終了します。
  3. 指定された pointerId について、設定されている場合は 保留中のポインターキャプチャ対象の 上書きをクリアします。
注記
ポインターキャプチャーの設定の節にある注記を参照してください。

8.4 暗黙的なポインターキャプチャー

パンおよびズームのための直接操作インタラクションを実装する入力 (タッチスクリーン上のタッチやスタイラスなど)は、任意の pointerdown リスナーが呼び出される直前に、対象要素で setPointerCapture が呼び出された場合と まったく同じように動作するべきですhasPointerCapture API は、これが 発生したかどうかを判定するために使用できます(たとえば、pointerdown リスナー内で)。次のポインターイベントが発火する前に、 そのポインターに対して releasePointerCapture が 呼び出されなかった場合、キャプチャが有効であることを示す gotpointercapture イベントが(通常どおり) 対象にディスパッチされます。

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

8.5 ポインターキャプチャーの暗黙的な解放

pointerup または pointercancel イベントを発火した直後、 ユーザーエージェントは、 直前にディスパッチされた pointerup または pointercancel イベントの pointerId について、保留中のポインターキャプチャーターゲットの オーバーライドをクリアしなければならず、 その後、必要に応じて lostpointercapture を発火するため、保留中のポインターキャプチャーを処理する手順を実行します。 保留中のポインターキャプチャーを処理する手順を実行した後、 ポインターがホバーをサポートする場合、ユーザーエージェントは、キャプチャーされていない ポインターの現在位置を反映するために必要な対応する境界イベントも 送信しなければなりません

ポインターキャプチャーターゲットのオーバーライドが、もはや 接続されていない場合 [DOM]、 ポインターキャプチャーターゲットのオーバーライドは 文書に設定されるべきです

保留中のポインターキャプチャーターゲットの オーバーライドが、もはや 接続されていない場合 [DOM]、 保留中のポインターキャプチャーターゲットの オーバーライドノードはクリアされるべきです

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

要素にポインターロック [PointerLock] が正常に適用されたとき、いずれかの要素が キャプチャーされるよう設定されている、またはキャプチャー保留中に設定されている場合、ユーザーエージェントは、releasePointerCapture メソッドが 呼び出されたかのように手順を実行しなければなりません

9. 統合イベントと予測イベント

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

9.1 統合イベント

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

統合された点と未統合の点を示す曲線の拡大表示
7 描画アプリケーションにおける曲線の例 — pointermove イベントの統合された 座標(灰色の点)のみを使用すると、曲線は明らかに 角ばってぎざぎざになります。同じ線を getCoalescedEvents() が提供する より細粒度の点(赤い円)を使用して描くと、ポインター移動をより滑らかに近似できます。

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

注記
信頼された親イベントは統合イベントの要約または集約であるため、 開発者が処理する必要があるのは親イベントまたはすべての統合イベントのどちらか一方だけであり、 両方ではありません。
注記
統合イベントリストを含む 信頼されたイベントが JavaScript から再ディスパッチされると、イベントディスパッチアルゴリズムはイベントの isTrusted ビットを false に設定しますが、統合 イベントリスト内の同じビットは、元の true 値から変更されません。

信頼されたイベントの統合イベントリスト内のイベントは、次のものを持ちます。

7: 統合 イベントリストを使用する基本的なキャンバス描画アプリケーション
<style>
    /* ユーザーエージェント固有の直接操作動作(パンやズームなど)を無効にし、
    代わりに canvas 要素上のすべてのイベントがアプリケーションへ渡されるようにする。 */

    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 の属性は、統合イベントリスト内のイベントを最も適切に表す方法で 初期化されます。ユーザーエージェントがこれを行う具体的な方法は、 この仕様の対象ではありません。

ディスパッチされたこれらすべてのイベントの順序は、元のイベントの実際の順序と一致しなければなりません。 たとえば、pointerdown イベントによって 統合された pointermove イベントのディスパッチが発生する場合、ユーザーエージェントはまず、 ある pointerId の それらすべての統合イベントを持つ 1 つの pointermove イベントをディスパッチし、その後に pointerdown イベントをディスパッチしなければなりません

注記

以下は、timeStamp 値が増加する実際のイベントと、 ユーザーエージェントによってディスパッチされる イベントの例です。

実際のイベント ディスパッチされるイベント
ポインター(pointerId=2) の座標変更 pointerrawupdatepointerId=2)、1 つの 統合イベント付き
ポインター(pointerId=1) の座標変更 pointerrawupdatepointerId=1)、1 つの 統合イベント付き
ポインター(pointerId=2) の座標変更 pointerrawupdatepointerId=2)、1 つの 統合イベント付き
ポインター(pointerId=2) の座標変更 pointerrawupdatepointerId=2)、1 つの 統合イベント付き
ポインター(pointerId=1) の座標変更 pointerrawupdatepointerId=1)、1 つの 統合イベント付き
ポインター(pointerId=2) の座標変更 pointerrawupdatepointerId=2)、1 つの 統合イベント付き
ポインター(pointerId=1)のボタン 押下 pointermovepointerId=1)、2 つの 統合イベント付き
pointermovepointerId=2)、4 つの 統合イベント付き
pointerdownpointerId=1)、統合イベント なし
ポインター(pointerId=2) の座標変更 pointerrawupdatepointerId=2)、1 つの 統合イベント付き
ポインター(pointerId=2) の座標変更 pointerrawupdatepointerId=2)、1 つの 統合イベント付き
ポインター(pointerId=1)のボタン 解放 pointermovepointerId=2)、2 つの 統合イベント付き
pointeruppointerId=1)、統合イベント なし

9.2 予測イベント

一部のユーザーエージェントには、確認済みの一連のポインター移動の後に、 現在のジェスチャーにおける先行イベントと移動の速度/軌道に基づいて、 将来のポインター移動位置がどこになる可能性があるかを予測できる組み込みアルゴリズムがあります。 アプリケーションは getPredictedEvents メソッドでこの情報を使用し、 知覚される遅延を減らすため、予測位置まで投機的に「先描き」し、 実際の点を受信した時点でこれらの予測点を破棄できます。

統合された点を使用して描かれ、将来の予測点を示す線
8 描画アプリケーションにおける線(左下から右上へ描くジェスチャーの結果)の例。 pointermove イベントの統合された座標を使用し、ユーザー エージェントが予測した将来の点(灰色の円)を示しています。

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

注記

pointerrawupdate イベントは空でない 統合イベントリストを持つ場合がありますが、 その 予測イベントリストは、パフォーマンス上の 理由から通常は空のリストになります。

注記
予測イベントリストを含む 信頼されたイベントが JavaScript から再ディスパッチされると、イベントディスパッチアルゴリズムはイベントの isTrusted ビットを false に設定しますが、予測 イベントリスト内の同じビットは、元の true 値から変更されません。

リスト内のイベント数と、現在のタイムスタンプからどの程度先までのものかは、 ユーザーエージェントと、それが使用する予測アルゴリズムによって決定されます。

信頼されたイベントの予測イベントリスト内のイベントは、次のものを持ちます。

注記

作者は、次のポインターイベントが ディスパッチされるまでの間だけ、予測イベントを有効な予測として扱うべきであることに注意してください。 ユーザーエージェントがどの程度先の未来までイベントを予測するかによっては、 通常のポインターイベントが、1 つ以上の予測イベントのタイムスタンプより前にディスパッチされる可能性があります。

8: 統合イベントと予測イベントを使用した描画の概念的なアプローチ

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);
    }
});

9.3 統合イベントリストおよび予測イベントリストの設定と維持

信頼された PointerEvent が作成されたとき、ユーザーエージェントは、 統合イベントリストおよび 予測イベントリスト内の各イベントについて、次の手順を実行するべきです

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

信頼された PointerEventtarget が変更されたとき、ユーザーエージェントは 統合イベントリストおよび 予測イベントリスト内の各イベントについて、次のようにするべきです

  1. イベントの target を、「親」 ポインターイベントの target と一致するように設定します。

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

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

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

注記

大まかに言えば、互換マウスイベントは、それぞれに対応する ポインターイベントと「交互に挿入」されることを意図しています。ただし、この特定の順序は必須ではなく、 互換マウスイベントを実装するユーザーエージェントは、それらの相対的な順序が一貫している限り、 マウスイベントのディスパッチを遅延またはグループ化することを選択してもかまいません

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

互換マウスイベントをサポートするかどうかに関係なく、ユーザーエージェントは clickauxclick、および contextmenu イベントを常にサポートしなければなりません。これらのイベントは PointerEvent 型であり、したがって 互換マウスイベントではないためです。 ポインターイベント中に preventDefault を呼び出しても、 clickauxclick、または contextmenu が発火するかどうかに 影響してはなりません

注記

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

さらに、ユーザーエージェントは、 clickauxclick、または contextmenu イベントを発火するかどうかを判断するために、 独自のヒューリスティクスを適用する場合があります。一部の ユーザーエージェントは、同じタイプの他の(非プライマリ)ポインター、または異なるタイプの他のプライマリポインターが存在する場合、 これらのイベントを発火しないことを選択する場合があります。ユーザーエージェントは、特定の 操作が「明確な」タップ、クリック、または長押しではなかったと判断し(たとえば、タッチ スクリーン上で指による操作中、指が画面に接触している間に動きすぎた場合)、 clickauxclick、または contextmenu イベントを発火しないことを決定する場合があります。ユーザーエージェント動作のこれらの側面は、この 仕様では定義されておらず、実装によって異なる場合があります。

特に記載がない限り、マッピングされたマウスイベントのターゲットは、ターゲットがその ownerDocument のツリーに参加しなくなっていない限り、対応するポインターイベントと同じ ターゲットであるべきです。参加しなくなった場合、マウスイベントは、元のターゲットが ツリーから削除された時点で、その ownerDocument のツリーにまだ参加している最も近い 祖先ノードで発火するべきです。これは、マウスイベント用に (新しいターゲットノードに基づく)新しいイベントパスが構築されることを意味します。

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

マウスイベントを防止できるのは、ポインターが押下状態にある場合のみです。ホバーしているポインター(たとえばボタンが 押されていないマウス)のマウスイベントを防止することはできません。

mouseovermouseoutmouseenter、および mouseleave イベントは、決して防止されません(ポインターが押下状態にある場合でも)。

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

10.1 従来のマウスポインターの有効位置の 追跡

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

pointerdownpointerup、または pointermove イベント、あるいは window での pointerleave イベントを発火する直前に、ユーザーエージェントは 次の手順を実行するべきです

  1. T を、ディスパッチされる pointerdownpointerup、または pointermove イベントのターゲットとします。pointerleave イベントの場合、T を未設定にします。
  2. T と現在の 従来のマウスポインターの 有効位置の両方が未設定であるか、または両者が等しい場合、これらの手順を終了します。
  3. 現在の 従来のマウスポインターの 有効位置から T へマウスが移動する場合のマウスイベントに従って、 mouseovermouseoutmouseenter、および mouseleave イベントをディスパッチします。現在の 従来のマウスポインターの 有効位置または T のいずれかが未設定の場合、それをウィンドウ外のマウス位置と見なします。
  4. 従来のマウスポインターの 有効位置T に設定します。
注記

従来の マウスポインターの有効位置は、ポインター遷移イベント (pointeroverpointeroutpointerenter および pointerleave)から対応する従来のマウス遷移イベント (mouseovermouseoutmouseenter、および mouseleave)へ常に直接 マッピングできるわけではないという事実をモデル化します。次の アニメーションは、単一の従来のマウス入力を使用して 2 つのプライマリポインターを 調整するために、ユーザーエージェントがポインター遷移イベントより多くの従来のマウス遷移イベントを ディスパッチする必要がある場合を示しています。

9 同時に存在するマウスポインター(白いカーソル)とタッチポインター(白い「手」のカーソル)によって、 単一の従来のマウス入力 (オレンジ色のカーソル)が 2 つのポインター間を移動します。

このアニメーションでは、マウスクリックとタッチによるタップの間の時間に注目してください。ボタン 1 は pointerout イベントを受信しません(「実際の」マウスポインターがこの期間中に ボタンの矩形から離れていないため)が、タッチによるタップで 従来の マウスポインターの有効位置がボタン 2 に移動すると、ボタン 1 は mouseout イベントを受信します。同様に、タッチによる タップからマウスがボタン 1 を離れる直前までの期間では、同じ理由によりボタン 1 は pointerover イベントを受信しませんが、従来のマウスポインターの 有効位置がボタン 1 の内側へ戻ると、ボタン 1 は mouseover イベントを受信します。

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

ユーザーエージェントがホバーをサポートするデバイスのポインターイベントをディスパッチするときは常に、 次の手順を実行するべきです

  1. ディスパッチするポインターイベントの isPrimary プロパティが false の場合、ポインターイベントをディスパッチしてこれらの手順を終了します。
  2. ディスパッチするポインターイベントが pointerdownpointerup、または pointermove イベント、あるいは window での pointerleave イベントである場合、従来の マウスポインターの有効位置の追跡で説明されているように、互換マウス遷移イベントをディスパッチします。
  3. ポインターイベントをディスパッチします。
  4. ディスパッチしたポインターイベントが pointerdown であり、イベントの キャンセル済みフラグが設定されている場合、この pointerType に対して PREVENT MOUSE EVENT フラグを設定します。
  5. この pointerType に対して PREVENT MOUSE EVENT フラグが 設定されておらず、ディスパッチしたポインターイベントが次の場合:
    • pointerdown の場合、 mousedown イベントを発火します。
    • pointermove の場合、 mousemove イベントを発火します。
    • pointerup の場合、 mouseup イベントを発火します。
    • pointercancel の場合、windowmouseup イベントを発火します。
  6. ディスパッチしたポインターイベントが pointerup または pointercancel の場合、この pointerType に対する PREVENT MOUSE EVENT フラグをクリアします。

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

ほとんどのタッチスクリーンなど、一部のデバイスは、アクティブ状態でない間に座標(または座標の集合)上を ホバーすることをサポートしません。マウスイベントを対象に記述された既存コンテンツの多くは、 マウスがイベントを生成しているものと仮定しており、そのため一般に次のような特性が成り立つと想定しています。

注記
マウス向けに設計されたコンテンツでは、UI 要素の表示/非表示を切り替えるためにホバーが使用される場合があります (たとえば「ホバーメニュー」)。このようなコンテンツは、ホバーをサポートしないデバイスと互換性がない場合がよくあります。 この仕様では、このシナリオとの互換性のためのマッピングまたは動作を定義しません。 これは仕様の将来のバージョンで検討されます。

そのため、ユーザーエージェントはこれらの種類の入力デバイスについて異なるマッピングを提供する必要があります。 ユーザーエージェントが ホバーをサポートしないデバイスのポインターイベントをディスパッチするときは常に、 次の手順を実行するべきです

  1. ディスパッチするポインターイベントの isPrimary プロパティが false の場合、ポインターイベントをディスパッチしてこれらの手順を終了します。
  2. ディスパッチするポインターイベントが pointerover であり、そのポインターについて pointerdown イベントがまだディスパッチされていない場合、 mousemove イベントを発火します(従来の マウス固有コードとの互換性のため)。
  3. ディスパッチするポインターイベントが pointerdownpointerup、または pointermove イベント、あるいは window での pointerleave イベントである場合、従来の マウスポインターの有効位置の追跡で説明されているように、互換マウス遷移イベントをディスパッチします。
  4. ポインターイベントをディスパッチします。
  5. ディスパッチしたポインターイベントが pointerdown であり、イベントの キャンセル済みフラグが設定されている場合、この pointerType に対して PREVENT MOUSE EVENT フラグを設定します。
  6. この pointerType に対して PREVENT MOUSE EVENT フラグが 設定されておらず、ディスパッチしたポインターイベントが次の場合:
    • pointerdown の場合、 mousedown イベントを発火します。
    • pointermove の場合、 mousemove イベントを発火します。
    • pointerup の場合、 mouseup イベントを発火します。
    • pointercancel の場合、windowmouseup イベントを発火します。
  7. ディスパッチしたポインターイベントが pointerup または pointercancel の場合、この pointerType に対する PREVENT MOUSE EVENT フラグをクリアします。

ユーザーエージェントが Touch Events([TOUCH-EVENTS] で定義) と Pointer Events の両方をサポートする場合、ユーザー エージェントは、この節で説明する互換マウスイベントと、 [TOUCH-EVENTS] で示される フォールバック マウスイベント両方を生成してはなりません

注記

ホバーをサポートしないプライマリポインター (たとえばタッチスクリーン上の 1 本の指)による要素のアクティブ化(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

11. マウスイベントとインターフェイス

マウスイベントモジュールは、[HTML401] の onclickondblclickonmousedownonmouseuponmouseoveronmousemove、および onmouseout 属性に由来します。このイベントモジュールは、 マウスやトラックボールなどのポインティング入力デバイスで使用するために特別に設計されています。

DOM Level 2 で導入され、この仕様で変更されています。

MouseEvent インターフェイスは、マウスイベントに関連付けられた固有の コンテキスト情報を提供します。

要素が入れ子になっている場合、マウスイベントは常に最も深く入れ子になった要素をターゲットとします。

注記

ターゲット要素の祖先は、イベントバブリングを使用して、 その子孫要素内で発生したマウスイベントの通知を取得できます。

MouseEvent インターフェイスのインスタンスを作成するには、 任意の MouseEventInit 辞書を渡して、MouseEvent コンストラクターを使用します。

注記

initMouseEvent を使用して MouseEvent オブジェクトを初期化するとき、 実装はクライアント座標 clientX および clientY を、他の座標 (DOM Level 0 実装で公開されるターゲット座標や、その他の独自属性、 たとえば pageX)の計算に使用できます。

11.1 MouseEvent インターフェイス

WebIDLdictionary MouseEventInit : EventModifierInit {
	long screenX = 0;
	long screenY = 0;
	long clientX = 0;
	long clientY = 0;

	short button = 0;
	unsigned short buttons = 0;
	EventTarget? relatedTarget = null;
};

[Exposed=Window]
interface MouseEvent : UIEvent {
	constructor(DOMString type, optional MouseEventInit eventInitDict = {});
	readonly attribute long screenX;
	readonly attribute long screenY;
	readonly attribute long clientX;
	readonly attribute long clientY;
	readonly attribute long layerX;
	readonly attribute long layerY;

	readonly attribute boolean ctrlKey;
	readonly attribute boolean shiftKey;
	readonly attribute boolean altKey;
	readonly attribute boolean metaKey;

	readonly attribute short button;
	readonly attribute unsigned short buttons;

	readonly attribute EventTarget? relatedTarget;

	boolean getModifierState(DOMString keyArg);
};
screenX

画面座標系の原点を基準としてイベントが発生した水平方向の座標です。

この属性の 未初期化値0なければなりません

screenY

画面座標系の原点を基準としてイベントが発生した垂直方向の座標です。

この属性の 未初期化値0なければなりません

clientX

イベントに関連付けられたビューポートを基準として、イベントが発生した水平方向の座標です。

この属性の 未初期化値0なければなりません

clientY

イベントに関連付けられたビューポートを基準として、イベントが発生した垂直方向の座標です。

この属性の 未初期化値0なければなりません

layerX

積層コンテキストであるか、位置指定されているか、または 積層コンテキストを 描画する際に位置指定フェーズで描画される、最も近い 祖先要素からの水平方向のオフセットです。

この属性の 未初期化値0なければなりません

layerY

積層コンテキストであるか、位置指定されているか、または 積層コンテキストを 描画する際に位置指定フェーズで描画される、最も近い 祖先要素からの垂直方向のオフセットです。

この属性の 未初期化値0なければなりません

ctrlKey

KeyboardEventctrlKey 属性を参照してください。

この属性の 未初期化値falseなければなりません

shiftKey

KeyboardEventshiftKey 属性を参照してください。

この属性の 未初期化値falseなければなりません

altKey

KeyboardEventaltKey 属性を参照してください。

この属性の 未初期化値falseなければなりません

metaKey

KeyboardEventmetaKey 属性を参照してください。

この属性の 未初期化値falseなければなりません

button

マウスボタンの押下または解放によって発生したマウスイベントでは、button を使用して、 どのポインターデバイスのボタンの状態が変化したかを示さなければなりません

button 属性の値は 次のようでなければなりません

  • 0 は、デバイスのプライマリボタン(一般には 左ボタン、または 1 ボタンデバイスの唯一のボタンで、ユーザーインターフェイスコントロールを アクティブ化したりテキストを選択したりするために使用されるもの)または未初期化値を示さなければなりません
  • 1 は、補助ボタン(一般には 中央ボタンで、多くの場合マウスホイールと組み合わされるもの)を示さなければなりません
  • 2 は、セカンダリボタン(一般には 右ボタンで、多くの場合コンテキストメニューを表示するために使用されるもの)を示さなければなりません
  • 3 は X1(戻る)ボタンを示さなければなりません
  • 4 は X2(進む)ボタンを示さなければなりません

一部のポインティングデバイスは、さらに多くのボタン状態を提供またはシミュレートし、そのようなボタンを表すために 2 より大きい値または 0 より小さい値を使用してもかまいません

注記

button の値は、 マウスボタンの押下/解放によって発生したものではないイベントでは 更新されません。このような状況では、値 0 を左ボタンと解釈せず、 デフォルト値として解釈するよう注意してください。

注記

mousedownmouseup などのイベントに関連する一部の デフォルトアクションは、 使用されている特定のマウスボタンに依存します。

この属性の 未初期化値0なければなりません

buttons

あらゆるマウスイベント中、buttons を使用して、 現在どの組み合わせのマウスボタンが押されているかをビットマスクとして示さなければなりません

注記

buttons 属性はビットフィールドです。 ビットフィールドの値にマスク値 1 を適用して真になる場合、プライマリ マウスボタンが押されています。ビット フィールドの値にマスク値 2 を適用して真になる場合、右マウスボタンが押されています。 ビットフィールドの値にマスク値 4 を適用して真になる場合、補助/中央ボタンが押されています。

注記

名前は似ていますが、buttons 属性と button 属性の値は大きく 異なります。button の値は、 mousedown / mouseup イベントハンドラー中に有効であると想定される一方、buttons 属性は、 「現在アクティブなボタンがない」状態(0)を表すことができるため、信頼された任意の MouseEvent オブジェクトについて (ディスパッチ中の)マウスボタンの状態を反映します。

buttons 属性の値は 次のようでなければなりません

  • 0 は現在アクティブなボタンがないことを示さなければなりません
  • 1 はデバイスのプライマリボタン(一般には 左ボタン、または 1 ボタンデバイスの唯一のボタンで、ユーザーインターフェイスコントロールを アクティブ化したりテキストを選択したりするために使用されるもの)を示さなければなりません
  • 2 は、存在する場合、セカンダリボタン(一般には 右ボタンで、多くの場合コンテキストメニューを表示するために使用されるもの)を示さなければなりません
  • 4 は補助ボタン(一般には 中央ボタンで、多くの場合マウスホイールと組み合わされるもの)を示さなければなりません

一部のポインティングデバイスは、さらに多くのボタンを提供またはシミュレートします。そのようなボタンを表すには、 後続するボタンごとに値を 2 倍にしなければなりません(二進系列 81632、...)。

注記

任意のボタン値の集合の合計は一意の数になるため、コンテンツ作者は ビット演算を使用して、デバイス上の任意の数のマウスボタンについて、 現在いくつのボタンが押されているか、およびどのボタンが押されているかを判定できます。たとえば、 値 3 は左ボタンと右ボタンの両方が現在押されていることを示し、 値 5 は左ボタンと中央ボタンの両方が現在 押されていることを示します。

注記

mousedownmouseup などのイベントに関連する一部の デフォルトアクションは、 使用されている特定のマウスボタンに依存します。

この属性の 未初期化値0なければなりません

relatedTarget

イベントの種類に応じて、UI イベントに関連するセカンダリ EventTarget を識別するために使用されます。

この属性の 未初期化値nullなければなりません

relatedTarget は、 マウスポインターが直前に境界から離れた要素(mouseover または mouseenter イベントの場合)、または マウスポインターが境界内へ入ろうとしている要素(mouseoutmouseleave、または focusout イベントの場合)に 初期化するべきです。その他のイベントでは、この値を割り当てる必要はありません (デフォルトで null になります)。

getModifierState(keyArg)

キー値を使用して修飾キーの状態を問い合わせます。

それが修飾キーであり、その修飾キーがアクティブ化されている場合は true を返し、 それ以外の場合は false を返します。

DOMString keyArg
この引数の説明については、KeyboardEventgetModifierState() メソッドを参照してください。

実装は、マウスイベントを生成するとき、現在のクリック 回数を維持しなければなりません。これは、特定の時間内にポインティングデバイスのボタンが 連続してクリックされた回数を示す非負整数でなければなりません。 カウントがリセットされるまでの遅延は、環境設定に固有です。

11.2 MouseEvent アルゴリズム

11.2.1 ネイティブ OS の要件

この節のアルゴリズムでは、ネイティブプラットフォーム OS が次のものを提供すると仮定します。

これらのイベントについて、OS は次の情報を提供できます。

  • ネイティブ OS のデスクトップを基準としたマウスの x,y 座標
  • UA のウィンドウビューポートを基準としたマウスの x,y 座標
  • 現在押されているキーボード修飾キー

11.2.2 マウスイベントの構築

警告

この節は改訂する必要があります。

一般に、Event インターフェイス、または Event インターフェイスを継承するインターフェイスの コンストラクターが呼び出された場合、[DOM] で説明されている手順に従うべきです。ただし、MouseEvent インターフェイスは、Event オブジェクトのキー 修飾子の内部状態を初期化するための追加の辞書メンバーを提供します。具体的には、getModifierState() メソッドを使用して問い合わせる内部状態です。この節では、これらの任意の修飾子 状態を使用して新しい MouseEvent オブジェクトを初期化するための [DOM] の手順を補足します。

以下のアルゴリズムを使用して MouseEvent、またはこれらのオブジェクトから派生したオブジェクトを 構築する目的では、すべての MouseEvent および派生 オブジェクトは、[UIEvents-Key] の 修飾キー表で説明される キー修飾子名を使用して設定および取得できる 内部キー修飾子状態を持ちます。

次の手順は、[DOM] で定義されるイベント構築アルゴリズムを補足します。

  • 構築中の EventMouseEvent オブジェクトまたはそれから派生する オブジェクトであり、EventModifierInit 引数がコンストラクターに指定された場合、次のサブ手順を実行します。
    • EventModifierInit 引数について、辞書メンバーが文字列 "modifier" で始まる場合、キー修飾子名を、接頭辞 "modifier" を除いた辞書メンバーの名前とし、Event オブジェクトの 内部キー 修飾子状態のうち、キー修飾子名と一致するものを、対応する 値に設定します。

11.2.3 MouseEvent の グローバル状態

警告

この節は改訂する必要があります。

11.2.3.1 ユーザーエージェントレベルの 状態

UA は、ユーザーエージェント全体で共有される次の値を維持しなければなりません。

マウス ボタンの現在の状態を追跡する マウスボタンビットマスク

11.2.3.2 Window レベルの状態

UA は、Window で共有される次の値を維持しなければなりません。

MouseEvent を最後に送信した Element を追跡する 最後の マウス要素値(初期値は undefined)。

最新のマウス イベントが送信された時点での 最後のマウス要素の祖先 Element のスナップショットを含む 最後の マウス DOM パス値(初期値は空)。

11.2.4 MouseEvent の 内部状態

警告

この節は改訂する必要があります。

MouseEvent には、さまざまな修飾キーの状態を 追跡するために使用される次の内部フラグがあります。 shift フラグcontrol フラグalt フラグaltgraph フラグ、 および meta フラグ。 これらのフラグは、マウスイベントの時点で対応する修飾キーが押されていた場合に設定されます。

11.2.5 ヒットテスト

警告

この節は改訂する必要があります。

  1. pos を、ビューポートを基準とした x,y 座標とします
  2. pos を用いて [CSSOM-View] の elementFromPoint()pos にある最前面の DOM 要素)を返します
    注記

    inert または disabled 要素を考慮するため、これは elementsFromPoint() を呼び出し、無効な要素を除外するべきです。

11.2.6 MouseEvent を初期化する

警告

この節は改訂する必要があります。

eventeventTypeeventTargetbubbles、および cancelable を用いて MouseEvent を初期化するには、次の手順を実行します。

  1. eventeventTypeeventTargetbubbles、および cancelable を用いて UIEvent を 初期化します
  2. event.screenX を、デスクトップの原点を 基準としてイベントが発生した位置の x 座標に設定します
  3. event.screenY を、デスクトップの原点を 基準としてイベントが発生した位置の y 座標に設定します
  4. event.clientX を、ビューポートの原点を基準として イベントが発生した位置の x 座標に設定します
  5. event.clientY を、ビューポートの原点を基準として イベントが発生した位置の y 座標に設定します
  6. event を用いて マウスイベント修飾子を設定します
  7. event.button を 0 に設定します
  8. event.buttonsマウスボタンビットマスクに設定します
  9. event を用いて MouseEvent の PointerLock 属性を初期化します
    課題 1

    ここにハードコードする代わりに、PointerLock 用のフックを提供するべきです。

11.2.7 マウスイベント修飾子を設定する

警告

この節は改訂する必要があります。

  1. event を、更新する MouseEvent とします
  2. キー修飾子状態に "Shift" が含まれる場合、eventshift フラグを設定し、それ以外の場合は設定を解除します
  3. キー修飾子状態に "Control" が含まれる場合、eventcontrol フラグを設定し、それ以外の場合は設定を解除します
  4. キー修飾子状態に "Alt" が含まれる場合、eventalt フラグを設定し、それ以外の場合は設定を解除します
  5. キー修飾子状態に "AltGraph" が含まれる場合、eventaltgraph フラグを設定し、それ以外の場合は設定を解除します
  6. キー修飾子状態に "Meta" が含まれる場合、eventmeta フラグを設定し、それ以外の場合は設定を解除します
  7. イベントの shift フラグが設定されている場合、event.shiftKey を true に設定し、それ以外の場合は false に設定します
  8. イベントの control フラグが設定されている場合、event.ctrlKey を true に設定し、それ以外の場合は false に設定します
  9. イベントの alt フラグまたは altgraph フラグが設定されている場合、event.altKey を true に設定し、それ以外の場合は false に設定します
  10. イベントの meta フラグが設定されている場合、event.metaKey を true に設定し、それ以外の場合は false に設定します

11.2.8 キャンセル可能な MouseEvent を作成する

警告

この節は改訂する必要があります。

  1. eventType を、有効な MouseEvent タイプを含む DOMString とします
  2. eventTarget を、イベントの EventTarget とします
  3. bubbles を true とします
  4. cancelable を true とします
  5. event を、MouseEvent を使用して イベントを作成した結果とします
  6. eventeventTypeeventTargetbubbles、および cancelable を用いて MouseEvent を初期化します
  7. event を返します

11.2.9 キャンセル不可能な MouseEvent を作成する

警告

この節は改訂する必要があります。

  1. eventType を、有効な MouseEvent タイプを含む DOMString とします
  2. eventTarget を、イベントの EventTarget とします
  3. bubbles を "false" とします
  4. cancelable を "false" とします
  5. event を、MouseEvent を使用して イベントを作成した結果とします
  6. eventeventTypeeventTargetbubbles、および cancelable を用いて MouseEvent を初期化します
  7. event を返します

11.2.10 MouseEvent の button 属性を計算する

警告

この節は改訂する必要があります。

これは、MouseEventbutton 属性に格納するのに適したボタン ID を返します。

  1. mbutton を、マウスボタンを識別する ID とします
  2. mbutton がプライマリマウスボタンである場合、0 を返します
  3. mbutton が補助(中央)マウスボタンである場合、1 を返します
  4. mbutton がセカンダリマウスボタンである場合、2 を返します
  5. mbutton が X1(戻る)ボタンである場合、3 を返します
  6. mbutton が X2(進む)ボタンである場合、4 を返します

11.2.11 ネイティブから MouseEvent の属性を設定する

警告

この節は改訂する必要があります。

  1. event を、初期化する MouseEvent とします
  2. native をネイティブのマウスイベントとします
    編集者注記

    TODO.

  3. event.type が [ mousedown, mouseup ] のいずれかである場合、
    1. mbutton を、どのマウス ボタンが押されたかを識別する native からの ID とします
    2. event.button を、 mbutton を用いて MouseEvent の button 属性を計算した結果に設定します

11.2.12 ネイティブのマウスダウンを処理する

警告

この節は改訂する必要があります。

  1. native をネイティブの mousedown とします
  2. mbutton を、どのマウスボタンが 押されたかを識別する native からの ID とします
  3. マウスボタンビットマスクを次のように更新します。
    1. mbutton がプライマリマウスボタンである場合、0x01 ビットを設定します
    2. mbutton がセカンダリマウスボタンである場合、0x02 ビットを設定します
    3. mbutton が補助(中央)マウスボタンである場合、0x04 ビットを設定します
      注記

      その他のボタンは 0x08 から追加できます。

  4. target を、native からのビューポート相対座標を用いた ヒットテストとします
  5. event を、"mousedown"、target を用いて キャンセル可能な MouseEvent を作成した 結果とします
  6. native を用いて ネイティブから MouseEvent の属性を 設定します
  7. event を用いて 必要に応じて pointerdown イベントを送信します
  8. result を、eventtargetディスパッチした結果とします
  9. result が true であり、targetクリックフォーカス可能フォーカス可能領域である場合、
    1. target に対して フォーカス 手順を実行します
  10. mbutton がセカンダリマウスボタンである場合、
    1. nativetarget を用いて 必要に応じてコンテキストメニューを表示します

11.2.13 ネイティブのマウスアップを処理する

警告

この節は改訂する必要があります。

  1. native をネイティブの mouseup とします
    注記

    mousedown と mouseup の間に、その他のマウスイベントが発生する場合があります。

  2. mbutton を、どのマウスボタンが 押されたかを識別する native からの ID とします
  3. マウスボタンビットマスクを次のように更新します。
    1. mbutton がプライマリマウスボタンである場合、0x01 ビットをクリアします
    2. mbutton がセカンダリマウスボタンである場合、0x02 ビットをクリアします
    3. mbutton が補助(中央)マウスボタンである場合、0x04 ビットをクリアします
  4. target を、native からのビューポート相対座標を用いた ヒットテストとします
  5. event を、"mouseup"、target を用いて キャンセル可能な MouseEvent を作成した 結果とします
  6. native を用いて ネイティブから MouseEvent の属性を 設定します
  7. event を用いて 必要に応じて pointerup イベントを送信します
  8. eventtargetディスパッチします

11.2.14 ネイティブのマウスクリックを処理する

警告

この節は改訂する必要があります。

  1. native をネイティブのマウスクリックとします
    注記

    プラットフォームは、クリックを生成する mouseup について、ネイティブのマウスアップを処理するの直後にこれを呼び出すべきです。

  2. target を、native からのビューポート相対座標を用いた ヒットテストとします
  3. native および target を用いて click イベントを送信します

11.2.15 click イベントを送信する

警告

この節は改訂する必要があります。

  1. native をネイティブの mousedown とします
  2. target を、イベントの EventTarget とします
  3. mbutton を 1(デフォルトではプライマリマウスボタン)とします
  4. native が有効である場合、
    1. mbutton を、どのマウス ボタンが押されたかを識別する native からの ID とします
  5. mbutton がプライマリマウスボタンである場合は eventType を "click" に設定し、それ以外の場合は "auxclick" に設定します
  6. event を、eventType および target を用いて PointerEvent を作成した 結果とします
  7. native が有効である場合、
    1. eventnative を用いて ネイティブから MouseEvent の属性を設定します
    2. event.screenX が整数値でない場合、丸めます。
    3. event.screenY が整数値でない場合、丸めます。
  8. eventtargetディスパッチします
    注記

    PointerEvents と丸められた座標を使用するブラウザーについての情報は、 pointerevents/100 を参照してください。

    編集者注記

    あらゆる「デフォルトアクション」は、ディスパッチ中にターゲットの アクティブ化 動作 アルゴリズムをトリガーすることで処理されます。そのため、ここで処理する必要はありません。 ただし、既存の仕様が disabled/css-pointer-events/inert/... を処理していることを確認する必要があります。

    注記

    HTMLelement.click() を処理するには、native = null、target = HTMLelement としてこのアルゴリズムを呼び出します。

    注記

    キーボードによって開始されたクリックを処理するには、native = null、 target = 現在フォーカスされている要素としてこのアルゴリズムを呼び出します。

11.2.16 ネイティブのマウスダブルクリックを処理する

警告

この節は改訂する必要があります。

  1. native をネイティブのマウスダブルクリックとします
    注記

    ダブルクリックを生成するマウスクリックについて、ネイティブのマウスクリックを処理した直後に これを呼び出すべきです。

  2. mbutton を、どのマウスボタンが 押されたかを識別する native からの ID とします
  3. mbutton がプライマリマウスボタンでない場合、返ります
  4. target を、native からのビューポート相対座標を用いた ヒットテストとします
  5. event を、"dblclick" および target を用いて PointerEvent を作成した 結果とします
  6. eventnative を用いて ネイティブから MouseEvent の属性を 設定します
  7. event.screenX が整数値でない場合、 丸めます。
  8. event.screenY が整数値でない場合、 丸めます。
  9. eventtargetディスパッチします

11.2.17 ネイティブのマウス移動を処理する

警告

この節は改訂する必要があります。

  1. native をネイティブのマウス移動とします
    課題 2

    このアルゴリズムは、PointerEvents のディスパッチについて、現在明示的に 規定されていないため、いくつかの仮定を置いています。pointerevents/285 が 解決された後、これを更新する必要がある場合があります。

  2. target を、native からのビューポート相対座標を用いた ヒットテストとします
  3. targetDomPath を、target包含祖先とします
  4. 現在の要素から退出するイベントを生成します。
    1. 最後のマウス要素が定義されており、 target と等しくない場合、
      1. mouseout を、"mouseout" および 最後のマウス要素を用いて キャンセル可能な MouseEvent を作成した結果とします
        編集者注記

        TODO: native から mouseout の属性を設定する。+CSSOM 属性。

    2. mouseout を用いて 必要に応じて pointerout イベントを送信します
    3. mouseouttargetディスパッチします
      注記

      キャンセルされた場合の動作を確認する(影響はないように見える)。

    4. leaveElements を、targetDomPath と共通するすべての要素を削除した 最後の マウス DOM パスのコピーとします。
    5. leaveElements 内の各 element について、次を行います
      編集者注記

      element が削除されている場合を処理する。 また、移動されている場合も処理する。DOM の変更によって mouseleave イベントが発火するべきだったか?今送信するべきか?破棄するべきか? 現在のブラウザーが何を行うか確認する必要がある。

      1. mouseleave を、"mouseleave" および element を用いて キャンセル不可能な MouseEvent を作成した結果とします
      2. mouseleave.Event.composed = false に設定します
        注記

        互換性を確認: event.composed の値。仕様では false。Chrome/Linux = true。Firefox/Linux = false。

      3. mouseleave を用いて 必要に応じて pointerleave イベントを送信します
      4. result を、mouseleaveelementディスパッチした 結果とします
  5. 新しい要素に進入するイベントを生成します。
    1. target最後のマウス要素でない場合、
      1. mouseover を、"mouseover" および target を用いて キャンセル可能な MouseEvent を作成した結果とします
        編集者注記

        TODO: native から mouseout の属性を設定する。+CSSOM 属性。

      2. mouseover を用いて 必要に応じて pointerover イベントを送信します
      3. mouseouttargetディスパッチします
        注記

        キャンセルされた場合の動作を確認する必要がある(影響はないように見える)。

      4. enterElements を、最後のマウス DOM パスと共通するすべての 要素を削除した targetDomPath のコピーとします。
      5. enterElements 内の各 element について、次を行います
        注記

        element が削除または移動されている場合を処理する。

        1. mouseenter を、"mouseenter" および element を用いて キャンセル不可能な MouseEvent を作成した結果とします
        2. mouseenter.Event.composed = false に設定します
          注記

          互換性を確認: event.composed の値。仕様では false。 Chrome/Linux = true。 Firefox/Linux = false。

        3. mouseenter を用いて 必要に応じて pointerenter イベントを送信します
          注記

          Shadow DOM 要素の互換性を確認する。Chrome/Linux は、この イベントを要素と shadow root で発火する。

        4. result を、mouseenterelementディスパッチした 結果とします
      6. 最後のマウス要素target に設定します
      7. 最後のマウス DOM パスtargetDomPath に設定します
  6. mousemove を、"mousemove" および element を用いて キャンセル可能な MouseEvent を作成した 結果とします
  7. mousemove の PointerLock 属性を設定します
  8. mousemove を用いて 必要に応じて pointermove イベントを送信します
  9. mousemoveelementディスパッチします

11.2.18 必要に応じてコンテキストメニューを表示する

警告

この節は改訂する必要があります。

  1. native をネイティブの mousedown またはポインターイベントとします
  2. target を、イベントの EventTarget とします
    1. menuevent を、"contextmenu"、target を用いて PointerEvent を作成した結果とします
    2. native が有効である場合、
      1. native を用いて ネイティブから MouseEvent の属性を設定します
    3. result を、menueventtargetディスパッチした 結果とします
    4. result が true である場合、UA のコンテキストメニューを表示します
注記

キーボードによってトリガーされたコンテキストメニューを処理するには、native = null、target = 現在フォーカスされている要素としてこのアルゴリズムを呼び出します。

11.3 マウスイベントの順序

この仕様で定義されている特定のマウスイベントは、互いに対して定められた順序で発生しなければなりません。 次に、ポインティングデバイスのカーソルが要素上へ移動したときに発生しなければならない イベントシーケンスを示します。

# イベントタイプ 要素 注記
1 mousemove
ポインティングデバイスが要素 A 内へ移動する...
2 mouseover A
3 mouseenter A
4 mousemove A 複数の mousemove イベント
ポインティングデバイスが要素 A の外へ移動する...
5 mouseout A
6 mouseleave A

ポインティングデバイスが要素 A 内へ移動し、次に入れ子になった要素 B 内へ移動してから再び外へ戻る場合、次のイベントシーケンスが発生しなければなりません

イベントタイプ 要素 注記
1 mousemove
ポインティングデバイスが要素 A 内へ移動する...
2 mouseover A
3 mouseenter A
4 mousemove A 複数の mousemove イベント
ポインティングデバイスが入れ子になった要素 B 内へ移動する...
5 mouseout A
6 mouseover B
7 mouseenter B
8 mousemove B 複数の mousemove イベント
ポインティングデバイスが要素 B から A 内へ移動する...
9 mouseout B
10 mouseleave B
11 mouseover A
12 mousemove A 複数の mousemove イベント
ポインティングデバイスが要素 A の外へ移動する...
13 mouseout A
14 mouseleave A

CSS を使用すると、要素が視覚的に重なり合う場合があります。次の例では、A、B、C とラベル付けされた 3 つの要素が、 ウェブページ上でいずれも同じ寸法と絶対位置を持っています。DOM では、要素 C は B の子であり、B は A の子です。

互いに重なり合って積み重なった 3 つの要素の図。最下部の要素には A、最上部の要素には C とラベル付けされています
10 互いに完全に重なり合う 3 つの積み重なった 要素と、その積み重なりの上を移動するポインティングデバイスを示す図。

ポインティングデバイスが要素の積み重なりの外側から C とラベル付けされた要素へ移動し、その後再び 外へ移動した場合、次の一連のイベントが発生しなければなりません

イベントタイプ 要素 注記
1 mousemove
ポインティングデバイスが、積み重なりの最上部にある要素 C 内へ移動する
2 mouseover C
3 mouseenter A
4 mouseenter B
5 mouseenter C
6 mousemove C 複数の mousemove イベント
ポインティングデバイスが要素 C の外へ移動する...
7 mouseout C
8 mouseleave C
9 mouseleave B
10 mouseleave A
注記

mouseover/mouseout イベントは 1 回だけ発火しますが、mouseenter/mouseleave イベントは 3 回 (各要素に 1 回ずつ)発火します。

次は、ポインティングデバイスに関連付けられたボタン(たとえば、 マウスボタンやトラックパッド)が要素上で押されて解放された場合の典型的なイベントシーケンスです。

イベントタイプ 注記
1 mousedown
2 mousemove 任意、複数のイベント、一定の制限あり
3 mouseup
4 click
5 mousemove 任意、複数のイベント、一定の制限あり
6 mousedown
7 mousemove 任意、複数のイベント、一定の制限あり
8 mouseup
9 click
10 dblclick
注記

click または dblclick イベントを引き続き発火しながら、mousedownmouseup イベントの間に許容される遅延時間、程度、距離、および mousemove イベント数は、 実装、デバイス、およびプラットフォームに固有です。この許容範囲は、 手が不安定であるなどの身体障害があるユーザーがポインティングデバイスを操作する際の助けになります。

各実装は適切な ヒステリシス 許容範囲を決定しますが、一般には、関連する mousedown および mouseup イベントのイベントターゲットが同じ要素であり、間に mouseout または mouseleave イベントがない場合、click および dblclick イベントを発火するべきです。 また、関連する mousedownmouseup のイベントターゲットが異なる場合は、 最も近い共通の包含祖先で click および dblclick イベントを発火するべきです

mousedown イベントのターゲットが HTML 文書の body 要素であり、対応する mouseup イベントのターゲットが 文書要素である場合、 click イベントは 最も近い共通の包含祖先である 文書 要素へディスパッチされます。

マウスイベントシーケンス中に ターゲット (たとえばターゲット要素)が DOM から削除された場合、 シーケンスの残りのイベントはその要素で発火してはなりません

mousedown イベントの結果としてターゲット要素が DOM から削除された場合、 その要素について mouseupclick、または dblclick のイベントも、 デフォルトのアクティブ化イベントもディスパッチされません。ただし、mouseup イベントは、 最初のターゲット要素が削除された後にマウスに対して公開される要素上で引き続き ディスパッチされます。同様に、mouseup イベントの ディスパッチ中にターゲット要素が DOM から削除された場合、 click および後続のイベントはディスパッチされません。

11.4 マウスイベントの種類

マウスイベントの種類を以下に示します。要素が入れ子になっている場合、 マウスイベントの種類は常に最も深く入れ子になった要素をターゲットとします。 ターゲット要素の祖先は、バブリングを使用して、その子孫要素内で発生する マウスイベントの通知を取得してもかまいません

11.4.1 auxclick

タイプ auxclick
インターフェイス PointerEvent
バブリング はい
キャンセル可能 はい
合成 はい
コンテキスト
(信頼されたイベント)

ユーザーが非プライマリポインターボタンを押して 解放したとき、またはそのような操作をシミュレートする方法で ポインターをアクティブ化したとき、auxclick イベントタイプは、ポインターによって示された 最上位の イベントターゲットでディスパッチされなければなりません。マウスボタンの作動 方法はポインターデバイスおよび 環境設定に依存します。たとえば、画面上の 位置や、ポインティング デバイスのボタンを押してから解放するまでの遅延に依存してもかまいません

auxclick イベントは、非プライマリポインター ボタンに対してのみ発火するべきです(すなわち、button 値が 0 ではなく、 buttons 値が 1 より大きい場合)。プライマリボタン (標準的なマウスの左ボタンなど)は、 auxclick イベントを発火してはなりません。プライマリボタンに 関連付けられた対応するイベントについては、click を参照してください。

auxclick イベントの前に、同じ要素上で mousedown および mouseup イベントが発生してもかまいません。その他の ノードタイプ(たとえばテキストノード)間の変更は無視します。環境 設定によっては、ポインティングデバイスのボタンを押してから 解放するまでの間に、mouseovermousemove、および mouseout のイベントタイプのうち 1 つ以上が発生した場合でも、 auxclick イベントが ディスパッチされてもかまいません

auxclick イベントタイプの デフォルトアクションは、 イベントの ターゲットおよび button または buttons 属性の値に応じて異なります。 auxclick イベントタイプの典型的な デフォルトアクションは次のとおりです。

9: 中央ボタンの auxclick を 受信して処理する
myLink.addEventListener("auxclick", function(e) {
  if (e.button === 1) {
    // たとえばリンクを中央クリックしたときに新しいタブを開くという
    // デフォルト動作を、これによって防止できる。
    e.preventDefault();
    // リンクまたはリンクではないボタンを新しいタブで開く処理など、
    // アプリに適した方法で中央ボタンのクリックを処理するための
    // 別の処理を行う。タブストリップでタブを閉じるなど、クリック操作時に
    // 行うべきその他の操作もここで実行できる。
  }
});
注記

右ボタンの場合、auxclick イベントは、 あらゆる contextmenu イベントの後に ディスパッチされます。一部のユーザー エージェントは、コンテキストメニューが表示されている間、すべての入力 イベントを破棄するため、そのようなシナリオでは auxclick をアプリケーションで 利用できない場合があることに注意してください。 詳細については、 10を参照してください。

10: 右ボタンの auxclick を受信して処理する
myDiv.addEventListener("contextmenu", function(e) {
  // この呼び出しによってコンテキストメニューが表示されず、
  // ページによるイベント受信を妨げないようにする。
  e.preventDefault();
});
myDiv.addEventListener("auxclick", function(e) {
  if (e.button === 2) {
    // アプリ内でカスタムコンテキストメニューを開くなど、
    // 右ボタンクリックを処理するための別の処理を行う。
  }
});

11.4.2 click

タイプ click
インターフェイス PointerEvent
バブリング はい
キャンセル可能 はい
合成 はい
コンテキスト
(信頼されたイベント)

ユーザーがプライマリポインターボタンを押して 解放したとき、またはそのような操作をシミュレートする方法で ポインターをアクティブ化したとき、click イベントタイプは、ポインターによって示された 最上位の イベントターゲットでディスパッチされなければなりません。マウスボタンの作動 方法はポインターデバイスおよび 環境設定に依存します。たとえば、画面上の 位置や、ポインティング デバイスのボタンを押してから解放するまでの遅延に依存してもかまいません

click イベントは、プライマリポインター ボタンに対してのみ発火するべきです(すなわち、button 値が 0buttons 値が 1 の場合)。 セカンダリボタン (標準的なマウスの中央ボタンや右ボタンなど)は、 click イベントを発火してはなりません。非プライマリボタンに 関連付けられた対応するイベントについては、auxclick を参照してください。

click イベントの前に、同じ要素上で mousedown および mouseup イベントが発生してもかまいません。その他の ノードタイプ(たとえばテキストノード)間の変更は無視します。環境 設定によっては、ポインティングデバイスのボタンを押してから 解放するまでの間に、mouseovermousemove、および mouseout のイベントタイプのうち 1 つ以上が発生した場合でも、 click イベントが ディスパッチされてもかまいません。また、click イベントの後に dblclick イベントが続いてもかまいません

ユーザーが、大きな line-height が指定された <p> 要素の子であるテキストノード上でマウスボタンを押し、 マウスをわずかに移動して、テキストを含む領域上から外れたものの、 その <p> 要素の包含 ブロック内には留まり(すなわち、ポインターは 同じテキストブロックの行間にあるが、テキストノード自体の 上にはない)、その後マウスボタンを離した場合、通常の時間的な ヒステリシスの範囲内であれば、click に対して click イベントが引き続き発生する可能性が高いです。これは、 ユーザーが同じ要素の範囲内に 留まっているためです。ユーザーエージェントによって生成される マウスイベントはテキストノード上ではディスパッチされないことに注意してください。

ポインターデバイスに関連付けられることに加えて、 click イベントタイプは、要素の アクティブ化の一部としてディスパッチされなければなりません

注記

アクセシビリティを最大限に高めるため、コンテンツ作者には、 カスタム コントロールのアクティブ化動作を定義する際、よりデバイス固有である mousedownmouseup などの他のポインティングデバイスイベントタイプではなく、 click イベントタイプを使用することが推奨されます。 click イベントタイプはポインター デバイス(たとえばマウス)に由来しますが、その後の実装上の拡張により この関連付けを超えて拡張されており、要素のアクティブ化のための デバイス非依存のイベントタイプと見なすことができます。

click イベントタイプの デフォルトアクションは、 イベントの ターゲットおよび button または buttons 属性の値に応じて異なります。 click イベントタイプの典型的な デフォルトアクションは次のとおりです。

11.4.3 contextmenu

タイプ contextmenu
インターフェイス PointerEvent
バブリング はい
キャンセル可能 はい
合成 はい
コンテキスト
(信頼されたイベント)

ユーザーエージェントは、 コンテキストメニューを呼び出す前にこのイベントをディスパッチしなければなりません

contextmenu イベントがマウスの右 ボタンによってトリガーされた場合、 contextmenu イベントは、mousedown イベントの後に ディスパッチされなければなりません

注記

プラットフォームによっては、contextmenu イベントが mouseup イベントの前または後に ディスパッチされる場合があります。

11.4.4 dblclick

タイプ dblclick
インターフェイス MouseEvent
バブリング はい
キャンセル可能 はい
合成 はい
コンテキスト
(信頼されたイベント)

ユーザーエージェントは、 ポインティングデバイスのプライマリボタンが要素上で 2 回クリックされたとき、 このイベントをディスパッチしなければなりません。ダブルクリックの 定義は環境 設定に依存します。ただし、mousedownmouseup、および dblclick の間で、イベントターゲットは同じでなければなりません。クリックと ダブルクリックが同時に発生した場合、このイベント タイプはイベントタイプ click の後にディスパッチされなければならず、 それ以外の場合はイベントタイプ mouseup の後にディスパッチされなければなりません

click イベントと同様に、dblclick イベントは、 プライマリポインターボタンに対してのみ発火するべきです。セカンダリボタンは dblclick イベントを発火してはなりません

注記

click イベントをキャンセルしても、 dblclick イベントの発火には影響しません。

click イベントタイプと同様に、dblclick イベントタイプの デフォルトアクションは、 イベントの ターゲットおよび button または buttons 属性の値に応じて異なります。 dblclick イベントタイプの典型的な デフォルトアクションは、 click イベントタイプのものと同じです。

11.4.5 mousedown

タイプ mousedown
インターフェイス MouseEvent
バブリング はい
キャンセル可能 はい
合成 はい
コンテキスト
(信頼されたイベント)

ユーザーエージェントは、 ポインティングデバイスの ボタンが要素上で押されたとき、このイベントをディスパッチしなければなりません

注記

多くの実装は、mousedown イベントを使用して、 コンテキストに依存するさまざまな デフォルトアクションを開始します。これらの デフォルトアクションは、このイベントをキャンセルすると防止できます。そのような デフォルトアクションには、画像またはリンクとのドラッグ&ドロップ インタラクションの開始、テキスト選択の開始などが含まれる場合があります。 さらに、一部の実装では、mousedown イベントが ディスパッチされた時点で中央マウスボタンが押されている場合にアクティブ化される、マウスによるパン 機能を提供します。

11.4.6 mouseenter

タイプ mouseenter
インターフェイス MouseEvent
バブリング いいえ
キャンセル可能 いいえ
合成 いいえ
コンテキスト
(信頼されたイベント)

ユーザーエージェントは、 ポインティングデバイスが要素またはその子孫 要素の境界上へ移動したとき、このイベントをディスパッチしなければなりません。また、ユーザーエージェントは、 要素またはその子孫のいずれかがプライマリ ポインティングデバイスの下へ移動したときにも、このイベントをディスパッチしなければなりません。 このイベントタイプは mouseover と似ていますが、 バブリングしない点、およびポインターデバイスが要素からその子孫要素の 1 つの境界上へ移動したときにディスパッチされてはならない点が 異なります。

注記

このイベントタイプと CSS の :hover 疑似クラス [CSS2] には類似点があります。 mouseleave イベントタイプも参照してください。

11.4.7 mouseleave

タイプ mouseleave
インターフェイス MouseEvent
バブリング いいえ
キャンセル可能 いいえ
合成 いいえ
コンテキスト
(信頼されたイベント)

ユーザーエージェントは、 ポインティングデバイスが要素およびそのすべての 子孫要素の境界から外へ移動したとき、このイベントをディスパッチしなければなりません。また、ユーザー エージェントは、要素またはその子孫のいずれかが プライマリポインティングデバイスの下から外れるように移動したときにも、このイベントを ディスパッチしなければなりません。このイベントタイプは mouseout と似ていますが、 バブリングしない点、およびポインティングデバイスが 要素の境界とそのすべての子の境界から離れるまでディスパッチされてはならない点が異なります。

注記

このイベントタイプと CSS の :hover 疑似クラス [CSS2] には類似点があります。 mouseenter イベントタイプも参照してください。

11.4.8 mousemove

タイプ mousemove
インターフェイス MouseEvent
バブリング はい
キャンセル可能 はい
合成 はい
コンテキスト
(信頼されたイベント)

ユーザーエージェントは、 ポインティングデバイスが要素上にある間に 移動したとき、このイベントをディスパッチしなければなりません。ポインティングデバイスの移動中のイベントの 発生頻度は実装、デバイス、および プラットフォームに固有ですが、ポインターデバイスが継続的に移動している場合、マウス移動の各発生ごとに 単一のイベントを発火するのではなく、複数の連続した mousemove イベントを 発火するべきです。実装には、 応答性とパフォーマンスのバランスを取るための最適な発生頻度を決定することが 推奨されます。

注記

ブラウザーなど一部の実装環境では、 ユーザーがドラッグ操作を開始し (たとえばマウスボタンが押されている)、ポインティング デバイスがユーザーエージェントの境界外へ移動した場合でも、mousemove イベントが発火し続けることがあります。

注記

このイベントは以前、DOM Level 2 Events ではキャンセル不可能と規定されていましたが、ユーザーエージェント間の 既存の相互運用性を反映するために変更されました。

11.4.9 mouseout

タイプ mouseout
インターフェイス MouseEvent
バブリング はい
キャンセル可能 はい
合成 はい
コンテキスト
(信頼されたイベント)

ユーザーエージェントは、 ポインティングデバイスが要素の境界から外へ移動したとき、または要素が プライマリポインティングデバイスの下から外れるように移動したとき、 このイベントをディスパッチしなければなりません。 このイベントタイプは mouseleave と似ていますが、 バブリングする点、およびポインターデバイスが 要素からその子孫要素の 1 つの境界上へ移動したときにディスパッチされなければならない点が異なります。

注記

mouseover イベントタイプも参照してください。

11.4.10 mouseover

タイプ mouseover
インターフェイス MouseEvent
バブリング はい
キャンセル可能 はい
合成 はい
コンテキスト
(信頼されたイベント)

ユーザーエージェントは、 ポインティングデバイスが要素の境界上へ移動したとき、または要素が プライマリポインティングデバイスの下へ移動したとき、 このイベントをディスパッチしなければなりません。 このイベントタイプは mouseenter と似ていますが、 バブリングする点、および祖先要素が同じ イベントリスナーインスタンスの ターゲットである要素の 境界上へポインターデバイスが移動したときにディスパッチされなければならない点が異なります。

注記

mouseout イベントタイプも参照してください。

11.4.11 mouseup

タイプ mouseup
インターフェイス MouseEvent
バブリング はい
キャンセル可能 はい
合成 はい
コンテキスト
(信頼されたイベント)

ユーザーエージェントは、 ポインティングデバイスの ボタンが要素上で解放されたとき、このイベントをディスパッチしなければなりません

注記

ブラウザーなど一部の実装環境では、たとえばユーザーが マウスボタンを押したままドラッグ操作を開始した場合、ポインティングデバイスが ユーザーエージェントの境界外へ移動していても、mouseup イベントがディスパッチされることがあります。

12. ホイールイベントとインターフェイス

ホイールは、1 つ以上の空間次元で回転でき、ポインターデバイスに関連付けることができるデバイスです。 座標系は環境設定によって異なります。

ユーザーの環境は、垂直スクロールを y 軸方向の回転、 水平スクロールを x 軸方向の回転、 ズームを z 軸方向の回転に関連付けるよう設定されている場合があります。

WheelEvent オブジェクトの deltaX、deltaY、および deltaZ 属性は、 それぞれの軸に沿った測定値をピクセル、行、または ページ単位で示します。報告される測定値は、環境固有の アルゴリズムによってホイールデバイスの実際の回転/移動が 適切な値と単位へ変換された後に提供されます。

注記

ユーザーの環境設定は、ホイールデバイスの実際の回転/移動を 異なる方法で解釈するようカスタマイズできます。 一般的なノッチ付きマウスホイールを 1 回動かすと、162 ピクセルの測定値が生成される場合があります (162 は単なる例示値であり、実際の値はユーザーエージェントの現在の画面 寸法に依存する場合があります)。 しかし、ユーザーはデフォルトの環境設定を変更してマウスホイールを高速化し、 この数値を増加させることができます。 さらに、一部のマウスホイールソフトウェアは加速(ホイールをより速く 回転/移動するほど、各測定の デルタが大きくなる)や、サブピクセルの 回転 測定さえサポートする場合があります。 このため、作者は、あるユーザーエージェントでの特定の 回転量が、 すべてのユーザーエージェントで同じ デルタ値を生成すると仮定することはできません。

deltaX、deltaY、および deltaZ 属性の値の符号(正または負)は、 実際のホイールデバイスが同じ方向へ回転/移動している間、 wheel イベントを複数回ディスパッチしても 一貫していなければなりません。 ユーザーエージェントが wheel イベントのデフォルトアクションとして スクロールする場合、デルタの符号は、 正の X、Y、および Z 軸がそれぞれ文書の右端、下端、および最も遠い 奥行き(ユーザーから離れる方向)へ向かう右手座標系によって与えられるべきです

注記

個々のユーザーエージェントは(その環境およびハードウェア設定に応じて)、 ホイール上での同じ物理的なユーザー操作を異なる方法で解釈できます。 たとえば、トラックパッドの端を上から下へ垂直にスワイプする操作は、 ページを下へスクロールする、またはページを上へパンすることを意図した ホイール操作として解釈される場合があります(すなわち、それぞれ正または負の deltaY 値になります)。

ユーザーエージェントは、最初の ホイールイベントが発火されたときに ホイールイベントトランザクションを作成しなければならず、これにより実装固有の一定 時間内の後続するすべてのホイールイベントを同じ要素をターゲットにできます。ホイールイベントトランザクションとは、単一の ユーザージェスチャーに関連付けられた一連のホイールイベントです。 ホイールイベントトランザクションには、そのグループの最初のホイールイベントが 発生した時点の 最上位のイベントターゲットであるイベントターゲットが関連付けられていなければなりません

スクロール可能な要素をターゲットとする一連のホイールイベントが子要素の上方で始まった場合、 同じユーザージェスチャーに対する後続のイベントは、その子要素上で発生する場合があります。

12.1 WheelEvent インターフェイス

WheelEvent インターフェイスは、wheel イベントに関連付けられた固有の コンテキスト情報を提供します。

WheelEvent インターフェイスのインスタンスを作成するには、 任意の WheelEventInit 辞書を渡して、WheelEvent コンストラクターを使用します。

WebIDLdictionary WheelEventInit : MouseEventInit {
    double deltaX = 0.0;
    double deltaY = 0.0;
    double deltaZ = 0.0;
    unsigned long deltaMode = 0;
    boolean momentum = false;
};

[Exposed=Window]
interface WheelEvent : MouseEvent {
    constructor(DOMString type, optional WheelEventInit eventInitDict = {});
    // DeltaModeCode
    const unsigned long DOM_DELTA_PIXEL = 0x00;
    const unsigned long DOM_DELTA_LINE	= 0x01;
    const unsigned long DOM_DELTA_PAGE	= 0x02;

    readonly attribute double deltaX;
    readonly attribute double deltaY;
    readonly attribute double deltaZ;
    readonly attribute unsigned long deltaMode;
    readonly attribute boolean momentum;
};
DOM_DELTA_PIXEL
デルタの測定単位はピクセルでなければなりません。 これは、ほとんどのオペレーティングシステムおよび 実装設定で最も一般的なケースです。
DOM_DELTA_LINE
デルタの測定単位は個々の テキスト行でなければなりません。これは多くのフォームコントロールで使用されます。
DOM_DELTA_PAGE
デルタの測定単位はページでなければならず、 1 画面または区切られたページとして定義されます。
deltaX
wheel イベントのデフォルトアクションがスクロールであるユーザーエージェントでは、イベントが キャンセルされなかった場合にスクロールする x 軸方向の 測定値(ピクセル、行、またはページ単位)でなければなりません。 それ以外の場合、これはホイールデバイスの x 軸周りの移動に対する 実装固有の測定値(ピクセル、行、またはページ単位) です。 この属性の 未初期化値0.0なければなりません
deltaY
wheel イベントのデフォルトアクションがスクロールであるユーザーエージェントでは、イベントが キャンセルされなかった場合にスクロールする y 軸方向の 測定値(ピクセル、行、またはページ単位)でなければなりません。 それ以外の場合、これはホイールデバイスの y 軸周りの移動に対する 実装固有の測定値(ピクセル、行、またはページ単位) です。 この属性の 未初期化値0.0なければなりません
deltaZ

wheel イベントのデフォルトアクションがスクロールであるユーザーエージェントでは、イベントが キャンセルされなかった場合にスクロールする z 軸方向の 測定値(ピクセル、行、またはページ単位)でなければなりません。 それ以外の場合、これはホイールデバイスの z 軸周りの移動に対する 実装固有の測定値(ピクセル、行、またはページ単位) です。

この属性の 未初期化値0.0なければなりません

deltaZ 属性を WheelEvent オブジェクト上で初期化します。この属性(および deltaX および deltaY 属性)の相対的な正の値は、 X、Y、および Z 軸がそれぞれ文書の右端、下端、 および最も遠い奥行き(ユーザーから離れる方向)へ向かう 右手座標系によって与えられます。 負の相対値は、それぞれ反対方向を表します。

deltaMode

deltaMode 属性は、 デルタ値の測定単位を示します。 デフォルト値は DOM_DELTA_PIXEL(ピクセル)です。

この属性は、デルタ値の測定単位を示すため、 DOM_DELTA 定数のいずれかに設定されなければなりません。 正確な測定値は、デバイス、オペレーティングシステム、 およびアプリケーションの設定に固有です。

この属性の 未初期化値0なければなりません

momentum

ユーザーが物理的なスクロール操作を終了した後 (たとえばフリング後にトラックパッドから指を離した後)にスクロール慣性を シミュレートするため、プラットフォームによってこのイベントが合成された場合、 この属性は true でなければならず、それ以外の場合は false でなければなりません。

この属性の 未初期化値falseなければなりません

12.2 ホイールイベントの種類

12.3 wheel

タイプ wheel
インターフェイス WheelEvent
バブリング はい
キャンセル可能 場合による
合成 はい
コンテキスト
(信頼されたイベント)

ユーザーエージェントは、 マウスホイールがいずれかの軸を中心に 回転した場合、または同等の入力デバイス (マウスボール、特定のタブレットやタッチパッドなど)が そのような操作をエミュレートした場合、このイベントをディスパッチしなければなりません。 プラットフォームおよび入力デバイスによっては、斜め方向のホイール デルタは、非ゼロの軸を複数持つ単一の wheel イベントとして、または各非ゼロ軸について個別の wheel イベントとして配信されてもかまいません

wheel イベントタイプの典型的な デフォルト アクションは、 示された量だけ文書をスクロール(または場合によってはズーム)することです。 このイベントがキャンセルされた場合、実装は文書をスクロールまたはズームしてはなりません(または、このイベント タイプに関連付けられたその他の実装固有のデフォルトアクションを 実行してはなりません)。

注記

一部の ユーザーエージェント、または 一部の入力デバイスでは、ホイールを回した 速度が デルタ値に影響し、 より速い速度ではより大きい デルタ値が生成される場合があります。

12.3.1 ホイールイベントのキャンセル可能性

ホイールイベントで preventDefault を呼び出すと、 スクロールを防止または中断できます。スクロール性能を最大限に高めるため、 ユーザーエージェントは、スクロールに関連付けられた各ホイールイベントが キャンセルされるかどうかを確認するため、その処理を待たない場合があります。そのような場合、ユーザー エージェントは cancelable プロパティが falsewheel イベントを生成するべきであり、これは preventDefault を使用してスクロールを防止または中断 できないことを示します。それ以外の場合、cancelabletrue になります。

特に、ユーザーエージェントは、イベントについて 非 passive リスナーが 存在しないことを監視した場合、キャンセル不可能な wheel イベントのみを生成するべきです。

13.

この節は非規範的です。

以下は、この仕様の一部の API を作者がどのように使用できるかを示す基本的な例です。 さらに具体的な例は、この文書の関連する節で提供されています。

11: 機能 検出とイベントのバインド
/* Pointer Events または従来のタッチ/マウスのいずれかにバインドする */

if (window.PointerEvent) {
    // Pointer Events がサポートされている場合、ポインターイベントのみを監視する
    target.addEventListener("pointerdown", function(e) {
        // 必要に応じて、e.pointerType に基づいて個別のロジックを適用し
        // タッチ/ペン/マウスごとに異なる動作を行う
        ...
    });
    ...
} else {
    // 従来のタッチ/マウスイベントハンドラー
    target.addEventListener('touchstart', function(e) {
        // 互換マウスイベントと click を防止する
        e.preventDefault();
        ...
    });
    ...
    target.addEventListener('mousedown', ...);
    ...
}

// キーボード処理用の追加イベントリスナー
...
12: ユーザーからの 入力タイプを検出する
window.addEventListener("pointerdown", detectInputType);

function detectInputType(event) {
    switch(event.pointerType) {
        case "mouse":
            /* マウス入力を検出 */
            break;
        case "pen":
            /* ペン/スタイラス入力を検出 */
            break;
        case "touch":
            /* タッチ入力を検出 */
            break;
        default:
            /* pointerType が空(検出できなかった)
            または UA 固有のカスタムタイプ */
    }
}
13: 接触形状に合わせて 要素のサイズを変更する
<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>
14: スクリプトから 信頼されていないポインターイベントを発火する
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);
15: PointerDown で ペンの色を割り当てる
<div style="position:absolute; top:0px; left:0px; width:100px;height:100px;"></div>
<script>
window.addEventListener("pointerdown", assignPenColor);
window.addEventListener("pointermove", assignPenColor);
const colorMap = new Map();

function assignPenColor(event) {
    const uniqueId = event.persistentDeviceId;
    // 一意の ID が存在するか確認する。
    if (uniqueId == 0) {
        return;
    }
    // デバイスに色が割り当てられているか確認する。
    if (map.has(uniqueId)) {
        return;
    }
    // デバイスに色を割り当てる。
    let newColor = getNewColor();
    map.set(uniqueId, newColor);
    return newColor;
}

function getNewColor() {
    /* 何らかの色の値を返す */
}
</script>

14. セキュリティとプライバシーに関する 考慮事項

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

この仕様で定義されるイベントタイプの多くは、ユーザー操作に応答してディスパッチされます。これにより、 悪意のあるイベントリスナーが、ユーザーが通常機密と考える情報、たとえば、 ページを操作している間のユーザーのマウス/スタイラス/指の正確な経路/動きにアクセスできるようになります。

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

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

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

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

これらの考慮事項に加えて、ワーキンググループは、この仕様について次のように考えています。

15. 用語集

この節は非規範的です。

アクティブボタン状態
ポインターの buttons プロパティがゼロ以外の値を持つ状態です。マウスの場合、これは デバイス上で少なくとも 1 つのボタンが押されている状態です。タッチの場合、デジタイザーと物理的に接触 している状態です。ペンの場合、ペンがデジタイザーと物理的に接触しているか、 ホバー中に少なくとも 1 つのボタンが押されている状態です。
アクティブ文書
アクティブなポインターについて、そのポインターから最後のイベントを受信した 文書です。
アクティブなポインター
イベントを生成できるあらゆるタッチ接触、ペン/スタイラス、マウスカーソル、またはその他のポインターです。 特定のポインター(一意の pointerId で識別)が 文書内で追加のイベントを生成する可能性がある場合、そのポインターは引き続きアクティブと見なされます。例:
  • デバイスに接続されたマウスは常にアクティブです。
  • 画面上のタッチ接触はアクティブと見なされます。
  • タッチ接触またはペン/スタイラスがデジタイザーの範囲外まで離れた場合、それは もはやアクティブとは見なされません。
注記
一部のプラットフォームでは、アクティブなポインターの集合には、ユーザーエージェントを ターゲットとしていないもの(たとえば他のアプリケーションをターゲットとするもの)を含め、 デバイスへのすべてのポインター入力が含まれます。
接触形状
デジタイザー上の入力(最も一般的にはタッチ)の境界ボックスです。通常、これは 1 ピクセルより粗いポインター入力解像度を持つデバイスを指します。一部のデバイスはこのデータをまったく報告しません。
デルタ
WheelEvent インターフェイスをサポートする入力デバイス (マウスホイールやタッチパッドなど)の物理的な移動に応答して、ユーザーエージェントが ページをスクロールまたはズームする推定量(ピクセル、行、またはページ単位)です。デルタの値(たとえば deltaXdeltaY、または deltaZ 属性)は、現在の deltaMode プロパティのコンテキストで解釈されます。 ホイール(またはその他のデバイス)の物理的な移動と、デルタが正か負かの関係は、 環境とデバイスに依存します。ただし、ユーザーエージェントが デフォルトアクションとしてスクロールする場合、デルタの符号は、 正の X、Y、および Z 軸が、それぞれ 文書の右端、下端、 および最も遠い奥行き(ユーザーから離れる方向)へ向かう右手座標系によって 与えられます。
デジタイザー
表面が、接触している、かつ/または近接している入力を検出できる種類の入力検知デバイスです。 最も一般的には、タッチ接触またはペン/スタイラスからの入力を検知する表面です。
直接操作
一部のユーザーエージェント(タッチスクリーンデバイス上のブラウザーなど)は、「直接操作」 というメタファーを実装しており、ポインターはコントロールと対話するだけでなく、 現在のページを直接パンまたはズームするためにも使用され、直接物理的に 接触しているかのような錯覚を提供します。たとえば、タッチスクリーンデバイス上のユーザーは一般に、 指またはスタイラスを使用してページを「つかみ」、ポインターを移動してパンすることで、 ページを直接操作できます。これは通常の デスクトップ/ノートパソコン上のマウスポインターとは対照的で、そこではページを「ドラッグ」するのではなく、スクロールバーを使用してパンします。
注記
場合によっては、タッチパッド(ノートパソコンに搭載されているものなど)上を「ドラッグ」して スクロールできることがあります。ただし、これは一般に タッチパッドが「偽の」マウスホイールイベントを生成することで実現されるため、直接 操作には該当しません。
ヒステリシス
ユーザーエクスペリエンスを向上させるため、位置または時間の一定範囲内の入力値を 受け入れるヒューマンインターフェイス設計の機能です。たとえば、ユーザーがマウスボタンを ダブルクリックするのにかかる時間の小さなずれを許容することは時間的ヒステリシスであり、子メニューへ移動する際に ユーザーが親ウィンドウからマウスを外した場合でも入れ子になったメニューをすぐに閉じないことは位置的 ヒステリシスです。
測定可能なプロパティ

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

これに対して、pointerIdpointerTypeisPrimary、および マウスイベントモデルのプロパティ buttonbuttonsctrlKeyshiftKeyaltKey、および metaKey は測定可能な プロパティとは見なされません。 これらはセンサーデータに関係しないためです。

ポインター
マウス、ペン、タッチ接触など、画面上の特定の座標(または座標の集合)をターゲットにできる 入力デバイスのハードウェアに依存しない表現です。
回転
WheelEvent インターフェイスを使用する入力デバイス上の増分変化を示します。一部のデバイスでは これは文字どおりホイールの回転であってもかまいませんが、他のデバイスでは、 平面上の移動、または特定のボタンへの圧力であってもかまいません
最上位のイベントターゲット
最上位のイベントターゲットは、 レンダリング順序で最も上位にあり、ターゲットになれる要素でなければなりません。グラフィカルユーザーインターフェイスでは、これは ユーザーのポインティングデバイスの下にある要素です。ユーザーインターフェイスのヒットテスト機能を使用して ターゲットを決定します。ヒットテストおよび積層順序に関する具体的な詳細については、ホスト言語を参照してください。

16. レガシーイベント初期化子

この節は規範的です。 以下の機能は廃止されており、レガシーソフトウェアとの互換性を必要とする ユーザーエージェントのみが実装するべきです。 [UIEvents] の レガシーイベント初期化子も参照してください。

16.1 MouseEvent インターフェイスの 初期化子

WebIDLpartial interface MouseEvent {
	// この仕様では非推奨
	undefined initMouseEvent(DOMString typeArg,
		optional boolean bubblesArg = false,
		optional boolean cancelableArg = false,
		optional Window? viewArg = null,
		optional long detailArg = 0,
		optional long screenXArg = 0,
		optional long screenYArg = 0,
		optional long clientXArg = 0,
		optional long clientYArg = 0,
		optional boolean ctrlKeyArg = false,
		optional boolean altKeyArg = false,
		optional boolean shiftKeyArg = false,
		optional boolean metaKeyArg = false,
		optional short buttonArg = 0,
		optional EventTarget? relatedTargetArg = null);
};
initMouseEvent(typeArg)
MouseEvent オブジェクトの属性を初期化します。この メソッドは UIEvent.initUIEvent() と同じ動作をします。
警告

initMouseEvent メソッドは非推奨ですが、 広く普及した実装との後方互換性のために サポートされています。

DOMString typeArg
この引数の説明については、initEvent() メソッドを参照してください。
boolean bubblesArg
この引数の説明については、initEvent() メソッドを参照してください。
boolean cancelableArg
この引数の説明については、initEvent() メソッドを参照してください。
Window? viewArg
view を指定します。この 値は null でもかまいません
long detailArg
detail を指定します。
long screenXArg
screenX を指定します。
long screenYArg
screenY を指定します。
long clientXArg
clientX を指定します。
long clientYArg
clientY を指定します。
boolean ctrlKeyArg
ctrlKey を指定します。
boolean altKeyArg
altKey を指定します。
boolean shiftKeyArg
shiftKey を指定します。
boolean metaKeyArg
metaKey を指定します。
short buttonArg
button を指定します。
EventTarget? relatedTargetArg
relatedTarget を指定します。この値は null でもかまいません

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.

過去にマウスイベントおよびホイールイベントを担当した方々にも感謝します。 Gary Kacmarcik, Travis Leithead、および長年にわたる さまざまな 貢献者

特に、このモデルの初版を開拓するのに尽力した次の方々に感謝します: Charu Chandiram, Peter Freiling, Nathan Furtwangler, Thomas Olsen, Matt Rakow, Ramu Ramanathan, Justin Rogers, Jacob Rossi, Reed Townsend and Steve Wright.

B. 改訂履歴

この節は非規範的です。

以下は、[PointerEvents3] 仕様を基準とした、 この仕様の公開版間における実質的かつ主要な編集上の変更の非規範的な要約です。 この仕様の編集者草案の 完全な 改訂履歴を参照してください。

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;
    long        persistentDeviceId = 0;
    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;
    readonly        attribute long        persistentDeviceId;
    [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;
};

dictionary MouseEventInit : EventModifierInit {
	long screenX = 0;
	long screenY = 0;
	long clientX = 0;
	long clientY = 0;

	short button = 0;
	unsigned short buttons = 0;
	EventTarget? relatedTarget = null;
};

[Exposed=Window]
interface MouseEvent : UIEvent {
	constructor(DOMString type, optional MouseEventInit eventInitDict = {});
	readonly attribute long screenX;
	readonly attribute long screenY;
	readonly attribute long clientX;
	readonly attribute long clientY;
	readonly attribute long layerX;
	readonly attribute long layerY;

	readonly attribute boolean ctrlKey;
	readonly attribute boolean shiftKey;
	readonly attribute boolean altKey;
	readonly attribute boolean metaKey;

	readonly attribute short button;
	readonly attribute unsigned short buttons;

	readonly attribute EventTarget? relatedTarget;

	boolean getModifierState(DOMString keyArg);
};

dictionary WheelEventInit : MouseEventInit {
    double deltaX = 0.0;
    double deltaY = 0.0;
    double deltaZ = 0.0;
    unsigned long deltaMode = 0;
    boolean momentum = false;
};

[Exposed=Window]
interface WheelEvent : MouseEvent {
    constructor(DOMString type, optional WheelEventInit eventInitDict = {});
    // DeltaModeCode
    const unsigned long DOM_DELTA_PIXEL = 0x00;
    const unsigned long DOM_DELTA_LINE	= 0x01;
    const unsigned long DOM_DELTA_PAGE	= 0x02;

    readonly attribute double deltaX;
    readonly attribute double deltaY;
    readonly attribute double deltaZ;
    readonly attribute unsigned long deltaMode;
    readonly attribute boolean momentum;
};

partial interface MouseEvent {
	// Deprecated in this specification
	undefined initMouseEvent(DOMString typeArg,
		optional boolean bubblesArg = false,
		optional boolean cancelableArg = false,
		optional Window? viewArg = null,
		optional long detailArg = 0,
		optional long screenXArg = 0,
		optional long screenYArg = 0,
		optional long clientXArg = 0,
		optional long clientYArg = 0,
		optional boolean ctrlKeyArg = false,
		optional boolean altKeyArg = false,
		optional boolean shiftKeyArg = false,
		optional boolean metaKeyArg = false,
		optional short buttonArg = 0,
		optional EventTarget? relatedTargetArg = null);
};

D. 参考文献

D.1 規範参考文献

[CSS-OVERFLOW-3]
CSS オーバーフローモジュール レベル 3. Elika Etemad; Florian Rivoal. W3C. 2025年10月7日. W3C 作業草案. URL: https://www.w3.org/TR/css-overflow-3/
[css-position]
CSS 位置指定レイアウトモジュール レベル 3. Elika Etemad; Tab Atkins Jr. W3C. 2025年10月7日. W3C 作業草案. URL: https://www.w3.org/TR/css-position-3/
[CSS21]
カスケーディングスタイルシート レベル 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/
[HTML401]
HTML 4.01 仕様. Dave Raggett; Arnaud Le Hors; Ian Jacobs. W3C. 2018年3月27日. W3C 勧告. URL: https://www.w3.org/TR/html401/
[infra]
Infra 標準. Anne van Kesteren; Domenic Denicola. WHATWG. 現行標準. URL: https://infra.spec.whatwg.org/
[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]
タッチイベント. Doug Schepers; Sangwhan Moon; Matt Brubeck; Arthur Barstow. W3C. 2013年10月10日. W3C 勧告. URL: https://www.w3.org/TR/touch-events/
[UIEvents]
UI イベント. Xiaoqian Wu. W3C. 2026年2月21日. W3C 作業草案. URL: https://www.w3.org/TR/uievents/
[UIEvents-Key]
UI Events KeyboardEvent の key 値. Travis Leithead; Gary Kacmarcik. W3C. 2025年4月22日. W3C 勧告. URL: https://www.w3.org/TR/uievents-key/
[WEBDRIVER-BIDI]
WebDriver BiDi. James Graham; Alex Rudenko; Maksim Sadym. W3C. 2026年8月18日. W3C 作業草案. URL: https://www.w3.org/TR/webdriver-bidi/
[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]
ポインターイベント. Patrick Lauke; Robert Flack. W3C. 2026年7月1日. W3C 作業草案. URL: https://www.w3.org/TR/pointerevents4/
[PointerEvents3]
ポインターイベント. Patrick Lauke; Robert Flack. W3C. 2026年6月30日. W3C 勧告. URL: https://www.w3.org/TR/pointerevents3/
[WCAG22]
ウェブコンテンツ・アクセシビリティ・ガイドライン (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/