ポインターイベント

レベル 4

W3C 作業草案

この文書の詳細情報
このバージョン:
https://www.w3.org/TR/2026/WD-pointerevents4-20261008/
最新の公開バージョン:
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 つの重要な目標は、マルチスレッドのユーザーエージェントが、スクリプトの実行を 待ってブロックすることなく、パンやズーム(たとえば、タッチスクリーン上の指やスタイラスによる)のための 直接操作 アクションを処理できるようにすることです。

注記

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

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

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

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

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

注記

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

2. 適合性

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

この文書におけるキーワード MAY、MUST、MUST NOT、OPTIONAL、および 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

イベントを発生させたポインターの一意の識別子です。ユーザーエージェントは、プライマリマウスポインター用として汎用的な pointerId 値 0 または 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] の範囲で正規化されたポインター入力の圧力です。ここで 0 と 1 は、それぞれハードウェアが 検出可能な最小圧力と最大圧力を表します。圧力をサポートしないハードウェアやプラットフォームでは、 アクティブボタン状態にあるとき値は 0.5 でなければならず、それ以外では 0 でなければなりません。

tangentialPressure

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

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

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

tiltX の説明図
図 2 正の tiltX。
tiltY

X-Z 平面と、 トランスデューサー(たとえばペン/スタイラス)の軸および X 軸の両方を含む平面との間の平面角 (度単位、[-90,90] の範囲)です。正の tiltY はユーザーの方向、すなわち Y 値が増加する方向です。 tiltY は tiltX と併用して、デジタイザーに対する トランスデューサーの法線からの傾きを表すことができます。傾きまたは角度を報告しない ハードウェアやプラットフォームでは、値は 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 が利用可能であるとは限りません。 たとえば、pointerdown が persistentDeviceId を持つのに間に合うように、デバイスがハードウェア ID を デジタイザーへ報告しない場合があります。この場合、persistentDeviceId は 最初は 0 で、その後有効な値に変化することがあります。
getCoalescedEvents()

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

getPredictedEvents()

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

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

PointerEvent の イベント 構築手順では、 PointerEventInit の coalescedEvents を 統合イベントリストへ複製し、 PointerEventInit の predictedEvents を 予測イベントリストへ複製します。

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

3.1.1 ボタンの状態

3.1.1.1 複数ボタンの 同時操作

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

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

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

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

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

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

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

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

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

イベントが pointerdown、pointermove、または 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 に設定することを推奨します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3.1.5 tiltX / tiltY と altitudeAngle / azimuthAngle の間の変換

ポインターイベントには、X-Y 平面に対する トランスデューサーの向きを表すための、相互補完的な 2 組の属性が含まれています。tiltX / tiltY (元の Pointer Events 仕様で導入)と、azimuthAngle / altitudeAngle (Touch 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 を初期化する

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

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

3.2.2 PointerEvent を作成する

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

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

3.2.3 MouseEvent から PointerEvent を作成する

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

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

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

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

3.3.1 pointerover

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

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

3.3.2 pointerenter

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

ユーザーエージェントは 必ず ポインターイベントを発火する。その名前は pointerenter であり、次のいずれかが発生した場合に行う:

  • 手順 ターゲットを決定するが、ポインターについて次のことを検出した場合: ポインターが要素またはその子孫のいずれかの内部に移動した。
  • レイアウト変更によって、ヒットテストの境界(要素またはその子孫のいずれかのもの)が 静止しているポインティングデバイスのキャプチャされていないポインターの下に移動した場合。
  • ユーザーエージェントが次を発火する前:pointerdown イベント(対象デバイスは ホバーをサポートしない)(参照:pointerdown)。
注記
このイベント型は次と似ている:pointerover。ただし、次の2つの違いがある:pointerenter はバブリングせず、その ディスパッチで考慮されるのは、ヒットテストの境界であり、子孫要素のものも含まれる。
注記
次のものの間には類似点がある:このイベント型、mouseenter イベント、 および CSS の :hover 擬似クラス(記述箇所:[CSS21])。 併せて参照:pointerleave イベント。

3.3.3 pointerdown

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

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

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

入力 デバイスがサポートしないものが ホバーである場合、ユーザー エージェントは 必ず 次も行う:発火するポインター イベントの名前を pointerover とし、続いて ポインターイベントを発火する。その名前は pointerenter とする。これらは次より前に行う: ディスパッチ、pointerdown イベントの。

注記
作成者は、特定の次のイベントの発火を防止できる:互換性マウスイベント。これは次をキャンセルすることで行う: pointerdown イベント(ただし、 isPrimary プロパティが true の場合)。これにより、次が設定される: PREVENT MOUSE EVENT フラグがポインターに。ただし、これによって次が防止されるわけではないことに注意する: mouseover、mouseenter、mouseout、または 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 を参照してください。

pointerrawupdate と pointermove の順序について、 ユーザーエージェントがプラットフォームから、pointerrawupdate と pointermove の両方のイベントを発生させる更新を受信した場合、 ユーザーエージェントは、対応する 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つも押されていない状態へ。

入力 デバイスがサポートしないものが ホバーである場合、ユーザー エージェントは 必ず 次も行う:発火するポインター イベントの名前を pointerout とし、続いて ポインターイベントを発火する。その名前は pointerleave とする。これらは次の後に行う: ディスパッチ、pointerup イベントの。

すべての pointerup イベントは pressure の 値が 0 である。

ユーザーエージェントは 必ず また、暗黙的に解放する、ポインター キャプチャを(ポインターが現在キャプチャされている場合)。

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

3.3.7 pointercancel

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

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

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

3.3.8 pointerout

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

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

3.3.9 pointerleave

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

ユーザーエージェントは 必ず ポインターイベントを発火する。その名前は pointerleave であり、次のいずれかが発生した場合に行う:

注記
このイベント型は次と似ている:pointerout。ただし、次の2つの違いがある:pointerleave はバブリングせず、その ディスパッチで考慮されるのは、ヒットテストの境界であり、子孫要素のものも含まれる。
注記
次のものの間には類似点がある:このイベント型、mouseleave イベント、および CSS の :hover 擬似クラス(記述箇所:[CSS21])。 併せて参照:pointerenter イベント。

3.3.10 gotpointercapture

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

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

3.3.11 lostpointercapture

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

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

3.3.12 click、auxclick、および contextmenu

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

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

3.3.12.1 イベント属性

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

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

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

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

click、auxclick、または contextmenu イベントは 必ず 標準のディスパッチ処理に従う。ただし、イベントターゲットは 以下のアルゴリズムを用いて上書きされる:

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

    注記

    イベント userEvent は PointerEvent でない場合もある。例えば、 それが KeyboardEvent となるのは、click イベントのディスパッチが チェックボックス要素上でスペースバーを押すことによって引き起こされた場合である。

    userEvent が PointerEvent の場合、userEvent は 次のイベントである:pointerup (click または auxclick イベントの場合)。また、pointerdown または pointerup イベント(ネイティブプラットフォームの慣例による)となるのは、contextmenu イベントの場合である。

  2. userEvent が PointerEvent でない場合は、event をディスパッチする。 event のターゲットは上書きせず、以下の残りの手順をスキップする。
  3. 次のように target を定義する:

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

    それ以外の場合(event が click または auxclick イベントであり、 userEvent が pointerup イベントで、そのディスパッチ時に キャプチャされていなかった場合)、target を最も近い共通の広義の祖先とする。その対象は 対応する pointerdown と pointerup の DOM 内のターゲットであり、 時点は event がディスパッチされる瞬間とする。

  4. event を target にディスパッチする。

    注記
    userEvent がキャプチャされていた場合、event のディスパッチ先は userEvent のキャプチャターゲットである。たとえ、lostpointercapture イベントが 同じ pointerId を持ち、 すでにディスパッチされていても同様である。

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 を返します。

注記
このメソッドは、次の呼び出しの直後に true を返す:setPointerCapture()。たとえ、 その要素がまだ受け取っていなくても、gotpointercapture イベントを。その 結果、次を検出するのに役立つことがある:暗黙的なポインターキャプチャを、次の内部から: 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 は、埋め込まれた閲覧コンテキストにまで適用/カスケードされることはない。 例えば、touch-action を <iframe> に適用しても、 その内部でのパンやズームのための直接操作インタラクションの動作には一切影響しない、 <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> は 非置換インライン 要素であるが、作成者は CSS の display プロパティを次のような値に設定できる: block。これは width と height をサポートする。将来の仕様では、 この API がすべての要素に拡張される可能性がある。
注記

方向を指定するパンの値は、一部のオーバースクロール動作のカスタマイズに役立つ。 例えば、単純なプル操作による更新効果を実装するには、ドキュメントの touch-action を pan-x pan-down に設定できるのは、スクロール位置が 0 のときであり、それ以外では pan-x pan-y に設定できる。 これにより、ポインターイベントハンドラーで上向きのパン/スクロールの動作を定義できる。その操作が ドキュメントの先頭から始まる場合である。

方向を指定するパンの値は、次のような実装を持つコンポーネントを構成するためにも使用できる: ネイティブにスクロールする要素の内部で、ポインターイベント処理によるカスタムパンを行うもの(または その逆)。 例えば、画像カルーセルは pan-y を使用することで、ポインターイベントを確実に受信できる、 あらゆる水平方向のパン操作について、ドキュメントの垂直方向のパンを妨げることなく。 カルーセルが右端に達したとき、その touch-action を変更することもできる。変更先は pan-y pan-right とし、その後の範囲外へのスクロール操作でスクロールできる対象は、 可能であれば、ビューポート内のドキュメントとなる。 パン/スクロール操作の動作を変更することはできない、その操作が進行している 最中には。

注記
パンやズームに関する一部の既定の直接操作動作を無効にすると、次が可能になることがある: ユーザーエージェントが他の動作により速く応答すること。例えば、auto の場合、ユーザー エージェントは通常、300msの遅延を click の前に加える。これはダブルタップジェスチャーを 処理できるようにするためである。このような場合、明示的に 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回目の呼び出しが最初の呼び出しを上書きし、 そうでなければ、最初の呼び出しが有効なままとなる。これは、次を解放しようとして失敗した場合にも当てはまる:暗黙的なポインターキャプチャを、次の pointerdown リスナーで。

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

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

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

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

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

注記
これは、次からの互換性を損なう変更である:[PointerEvents]。ただし、 既存のコンテンツの大部分には影響しない。一般的なプラットフォームの UX の慣習と一致することに加え、この暗黙的なキャプチャの設計により、ユーザーエージェントはパフォーマンスを最適化できる。 これにより、タッチ移動イベントでヒットテストを呼び出す必要がなくなり、開発者による明示的な オプトインも不要になる(既存の主要なネイティブ API およびウェブ API のパフォーマンス特性と一致する、 タッチ入力用の API について)。
注記
さらに、ユーザーエージェントは、すべての入力 デバイスに対して、範囲入力コントロールなどの特定の UI ウィジェット上で暗黙的なポインターキャプチャの動作を実装してもよい(指の動きが多少はみ出すことを許容する、 操作中にフォームコントロール自体の外側へ)。

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

次を発火した直後に:pointerup または pointercancel イベント、 ユーザーエージェント は 必ず次をクリアしなければならない:保留中のポインターキャプチャ対象 オーバーライド のうち、次の識別子に対するものを:pointerId(次のイベントのもの:pointerup または pointercancel イベント、直前にディスパッチされたもの)、 その後、保留中のポインターキャプチャを処理する手順を実行して、 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) の座標変更 pointerrawupdate(pointerId=2)、1 つの 統合イベント付き
ポインター(pointerId=1) の座標変更 pointerrawupdate(pointerId=1)、1 つの 統合イベント付き
ポインター(pointerId=2) の座標変更 pointerrawupdate(pointerId=2)、1 つの 統合イベント付き
ポインター(pointerId=2) の座標変更 pointerrawupdate(pointerId=2)、1 つの 統合イベント付き
ポインター(pointerId=1) の座標変更 pointerrawupdate(pointerId=1)、1 つの 統合イベント付き
ポインター(pointerId=2) の座標変更 pointerrawupdate(pointerId=2)、1 つの 統合イベント付き
ポインター(pointerId=1)のボタン 押下 pointermove (pointerId=1)、2 つの 統合イベント付き
pointermove (pointerId=2)、4 つの 統合イベント付き
pointerdown (pointerId=1)、統合イベント なし
ポインター(pointerId=2) の座標変更 pointerrawupdate(pointerId=2)、1 つの 統合イベント付き
ポインター(pointerId=2) の座標変更 pointerrawupdate(pointerId=2)、1 つの 統合イベント付き
ポインター(pointerId=1)のボタン 解放 pointermove (pointerId=2)、2 つの 統合イベント付き
pointerup(pointerId=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、 pointerType、 isPrimary および isTrusted を、 「親」ポインターイベントの対応するプロパティと一致するように設定します。
  2. イベントの cancelable および bubbles を false に設定します (これらのイベントが単独で ディスパッチされることはないため)。
  3. イベントの 統合イベントリストおよび 予測イベントリストを空のリストに設定します。
  4. その他すべての属性を、デフォルトの PointerEvent 値に初期化します。

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

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

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

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

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

注記

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

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

互換性マウスイベントのサポートに関係なく、ユーザーエージェントは必ず 常に click、auxclick、contextmenu イベントをサポートしなければならない。なぜなら、 これらのイベントは PointerEvent 型であり、したがって次には該当しないためである:互換性マウスイベント。次の呼び出し: preventDefault をポインターイベント中に行うことは、決して次に影響を及ぼしてはならない: click、auxclick、contextmenu が発火されるかどうか。

注記

これらの高水準イベントの一部の相対的な順序について(たとえば contextmenu、focus、blur)、ポインター イベントとの順序関係は未定義であり、ユーザーエージェントごとに異なる。たとえば、一部のユーザーエージェントでは、 contextmenu は、多くの場合、次に続く:pointerup。一方、他のユーザーエージェントでは、多くの場合、次に先行する: pointerup または pointercancel。また、状況によっては、 対応するポインターイベントがまったくないまま発火される場合もある(たとえば、キーボード 操作の結果として)。

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

特に断りがない限り、マッピングされたマウスイベントの対象は、原則として同じであるべきである、 対応するポインターイベントの対象と。ただし、その対象がすでに次に属していない場合は除く: ownerDocument のツリー。この場合、マウスイベントは、元の対象に関する次のノードで発火されるべきである: 引き続き次に属している、最も近い祖先ノード(ツリーから削除された時点でのもの): ownerDocument のツリー。これは、新しいイベント経路(新しい対象ノードに基づくもの)が構築されることを意味する、 マウスイベントのために。

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

マウスイベントを抑止できるのは、ポインターが押下状態にあるときだけである。ホバー中のポインター(たとえば、どのボタンも 押されていないマウス)のマウスイベントは抑止できない。

mouseover、mouseout、mouseenter、mouseleave イベントは決して抑止されない(ポインターが押下状態にあっても)。

互換性マウスイベントは抑止できない、ポインターイベントの EventListener が次に設定されている場合: passive [DOM]。

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

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

pointerdown、pointerup、または pointermove イベントを発火する直前、または pointerleave イベントを window で発火する直前に、 ユーザーエージェントは原則として次の手順を実行するべきである:

  1. T を、ディスパッチされる pointerdown、pointerup、または pointermove イベントの対象とする。pointerleave イベントの場合は、T を未設定にする。
  2. T と現在の 従来のマウスポインターの実効 位置が両方とも未設定であるか、両者が等しい場合、これらの手順を終了する。
  3. mouseover、mouseout、mouseenter、 mouseleave イベントを Mouse Events に従ってディスパッチする。これは、マウスが現在の 従来のマウスポインターの実効 位置から T に移動する場合に相当する。現在の 従来のマウスポインターの実効 位置または T が未設定の場合は、ウィンドウ外のマウス位置と見なす。
  4. 従来のマウスポインターの実効 位置を T に設定する。
注記

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

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

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

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

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

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

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

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

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

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

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

ユーザーエージェントがタッチイベント(次で定義されているもの:[TOUCH-EVENTS]) およびポインターイベントの両方をサポートする場合、ユーザー エージェント は決して、両方を生成してはならない:互換性マウスイベント( この節で説明されているもの)と、フォールバック マウスイベント(次に概要が示されているもの:[TOUCH-EVENTS])。

注記

要素のアクティブ化(click)を、次に該当するプライマリーポインターで行う場合:ホバーをサポートしない(たとえば、 タッチスクリーン上の1本の指)、通常は次のイベントシーケンスが生成される:

  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] の onclick、 ondblclick、onmousedown、onmouseup、onmouseover、 onmousemove、および onmouseout 属性である。このイベントモジュールは、特に次の用途向けに設計されている: マウスやトラックボールなどのポインティング入力デバイスでの使用。

DOM Level 2 で導入され、この仕様で変更された。

MouseEvent インターフェイスが提供するのは、固有の文脈に関する 情報であり、マウスイベントに関連付けられている。

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

注記

対象となった要素の祖先は、イベントのバブリングを利用してマウスイベントの通知を取得できる、 自身の子孫要素内で発生したイベントについて。

インスタンスを作成する対象が MouseEvent インターフェイスである場合、次を使用する:MouseEvent コンストラクター。任意で次を渡す:MouseEventInit 辞書。

注記

初期化の際、MouseEvent オブジェクトに使用するメソッドが initMouseEvent である場合、実装はクライアント座標を使用できる: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

参照:KeyboardEvent の ctrlKey 属性。

未初期化時の値 は、この 属性では 必ず false でなければならない。

shiftKey

参照:KeyboardEvent の shiftKey 属性。

未初期化時の値 は、この 属性では 必ず false でなければならない。

altKey

参照:KeyboardEvent の altKey 属性。

未初期化時の値 は、この 属性では 必ず false でなければならない。

metaKey

参照:KeyboardEvent の metaKey 属性。

未初期化時の値 は、この 属性では 必ず false でなければならない。

button

マウスボタンの押下または解放によって発生するマウスイベントでは、button を 必ず 状態が変化したポインターデバイスのボタンを示すために使用しなければならない。

値は、button 属性について、必ず 次のとおりでなければならない:

  • 0 は 必ず デバイスのプライマリーボタンを示さなければならない( 通常は左ボタン、または単一ボタンのデバイスの唯一のボタンで、次のアクティブ化に使われる: ユーザーインターフェイスのコントロール、またはテキストの選択に使われる)、あるいは未初期化時の値を示さなければならない。
  • 1 は 必ず 補助ボタンを示さなければならない(通常は、 中央ボタンであり、マウスホイールと一体化していることが多い)。
  • 2 は 必ず セカンダリーボタンを示さなければならない(通常は、 右ボタンであり、コンテキストメニューの表示に使われることが多い)。
  • 3 は 必ず X1(戻る)ボタンを示さなければならない。
  • 4 は 必ず X2(進む)ボタンを示さなければならない。

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

注記

次の値:button は、 マウスボタンの押下/解放に起因しないイベントでは更新されない。こうした 状況では、値 0 を左ボタンとして解釈しないよう注意し、 既定値として解釈する。

注記

一部の 既定の動作(関連するのは、 次のようなイベント:mousedown および mouseup)は、特定のマウスボタンに依存する、 使用中のボタンに。

未初期化時の値 は、この 属性では 必ず 0 でなければならない。

buttons

どのマウスイベントでも、buttons を 必ず マウスボタンの組み合わせを示すために使用しなければならない、 現在押されているものを、ビットマスクとして表して。

注記

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

注記

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

値は、buttons 属性について、必ず 次のとおりでなければならない:

  • 0 は 必ず 現在アクティブなボタンがないことを示さなければならない。
  • 1 は 必ず デバイスのプライマリーボタンを示さなければならない( 通常は左ボタン、または単一ボタンのデバイスの唯一のボタンで、次のアクティブ化に使われる: ユーザーインターフェイスのコントロール、またはテキストの選択に使われる)。
  • 2 は 必ず セカンダリーボタンを示さなければならない(通常は、 右ボタンであり、コンテキストメニューの表示に使われることが多い)、そのボタンが存在する場合。
  • 4 は 必ず 補助ボタンを示さなければならない(通常は、 中央ボタンであり、マウスホイールと一体化していることが多い)。

一部のポインティングデバイスは、さらに多くのボタンを提供またはシミュレートする。これらのボタンを表すには、値を 必ず ボタンが1つ増えるごとに2倍にしなければならない(2進数の系列 8, 16, 32, ... )。

注記

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

注記

一部の 既定の動作(関連するのは、 次のようなイベント:mousedown および mouseup)は、特定のマウスボタンに依存する、 使用中のボタンに。

未初期化時の値 は、この 属性では 必ず 0 でなければならない。

relatedTarget

次の副次的な対象を識別するために使用する:EventTarget、関連付け先は UI イベントであり、イベントの種類に応じる。

未初期化時の値 は、この 属性では 必ず null でなければならない。

relatedTarget は、次のようにするべきである: マウスポインターがその境界から出たばかりの要素に初期化する(mouseover または mouseenter イベントの場合)、または次の要素:その境界内へ マウスポインターが入りつつあるもの(mouseout または mouseleave または focusout イベントの場合)。その他のイベントでは、この 値を代入する必要はない(既定では null になる)。

getModifierState(keyArg)

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

返す値は true(修飾キーであり、その修飾キーがアクティブな場合)、 false(それ以外の場合)である。

DOMString keyArg
参照:KeyboardEvent の getModifierState() メソッドにある、このパラメーターの説明。

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

11.2 MouseEvent アルゴリズム

11.2.1 ネイティブ OS の要件

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

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

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

11.2.2 マウスイベントの構築

警告

この節は改訂が必要である。

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

次を構築するために:MouseEvent、またはこれらのオブジェクトから派生したオブジェクトを、 以下のアルゴリズムを使用する場合、すべての MouseEvent および派生した オブジェクトは 内部キー修飾状態 を持ち、その設定と取得に使用できるのは、 キー修飾子名 であり、次の表に記載されている:修飾キー表、掲載先は [UIEvents-Key]。

次の手順は、イベントの構築について次の仕様で定義されたアルゴリズムを補足する:[DOM]:

  • もし Event を構築しており、それが MouseEvent オブジェクトまたは派生オブジェクトであり、 その派生元が前者で、さらに 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 を初期化する

警告

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

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

  1. event、eventType、eventTarget、 bubbles、および 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" が含まれる場合、event の shift フラグを設定し、それ以外の場合は設定を解除します
  3. キー修飾子状態に "Control" が含まれる場合、event の control フラグを設定し、それ以外の場合は設定を解除します
  4. キー修飾子状態に "Alt" が含まれる場合、event の alt フラグを設定し、それ以外の場合は設定を解除します
  5. キー修飾子状態に "AltGraph" が含まれる場合、event の altgraph フラグを設定し、それ以外の場合は設定を解除します
  6. キー修飾子状態に "Meta" が含まれる場合、event の meta フラグを設定し、それ以外の場合は設定を解除します
  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. event、eventType、eventTarget、bubbles、および 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. event、eventType、eventTarget、bubbles、および cancelable を用いて MouseEvent を初期化します。
  7. event を返します

11.2.10 MouseEvent の button 属性を計算する

警告

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

これは、MouseEvent の button 属性に格納するのに適したボタン 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 を、event を target で ディスパッチした結果とします
  9. result が true であり、target が クリックフォーカス可能な フォーカス可能領域である場合、
    1. target に対して フォーカス 手順を実行します
  10. mbutton がセカンダリマウスボタンである場合、
    1. native、target を用いて 必要に応じてコンテキストメニューを表示します

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. target において event を配送 する

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

警告

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

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

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

  2. target を、native からのビューポート相対座標を用いたヒットテストの結果と する
  3. native と target を用いてクリックイベントを送信する処理を 実行する。

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. event と native を用いて ネイティブから MouseEvent 属性を設定する
    2. event.screenX が整数値でない場合、丸める。
    3. event.screenY が整数値でない場合、丸める。
  8. target において event を配送 する
    注記

    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. event と native を用いてネイティブから MouseEvent 属性を 設定する
  7. event.screenX が整数値でない場合、 丸める。
  8. event.screenY が整数値でない場合、 丸める。
  9. target において event を配送 する

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. 配送 target において mouseout を配送する
      注記

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

    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 を、element における mouseleave の配送 の結果とする
  5. 新しい要素に入る際のイベントを生成する:
    1. target が最後のマウス要素でない 場合、
      1. mouseover を、"mouseover" と target を用いてキャンセル可能な MouseEvent を作成する処理の結果とする
        編集者注

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

      2. mouseover を用いて、場合によっては pointerover イベントを送信する
      3. 配送 target において mouseout を配送する
        注記

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

      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 イベントを送信する
          注記

          シャドー DOM 要素との互換性を確認する。Chrome/Linux はこの イベントを要素とシャドールートで発火する。

        4. result を、element における mouseenter の配送 の結果とする
      6. 最後のマウス要素を target に設定する
      7. 最後のマウス DOM パスを targetDomPath に設定する
  6. mousemove を、"mousemove" と element を用いてキャンセル可能な MouseEvent を作成する処理の結果と する
  7. mousemove の PointerLock 属性を設定する
  8. mousemove を用いて、場合によっては pointermove イベントを送信する
  9. element において mousemove を配送 する

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

警告

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

  1. native をネイティブの mousedown またはポインターイベントとする
  2. target をイベントの EventTarget とする
    1. menuevent を、"contextmenu" と target を用いてPointerEvent を作成する処理の 結果とする
    2. native が有効である場合、
      1. native を用いてネイティブから MouseEvent 属性を設定する
    3. result を、target における menuevent の配送 の結果とする
    4. result が true の場合、ユーザーエージェントのコンテキストメニューを表示する
注記

キーボードによって起動されたコンテキストメニューを処理するには、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 イベントを引き続き発火しながら、mousedown と mouseup イベントの間に許容される遅延時間、程度、距離、および mousemove イベント数は、 実装、デバイス、およびプラットフォームに固有です。この許容範囲は、 手が不安定であるなどの身体障害があるユーザーがポインティングデバイスを操作する際の助けになります。

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

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

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

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

11.4 マウスイベントの種類

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

11.4.1 auxclick

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

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

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

auxclick イベントの前に、同じ要素上で mousedown および mouseup イベントが発生してもかまいません。その他の ノードタイプ(たとえばテキストノード)間の変更は無視します。環境 設定によっては、ポインティングデバイスのボタンを押してから 解放するまでの間に、mouseover、 mousemove、および 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 値が 0、 buttons 値が 1 の場合)。 セカンダリボタン (標準的なマウスの中央ボタンや右ボタンなど)は、 click イベントを発火してはなりません。非プライマリボタンに 関連付けられた対応するイベントについては、auxclick を参照してください。

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

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

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

注記

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

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

11.4.3 contextmenu

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

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

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

注記

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

11.4.4 dblclick

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

ユーザーエージェントは、 ポインティングデバイスのプライマリボタンが要素上で 2 回クリックされたとき、 このイベントをディスパッチしなければなりません。ダブルクリックの 定義は環境 設定に依存します。ただし、mousedown、mouseup、および 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 プロパティが false の wheel イベントを生成するべきであり、これは preventDefault を使用してスクロールを防止または中断 できないことを示します。それ以外の場合、cancelable は true になります。

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

測定可能なプロパティは、実数または 大きな定義域の整数を使用して表現される、連続的なポインターセンサーデータに関する値を表します。 ポインターイベントでは、width、height、pressure、 tangentialPressure、tiltX、tiltY、twist、 altitudeAngle、azimuthAngle、およびマウスイベントモデルのプロパティ screenX、screenY、clientX、clientY は 測定可能なプロパティです。

これに対して、pointerId、pointerType、 isPrimary、および マウスイベントモデルのプロパティ button、buttons、ctrlKey、 shiftKey、altKey、および 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年9月30日. 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年10月5日. 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/