ポインターイベント

レベル 4

W3C 作業草案

この文書の詳細情報
このバージョン:
https://www.w3.org/TR/2026/WD-pointerevents4-20260701/
最新公開バージョン:
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)を提供することで、開発者はそれぞれに対して デバイス固有のロジックを書かずに、多様な入力方式をサポートできます。

この仕様は Mouse Events および Wheel Events、ならびに他のポインターデバイス型に対して Mouse Events を発火するためのマッピングも定義します。

この文書の状態

この節は、この文書の公開時点における 状態を説明します。現在の W3C 公開文書の一覧と、この技術報告書の最新リビジョンは、 W3C 標準および草案 インデックスにあります。

この仕様は [PointerEvents3] 仕様の更新です。また、 以前は [UIEVENTS] 仕様に含まれていた Mouse and Wheel Events も含みます。

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

この文書は、Pointer Events Working Group により、 勧告 トラックを用いた作業草案として公開されました。

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

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

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

この文書は、 2025年8月18日 W3C プロセス文書に従います。

1. 序論

このセクションは非規範的です。

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

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

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

注記

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

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

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

汎用的なポインター入力を処理するためのイベントは、マウス用のものによく似ています: pointerdown, pointermove, pointerup, pointerover, pointerout などです。これにより、コンテンツを Mouse Events から Pointer Events へ容易に移行できます。 Pointer Events は、Mouse Events に存在する通常のプロパティ(client 座標、ターゲット要素、ボタン状態を含む)をすべて提供することに加えて、 圧力、接触ジオメトリ、傾きなど、他の形式の入力のための新しいプロパティも提供します。作者は Pointer Events に合わせて容易にコードを書くことができ、 意味のある場合には異なる入力型間でロジックを共有し、最良の体験を得るために必要な箇所でのみ特定の入力型向けにカスタマイズできます。

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

注記

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

2. 適合性

非規範的と示されたセクションに加えて、この仕様におけるすべての作成ガイドライン、図、例、および注記は非規範的です。 この仕様におけるその他すべては規範的です。

この文書におけるキーワード MAY, MUST, MUST NOT, OPTIONAL, および SHOULD は、 ここに示すようにすべて大文字で現れる場合に限り、 BCP 14 [RFC2119] [RFC8174] で説明されているように解釈されるものとします。

3.

このセクションは非規範的です。

以下は、この仕様の API の一部が作者によってどのように使用される可能性があるかを示す基本的な例です。 さらに具体的な例は、この文書の関連セクションで提供されます。

1: 機能検出と イベントのバインド
/* Pointer Events または従来の touch/mouse のいずれかにバインド */

if (window.PointerEvent) {
    // Pointer Events がサポートされている場合は、pointer イベントのみをリッスンする
    target.addEventListener("pointerdown", function(e) {
        // 必要であれば、e.pointerType に基づいて個別のロジックを適用する
        // 異なる touch/pen/mouse の挙動に対して
        ...
    });
    ...
} else {
    // 従来の touch/mouse イベントハンドラー
    target.addEventListener('touchstart', function(e) {
        // 互換性マウスイベントおよび click を防止する
        e.preventDefault();
        ...
    });
    ...
    target.addEventListener('mousedown', ...);
    ...
}

// キーボード処理のための追加のイベントリスナー
...
2: ユーザーからの 入力型の検出
window.addEventListener("pointerdown", detectInputType);

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

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

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

4. マウスイベント

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

4.1 MouseEvent インターフェイス

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

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

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

注記

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

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

注記

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

4.1.1 MouseEvent

WebIDL[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

イベントが発生した、スクリーン座標系の原点に対する水平座標。

この属性の 未初期化値0MUST です。

screenY

イベントが発生した、スクリーン座標系の原点に対する垂直座標。

この属性の 未初期化値0MUST です。

clientX

イベントが発生した、そのイベントに関連付けられたビューポートに対する水平座標。

この属性の 未初期化値0MUST です。

clientY

イベントが発生した、そのイベントに関連付けられたビューポートに対する垂直座標。

この属性の 未初期化値0MUST です。

layerX

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

この属性の 未初期化値0MUST です。

layerY

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

この属性の 未初期化値0MUST です。

ctrlKey

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

この属性の 未初期化値falseMUST です。

shiftKey

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

この属性の 未初期化値falseMUST です。

altKey

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

この属性の 未初期化値falseMUST です。

metaKey

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

この属性の 未初期化値falseMUST です。

button

マウスボタンの押下または解放によって発生したマウスイベント中、button は、どのポインティングデバイスボタンの状態が変化したかを示すために 使用される MUST です。

button 属性の値は次のとおりである MUST です:

  • 0 は、デバイスの主ボタン(一般に、左ボタン、または単一ボタンデバイス上の唯一のボタンで、 ユーザーインターフェイスコントロールのアクティブ化またはテキスト選択に使用されるもの)または未初期化値を示す MUST です。
  • 1 は、補助ボタン(一般に、マウスホイールと組み合わされることが多い中央ボタン)を示す MUST です。
  • 2 は、副ボタン(一般に、コンテキストメニューを表示するためによく使用される右ボタン)を示す MUST です。
  • 3 は、X1(戻る)ボタンを示す MUST です。
  • 4 は、X2(進む)ボタンを示す MUST です。

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

注記

button の値は、マウスボタンの押下/解放によって発生していないイベントでは 更新されません。このようなシナリオでは、値 0 を左ボタンとしてではなく、既定値として解釈するよう 注意してください。

注記

mousedownmouseup などのイベントに関連する一部の 既定の動作 は、使用されている特定のマウス ボタンに依存します。

この属性の 未初期化値0MUST です。

buttons

任意のマウスイベント中、buttons は、 現在押されているマウスボタンの組み合わせをビットマスクとして表すために使用される MUST です。

注記

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

buttons 属性の値は次のとおりである MUST です:

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

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

注記

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

注記

mousedownmouseup などのイベントに関連する一部の 既定の動作 は、使用されている特定のマウス ボタンに依存します。

この属性の 未初期化値0MUST です。

relatedTarget

イベントの種類に応じて、UI イベントに関連する二次的な EventTarget を識別するために使用されます。

この属性の 未初期化値nullMUST です。

getModifierState(keyArg)

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

それが修飾キーであり、その修飾子が有効化されている場合は true を返し、 それ以外の場合は false を返します。

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

4.1.2 MouseEventInit

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

screenX 属性を、ユーザーのスクリーン上のマウスポインターの望ましい 水平方向の相対位置に初期化します。

イベントオブジェクトを指定されたマウス位置に初期化しても、ユーザーのマウス ポインターを初期化された位置へ移動してはなりません。

screenY

screenY 属性を、ユーザーのスクリーン上のマウスポインターの望ましい垂直方向の 相対位置に初期化します。

イベントオブジェクトを指定されたマウス位置に初期化しても、ユーザーのマウス ポインターを初期化された位置へ移動してはなりません。

clientX

clientX 属性を、ユーザーのブラウザーのクライアントウィンドウに対する マウスポインターの望ましい水平位置に初期化します。

イベントオブジェクトを指定されたマウス位置に初期化しても、ユーザーのマウス ポインターを初期化された位置へ移動してはなりません。

clientY

clientY 属性を、ユーザーのブラウザーのクライアントウィンドウに対する マウスポインターの望ましい垂直位置に初期化します。

イベントオブジェクトを指定されたマウス位置に初期化しても、ユーザーのマウス ポインターを初期化された位置へ移動してはなりません。

button

button 属性を、マウスのボタンの望ましい状態を表す数値に 初期化します。

注記

値 0 は主マウスボタンを表すために使用され、1 は補助/中央マウスボタンを表すために使用され、2 は右マウスボタンを表すために使用されます。 2 より大きい数値も可能ですが、この文書では指定されていません。

buttons

buttons 属性を、アクティブとみなされるマウスのボタンの 1 つまたは複数を表す数値に初期化します。

注記

buttons 属性はビットフィールドです。 マスク値 1 がビットフィールドの値に適用されたときに true であれば、主マウスボタンが押下されています。 マスク値 2 がビットフィールドの値に適用されたときに true であれば、右マウスボタンが押下されています。 マスク値 4 がビットフィールドの値に適用されたときに true であれば、補助/中央ボタンが押下されています。

JavaScript では、右ボタン(2)と中央ボタン(4)が同時に押されているかのように buttons 属性を初期化するには、buttons 値を次のいずれかとして割り当てることができます:

{ buttons: 2 | 4 }

または:

{ buttons: 6 }
relatedTarget

relatedTarget は、 (mouseover または mouseenter イベントの場合)マウスポインターがちょうど離れた境界を持つ要素、または (mouseoutmouseleave、または focusout イベントの場合)マウスポインターが入ろうとしている境界を持つ要素に 初期化されるべきです。その他のイベントでは、この値を割り当てる必要はありません(既定で null になります)。

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

4.2 MouseEvent アルゴリズム

4.2.1 ネイティブ OS 要件

このセクションのアルゴリズムは、ネイティブプラットフォーム OS が次を提供することを前提とします:

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

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

4.2.2 Mouse Events の構築

警告

このセクションは改訂が必要です。

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

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

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

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

4.2.3 MouseEvent のグローバル状態

警告

このセクションは改訂が必要です。

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

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

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

4.2.3.2 Window レベルの状態

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

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

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

4.2.4 MouseEvent の内部状態

警告

このセクションは改訂が必要です。

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

4.2.5 ヒットテスト

警告

このセクションは改訂が必要です。

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

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

4.2.6 MouseEvent を初期化する

警告

このセクションは改訂が必要です。

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

  1. UIEvent を初期化するを、eventeventTypeeventTargetbubbles および cancelable で実行します。
  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. MouseEvent の PointerLock 属性を初期化するevent で実行します
    Issue 1

    ここにハードコードするのではなく、PointerLock のためのフックを提供するべきです。

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

警告

このセクションは改訂が必要です。

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

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

警告

このセクションは改訂が必要です。

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

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

警告

このセクションは改訂が必要です。

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

4.2.10 MouseEvent button 属性を計算する

警告

このセクションは改訂が必要です。

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

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

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

警告

このセクションは改訂が必要です。

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

    TODO。

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

4.2.12 ネイティブ mouse down を処理する

警告

このセクションは改訂が必要です。

  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. ネイティブから MouseEvent 属性を 設定するnative で実行します
  7. pointerdown イベントを送信するかもしれないevent で実行します
  8. result を、eventtargetdispatch した結果とします
  9. result が true であり、targetclick focusablefocusable area である場合、
    1. targetフォーカス手順を実行します
  10. mbutton が副マウスボタンである場合、
    1. コンテキストメニューを表示するかもしれないnativetarget で実行します

4.2.13 ネイティブ mouse up を処理する

警告

このセクションは改訂が必要です。

  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. ネイティブから MouseEvent 属性を 設定するnative で実行します
  7. pointerup イベントを送信するかもしれないevent で実行します
  8. eventtargetdispatch します

4.2.14 ネイティブ mouse click を処理する

警告

このセクションは改訂が必要です。

  1. native をネイティブ mouse click とします
    注記

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

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

4.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. ネイティブから MouseEvent 属性を設定するeventnative で実行します
    2. event.screenX が整数値でない場合、それを丸めます。
    3. event.screenY が整数値でない場合、それを丸めます。
  8. eventtargetdispatch します
    注記

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

    編集者注

    任意の「既定の動作」は、ターゲットの activation behavior アルゴリズムをトリガーすることにより、配送中に処理されます。そのため、ここでそれを処理する必要はありません。 ただし、既存の仕様が disabled/css-pointer-events/inert/... を処理していることを確認する必要があります。

    注記

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

    注記

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

4.2.16 ネイティブ mouse double click を処理する

警告

このセクションは改訂が必要です。

  1. native をネイティブ mouse double click とします
    注記

    これは、double click を生成するマウスクリックについて、handle native mouse click の直後に呼び出されるべきです。

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

4.2.17 ネイティブ mouse move を処理する

警告

このセクションは改訂が必要です。

  1. native をネイティブ mouse move とします
    Issue 2

    このアルゴリズムは、PointerEvents の dispatch について仮定を置いています。なぜなら、それらは 現在明示的に指定されていないためです。pointerevents/285 が 解決されたら、これは更新が必要になる可能性があります。

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

        TODO: mouseout 属性を native から設定します。+CSSOM 属性。

    2. pointerout イベントを送信するかもしれないmouseout で実行します
    3. mouseouttargetdispatch します
      注記

      キャンセルされた場合の挙動を検証します(効果はないように見えます)。

    4. leaveElements を、最後の mouse DOM パスのコピーから、targetDomPath と共通するすべての要素を削除したものとします。
    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. pointerleave イベントを送信するかもしれないmouseleave で実行します
      4. result を、mouseleaveelementdispatch した結果とします
  5. 新しい要素に入るためのイベントを生成します:
    1. target最後の mouse 要素でない場合、 次を実行します
      1. mouseover を、"mouseover" と target を用いて キャンセル可能な MouseEvent を作成する結果とします
        編集者注

        TODO: mouseout 属性を native から設定します。+CSSOM 属性。

      2. pointerover イベントを送信するかもしれないmouseover で実行します
      3. mouseouttargetdispatch します
        注記

        キャンセルされた場合の挙動を検証する必要があります(効果はないように見えます)。

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

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

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

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

        3. pointerenter イベントを送信するかもしれないmouseenter で実行します
          注記

          shadow DOM 要素について互換性を確認します。Chrome/Linux はこの イベントを要素と shadow root の両方で発火します。

        4. result を、mouseenterelementdispatch した結果とします
      6. 最後の mouse 要素target に設定します
      7. 最後の mouse DOM パスtargetDomPath に設定します
  6. mousemove を、"mousemove" と element を用いて キャンセル可能な MouseEvent を作成する結果とします
  7. mousemove の PointerLock 属性を設定する
  8. pointermove イベントを送信するかもしれないmousemove で実行します
  9. mousemoveelementdispatch します

4.2.18 コンテキストメニューを表示するかもしれない

警告

このセクションは改訂が必要です。

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

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

4.3 Mouse Event の順序

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

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

ポインティングデバイスが要素 A の中へ移動され、その後ネストされた要素 B の中へ移動され、 そして再び外へ戻された場合、次のイベントシーケンスが発生しなければなりません MUST:

イベント型 要素 注記
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 つの要素が、 Web ページ上で同じ寸法および絶対位置を持っています。要素 C は B の子であり、B は DOM における A の子です:

互いの上にすべて重なった 3 つの積み重ねられた要素の図による表現。最下位の要素は A とラベル付けされ、最上位の要素は C です
2 互いの上にすべて重なった 3 つの積み重ねられた 要素と、そのスタック上を移動するポインティングデバイスの図による表現。

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

イベント型 要素 注記
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 OPTIONAL、複数のイベント、いくつかの制限
3 mouseup
4 click
5 mousemove OPTIONAL、複数のイベント、いくつかの制限
6 mousedown
7 mousemove OPTIONAL、複数のイベント、いくつかの制限
8 mouseup
9 click
10 dblclick
注記

mousedown イベントと mouseup イベントの間で click または dblclick イベントをなお発火することが許容される mousemove イベントの遅延時間、程度、距離、および数は、 実装、デバイス、およびプラットフォームに固有です。この許容範囲は、これらのユーザーがポインティングデバイスを操作する際に、 手の震えなどの身体障害を持つユーザーを支援できます。

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

mousedown イベントが HTML 文書の body 要素をターゲットとし、対応する mouseup イベントが 文書要素をターゲットとしていた場合、 click イベントは 文書 要素へ配送されます。これはそれが最も近い共通の包含 祖先であるためです。

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

mousedown イベントの結果としてターゲット要素が DOM から削除された場合、 その要素に対するイベントは、 mouseupclick、または dblclick、およびいかなる既定の アクティベーションイベントについても配送されません。ただし、mouseup イベントは、初期ターゲット要素の削除後に マウスに露出する要素上でなお配送されます。同様に、mouseup イベントの配送中に ターゲット要素が DOM から削除された場合、 click およびそれ以降のイベントは配送されません。

4.4 Mouse Event 型

Mouse event 型を以下に示します。ネストされた要素の場合、 mouse event 型は常に最も深くネストされた要素をターゲットにします。 ターゲット要素の祖先は、その子孫要素内で発生する mouse events の通知を取得するために、バブリングを使用してもよい MAY です。

4.4.1 auxclick

auxclick
インターフェイス PointerEvent
同期 / 非同期 同期
バブル はい
信頼済みターゲット Element
キャンセル可能 はい
合成 はい
既定の動作 さまざま
コンテキスト
(信頼済みイベント)

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

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

auxclick イベントの前には、他のノード型 (例: テキストノード)間の変化を無視して、同じ要素上の mousedown および mouseup イベントが先行してもよい MAY です。環境設定によっては、ポインティングデバイスボタンの押下と 解放の間にイベント型 mouseovermousemove、および mouseout の 1 つ以上が発生した場合でも、 auxclick イベントが配送されてもよい MAY です。

auxclick イベント型の 既定の動作は、 イベントの ターゲット、 および button または buttons 属性の値に基づいて異なります。 auxclick イベント型の典型的な 既定の動作は次のとおりです:

  • ターゲットに 関連付けられたアクティベーション動作がある場合、 既定の 動作は、そのアクティベーション 動作を実行することでなければなりません MUST
6: 中央ボタンの auxclick の受信と処理
myLink.addEventListener("auxclick", function(e) {
  if (e.button === 1) {
    // これは、たとえばリンクを中央クリックしたときに
    // 新しいタブを開く既定の挙動を防止します。
    e.preventDefault();
    // アプリに合う方法で、リンクまたは非リンクボタンを新しいタブで開く処理など、
    // 中央ボタンクリックを処理するための別の処理を行います。
    // タブストリップでタブを閉じるなど、click アクションで行うべき
    // その他のアクションもここで行えます。
  }
});
注記

右ボタンの場合、auxclick イベントは、 すべての contextmenu イベントの後に配送されます。 一部のユーザーエージェントはコンテキストメニューが表示されている間、すべての入力 イベントを飲み込むため、そのようなシナリオでは auxclick がアプリケーションで 利用できない場合があることに注意してください。 さらに明確にするために、 7 を参照してください。

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

4.4.2 click

click
インターフェイス PointerEvent
同期 / 非同期 同期
バブル はい
信頼済みターゲット Element
キャンセル可能 はい
合成 はい
既定の動作 さまざま
コンテキスト
(信頼済みイベント)

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

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

click イベントの前には、他のノード型 (例: テキストノード)間の変化を無視して、同じ要素上の mousedown および mouseup イベントが先行してもよい MAY です。環境設定によっては、ポインティングデバイスボタンの押下と 解放の間にイベント型 mouseovermousemove、および mouseout の 1 つ以上が発生した場合でも、 click イベントが配送されてもよい MAY です。click イベントの後に dblclick イベントが続いてもよい MAY です。

ユーザーが、大きな line-height でスタイル設定された <p> 要素のテキストノード子上で mousedown し、 マウスをわずかに移動して、もはやテキストを含む領域上にはないが、なおその <p> 要素の包含ブロック内にあるようにし(すなわち、ポインターが 同じテキストブロックの行間にあるが、テキストノード自体の上にはない場合)、 その後 mouseup した場合、ユーザーが同じ要素の範囲内に留まっているため、 これはおそらく click イベントをなおトリガーします(それが click の通常の時間的 ヒステリシス内に収まる場合)。 ユーザーエージェントによって生成される mouse events はテキストノード上では配送されないことに注意してください。

ポインターデバイスに関連付けられることに加えて、 click イベント型は、要素の アクティベーションの一部として配送されなければなりません MUST

注記

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

click イベント型の 既定の動作は、 イベントの ターゲット、 および button または buttons 属性の値に基づいて異なります。 click イベント型の典型的な 既定の動作は次のとおりです:

  • ターゲットに 関連付けられたアクティベーション動作がある場合、 既定の 動作は、そのアクティベーション 動作を実行することでなければなりません MUST
  • ターゲットが フォーカス可能である場合、既定の 動作は、その要素に文書フォーカスを与えることでなければなりません MUST

4.4.3 contextmenu

contextmenu
インターフェイス PointerEvent
同期 / 非同期 同期
バブル はい
信頼済みターゲット Element
キャンセル可能 はい
合成 はい
既定の動作 サポートされている場合、コンテキストメニューを呼び出す。
コンテキスト
(信頼済みイベント)

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

contextmenu イベントが右マウス ボタンによってトリガーされる場合、 contextmenu イベントは、mousedown イベントの後に配送されなければなりません MUST

注記

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

4.4.4 dblclick

dblclick
インターフェイス MouseEvent
同期 / 非同期 同期
バブル はい
信頼済みターゲット Element
キャンセル可能 はい
合成 はい
既定の動作 なし
コンテキスト
(信頼済みイベント)

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

click イベントと同様に、dblclick イベントは 主ポインターボタンに対してのみ発火されるべきです。副ボタンは dblclick イベントを発火してはなりません MUST NOT

注記

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

click イベント型と同様に、 dblclick イベント型の 既定の動作は、イベントの ターゲット、および button または buttons 属性の値に基づいて異なります。 dblclick イベント型の典型的な 既定の動作は、 click イベント型のものと一致します。

4.4.5 mousedown

mousedown
インターフェイス MouseEvent
同期 / 非同期 同期
バブル はい
信頼済みターゲット Element
キャンセル可能 はい
合成 はい
既定の動作 さまざま: ドラッグ/ドロップ操作を開始する、テキスト選択を開始する、スクロール/パン インタラクションを開始する(サポートされている場合は中央マウスボタンと組み合わせて)
コンテキスト
(信頼済みイベント)
ユーザーエージェントは、 ポインティングデバイスの ボタンが要素上で押されたときに、このイベントを配送しなければなりません MUST
注記

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

4.4.6 mouseenter

mouseenter
インターフェイス MouseEvent
同期 / 非同期 同期
バブル いいえ
信頼済みターゲット Element
キャンセル可能 いいえ
合成 いいえ
既定の動作 なし
コンテキスト
(信頼済みイベント)
ユーザーエージェントは、 ポインティングデバイスが要素またはその子孫要素の境界上へ移動されたときに、 このイベントを配送しなければなりません MUSTユーザーエージェントは、 要素またはその子孫の 1 つが主ポインティングデバイスの下へ移動したときにも、 このイベントを配送しなければなりません MUST。 このイベント型は mouseover に似ていますが、 バブルしない点、およびポインターデバイスが要素からその子孫要素の 1 つの境界上へ移動したときには配送されてはならない MUST NOT 点が異なります。
注記

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

4.4.7 mouseleave

mouseleave
インターフェイス MouseEvent
同期 / 非同期 同期
バブル いいえ
信頼済みターゲット Element
キャンセル可能 いいえ
合成 いいえ
既定の動作 なし
コンテキスト
(信頼済みイベント)
ユーザーエージェントは、 ポインティングデバイスが要素およびそのすべての 子孫要素の境界外へ移動されたときに、このイベントを配送しなければなりません MUSTユーザー エージェントは、要素またはその子孫の 1 つが主ポインティングデバイスの下になくなるように 移動したときにも、このイベントを配送しなければなりません MUST。このイベント型は mouseout に似ていますが、 バブルしない点、およびポインティングデバイスが要素の境界と そのすべての子の境界を離れるまで配送されてはならない MUST NOT 点が異なります。
注記

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

4.4.8 mousemove

mousemove
インターフェイス MouseEvent
同期 / 非同期 同期
バブル はい
信頼済みターゲット Element
キャンセル可能 はい
合成 はい
既定の動作 なし
コンテキスト
(信頼済みイベント)
ユーザーエージェントは、 ポインティングデバイスが要素上にある間に移動されたとき、このイベントを配送しなければなりません MUST。ポインティングデバイスが移動している間のイベントの発生頻度は、 実装、デバイス、およびプラットフォームに固有ですが、継続的なポインターデバイスの移動に対しては、 マウス移動の各インスタンスにつき単一のイベントではなく、連続する複数の mousemove イベントが発火されるべきです SHOULD。実装には、 応答性とパフォーマンスのバランスを取るために最適な頻度を決定することが推奨されます。
注記

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

注記

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

4.4.9 mouseout

mouseout
インターフェイス MouseEvent
同期 / 非同期 同期
バブル はい
信頼済みターゲット Element
キャンセル可能 はい
合成 はい
既定の動作 なし
コンテキスト
(信頼済みイベント)
ユーザーエージェントは、 ポインティングデバイスが要素の境界外へ移動されたとき、または要素が 主ポインティングデバイスの下になくなるように移動されたときに、このイベントを配送しなければなりません MUST。 このイベント型は mouseleave に似ていますが、 バブルする点、およびポインターデバイスが要素からその子孫要素の 1 つの境界上へ移動したときに配送されなければならない MUST 点が異なります。
注記

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

4.4.10 mouseover

mouseover
インターフェイス MouseEvent
同期 / 非同期 同期
バブル はい
信頼済みターゲット Element
キャンセル可能 はい
合成 はい
既定の動作 なし
コンテキスト
(信頼済みイベント)
ユーザーエージェントは、 ポインティングデバイスが要素の境界上へ移動されたとき、または要素が 主ポインティングデバイスの下へ移動したときに、このイベントを配送しなければなりません MUST。 このイベント型は mouseenter に似ていますが、 バブルする点、およびポインターデバイスが、同じ イベントリスナー インスタンスに対する ターゲットである祖先要素を持つ要素の 境界上へ移動したときに配送されなければならない MUST 点が異なります。
注記

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

4.4.11 mouseup

mouseup
インターフェイス MouseEvent
同期 / 非同期 同期
バブル はい
信頼済みターゲット Element
キャンセル可能 はい
合成 はい
既定の動作 なし
コンテキスト
(信頼済みイベント)
ユーザーエージェントは、 ポインティングデバイスのボタンが要素上で解放されたときに、このイベントを配送しなければなりません MUST
注記

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

5. Pointer Events とインターフェイス

5.1 PointerEvent インターフェイス

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

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

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

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

注記

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

width

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

height

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

pressure

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

tangentialPressure

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

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

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

tiltX の説明図
3 正の tiltX
tiltY

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

tiltY の説明図
4 正の tiltY
twist

トランスデューサー(例: pen/stylus)の自身の主軸まわりの時計回りの回転(度単位、範囲 [0,359])。twist を報告しないハードウェアおよびプラットフォームでは、 値は 0 でなければなりません MUST

altitudeAngle

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

注記
ここで定義される altitudeAngle の既定値は π/2 であり、 トランスデューサーを表面に垂直なものとして位置付けます。 これは Touch Events - Level 2 仕様における altitudeAngle プロパティの定義とは異なります。そちらの既定値は 0 です。
altitudeAngle の説明図
5 π/4(X-Y 平面から 45 度)の altitudeAngle の例。
azimuthAngle

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

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

イベントを発生させたデバイス型(mouse、pen、touch など)を示します。ユーザーエージェントが mouse、pen/stylus、または touch 入力デバイスについて ポインターイベントを発火する場合、 pointerType の値は次の表に従わなければなりません MUST:

ポインターデバイス型 pointerType
Mouse mouse
Pen / stylus pen
Touch contact touch

デバイス型をユーザーエージェントが検出できない場合、値は空文字列でなければなりません MUST。ユーザーエージェントが上記に列挙されていないポインターデバイス型をサポートする場合、 pointerType の値は、異なるデバイス型の名前の衝突を避けるため、 ベンダー接頭辞を付けるべきです SHOULD。将来の仕様は、 他のデバイス型について追加の規範的な値を提供してもよい MAY です。

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

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

persistentDeviceId

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

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

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

getPredictedEvents()

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

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

PointerEventイベント構築手順は、 PointerEventInitcoalescedEvents合成イベントリストへクローンし、 PointerEventInitpredictedEvents予測イベントリストへクローンします。

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

5.1.1 ボタンの状態

5.1.1.1 コード化ボタン インタラクション

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

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

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

5.1.1.2 button プロパティ

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

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

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

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

5.1.2 プライマリポインター

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

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

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

e という名前の ポインターイベントを発火するとは、 イベントを発火することを意味します。 そのイベントは e という名前で、 属性が PointerEvent Interface および 属性と既定の動作で定義されるように設定された PointerEvent を使用します。

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

イベントが発火される ターゲットを決定する方法は次のとおりです:

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

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

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

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

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

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

注記
通常のヒットテスト結果ではなく ポインターキャプチャ ターゲットオーバーライドをターゲットとして使用すると、[UIEVENTS] で定義されるいくつかの 境界イベントが発火される場合があります。これは、ポインターが以前のターゲットを離れ、この新しいキャプチャターゲットに 入るのと同じです。キャプチャが解放されたときも、ポインターがキャプチャターゲットを離れ、ヒットテストターゲットへ 入るため、同じシナリオが発生する場合があります。
5.1.3.1 属性と既定の動作

この仕様で定義されるイベント型の bubbles および cancelable プロパティと 既定の動作は、次の表に示されています。これらの各イベント型の詳細は Pointer Event 型で提供されます。

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

ビューポート操作(パンおよびズーム)— 一般には 直接操作インタラクションの結果 — は、 意図的に pointer events の既定の動作ではありません。つまり、これらの挙動(例: タッチスクリーン上で指を動かした結果として ページをパンすること)は、pointer event をキャンセルしても抑制できません。作者は代わりに、 文書の領域について touch-action を使用し、直接操作の挙動を宣言する必要があります。 イベントのキャンセルへのこの依存関係を取り除くことで、ユーザーエージェントによるパフォーマンス最適化が容易になります。

pointerenter および pointerleave イベントについては、 composed [DOM] 属性は false であるべきです SHOULD。上記の表にある他のすべての pointer events については、この属性は true であるべきです SHOULD

上記の表にあるすべての pointer events について、detail [UIEVENTS] 属性は 0 であるべきです SHOULD

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

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

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

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

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

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

click, auxclick, および contextmenu イベントのセクションで定義されるように、 lostpointercapture イベントが dispatch された後であっても、 対応する clickauxclick、または contextmenu イベントが存在する場合は、 なおキャプチャしているターゲットへ dispatch されます。

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

ユーザーエージェントは、 Web ページが特定の pointerId を持つ pointer events を 受信し続ける可能性が低いことを検出したとき、ポインターイベントストリームを抑制する必要があります MUST。次のいずれかのシナリオはこの条件を満たします(追加のシナリオがあってもよい MAY):

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

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

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

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

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

5.1.4 レイアウト変更によって引き起こされる境界イベント

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

注記
静止しているポインティングデバイス(スクリーン表面に対して相対的に移動せず、いかなるプロパティにも変化がなかったもの)は、 pointermove イベントを決して発火しません。

5.1.5 tiltX / tiltYaltitudeAngle / azimuthAngle の間の変換

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

具体的なハードウェアおよびプラットフォームによっては、ユーザーエージェントはスクリーン平面に対する トランスデューサーの向きについて、おそらく 1 つの値集合だけを受け取ります — tiltX / tiltY または altitudeAngle / azimuthAngle のいずれかです。 ユーザーエージェントは、これらの値を変換するために次のアルゴリズムを使用しなければなりません MUST

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

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

  // azimuth angle を計算する
  let azimuthAngle = 0;

  if (tiltX == 0) {
    if (tiltY > 0) {
      azimuthAngle = Math.PI/2;
    }
    else if (tiltY < 0) {
      azimuthAngle = 3*Math.PI/2;
    }
  } else if (tiltY == 0) {
    if (tiltX < 0) {
      azimuthAngle = Math.PI;
    }
  } else if (Math.abs(tiltX) == 90 || Math.abs(tiltY) == 90) {
    // azimuth を計算するための情報が不足している
    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;
    }
  }

  // altitude angle を計算する
  let altitudeAngle = 0;

  if (Math.abs(tiltX) == 90 || Math.abs(tiltY) == 90) {
      altitudeAngle = 0
  } else if (tiltX == 0) {
    altitudeAngle = Math.PI/2 - Math.abs(tiltYrad);
  } else if (tiltY == 0) {
    altitudeAngle = Math.PI/2 - Math.abs(tiltXrad);
  } else {
    // 非境界ケース: 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};
}

5.2 PointerEvent アルゴリズム

5.2.1 PointerEvent を初期化する

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

  1. eventeventTypeeventTargetbubbles、および cancelable を用いて MouseEvent を初期化する
  2. その他すべての属性を、既定の PointerEvent 値へ初期化します。

5.2.2 PointerEvent を作成する

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

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

5.2.3 MouseEvent から PointerEvent を作成する

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

5.2.4 pointerout イベントを送信するかもしれない

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

    TODO。

  4. targetmouseout.target とします
  5. pointerouttargetdispatch します

5.2.5 pointerleave イベントを送信するかもしれない

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

    TODO。

  4. targetmouseout.target とします
  5. pointerouttargetdispatch します

5.2.6 pointerover イベントを送信するかもしれない

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

    TODO。

  4. targetmouseout.target とします
  5. pointerouttargetdispatch します

5.2.7 pointerenter イベントを送信するかもしれない

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

    TODO。

  4. targetmouseout.target とします
  5. pointerouttargetdispatch します

5.2.8 pointermove イベントを送信するかもしれない

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

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

    編集者注

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

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

    TODO。

  4. targetmouseout.target とします
  5. pointerouttargetdispatch します

5.2.9 pointerdown イベントを送信するかもしれない

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

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

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

    TODO。

  4. targetmouseout.target とします
  5. pointerouttargetdispatch します

5.2.10 pointerrawupdate イベントを送信するかもしれない

  1. mouseout を、対応する mouseout MouseEvent とします
  2. targetmouseout.target とします
  3. pointerouttargetdispatch します

5.2.11 pointerup イベントを送信するかもしれない

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

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

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

    TODO。

  4. targetmouseout.target とします
  5. pointerouttargetdispatch します

5.3 Pointer Event 型

この仕様で定義されるイベント型を以下に示します。

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

5.3.1 pointerover イベント

ユーザーエージェントは、 次のいずれかが発生したとき、ポインターイベントを発火することにより、 pointerover という名前のイベントを発火しなければなりません MUST:

5.3.2 pointerenter イベント

ユーザーエージェントは、 次のいずれかが発生したとき、ポインターイベントを発火することにより、 pointerenter という名前のイベントを発火しなければなりません MUST:

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

5.3.3 pointerdown イベント

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

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

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

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

5.3.4 pointermove イベント

ユーザーエージェントは、 ポインターが、pointerdown または pointerup イベントを発火しないプロパティを 変更したとき、ポインターイベントを発火することにより、 pointermove という名前のイベントを発火しなければなりません MUST。これには、座標、圧力、接線方向圧力、 傾き、twist、接触ジオメトリ(width および height)、または コード化ボタンの任意の変更が含まれます。

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

5.3.5 pointerrawupdate イベント

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

pointermove とは対照的に、 ユーザーエージェントは pointerrawupdate イベントをできるだけ早く、 かつ JavaScript がそのイベントを処理できる頻度で dispatch すべきです SHOULD

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

同じ pointerId を持つ別の pointerrawupdate がすでに存在し、それが イベントループで まだ dispatch されていない場合、ユーザーエージェントは、 新しい pointerrawupdate について新しい タスクを作成する代わりに、 そのイベントと合成してもよい MAY ことに注意してください。 これにより、pointerrawupdate が 合成イベントを持つことがあり、それらはすべて、イベントが イベントループで処理され次第、 1 つの pointerrawupdate イベントの 合成イベントとして配信されます。 詳細については getCoalescedEvents を参照してください。

pointerrawupdatepointermove の順序については、 ユーザーエージェントが、pointerrawupdatepointermove の両方のイベントを引き起こす更新を プラットフォームから受け取った場合、ユーザーエージェントは、 対応する pointermove より前に pointerrawupdate イベントを dispatch しなければなりません MUST

target を除き、最後の pointermove イベント以降に dispatch されたすべての pointerrawupdate イベントの合成イベントリストの連結は、 他のイベント属性に関して、次の pointermove イベントの合成イベントと同じです。 pointerrawupdate の属性は、 cancelable を除き、ほぼ pointermove と同じです。 cancelablepointerrawupdate については false でなければなりません MUST

ユーザーエージェントは、互換性マウスイベントpointerrawupdate について発火すべきではありません SHOULD

注記
pointerrawupdate イベントのリスナーを追加すると、 ユーザーエージェントの実装によっては Web ページのパフォーマンスに悪影響を及ぼす可能性があります。 ほとんどのユースケースでは、他の pointerevent 型で十分なはずです。 pointerrawupdate リスナーは、JavaScript が高頻度イベントを必要とし、それらを同じ速さで処理できる場合にのみ追加すべきです。 そのような場合、おそらく他の型の pointer events をリッスンする必要はありません。

5.3.6 pointerup イベント

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

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

すべての pointerup イベントは pressure0 を持ちます。

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

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

5.3.7 pointercancel イベント

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

pointercancel イベントの次のプロパティの値は、 同じ pointerId を持つ最後に dispatch された pointer event の値と一致しなければなりません MUST: widthheightpressuretangentialPressuretiltXtiltYtwistaltitudeAngleazimuthAnglepointerTypeisPrimary、および [UIEVENTS] から継承された座標。pointercancel イベント内の coalescedEvents および predictedEvents リストは空でなければならず MUST、そのイベントの cancelable 属性は false でなければなりません MUST

5.3.8 pointerout イベント

ユーザーエージェントは、 次のいずれかが発生したとき、ポインターイベントを発火することにより、 pointerout という名前のイベントを発火しなければなりません MUST:

5.3.9 pointerleave イベント

ユーザーエージェントは、 次のいずれかが発生したとき、ポインターイベントを発火することにより、 pointerleave という名前のイベントを発火しなければなりません MUST:

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

5.3.10 gotpointercapture イベント

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

5.3.11 lostpointercapture イベント

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

5.3.12 click, auxclick, および contextmenu イベント

このセクションは、[UIEVENTS] で定義される clickauxclick および contextmenu イベントへの追加です。これらのイベントは通常、ユーザーインターフェイスの アクティベーションに結び付いており、キーボードなどの非ポインター入力デバイスからでも発火されます。

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

5.3.12.1 イベント属性

これらのイベントについては、pointerId および pointerType 以外の、すべての PointerEvent 固有属性 (この仕様で定義されるもの)は、それぞれの既定値を持たなければなりません MUST。さらに:

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

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

5.3.12.3 イベント dispatch

clickauxclick または contextmenu イベントは、 イベントターゲットが下記のアルゴリズムを用いてオーバーライドされる点を除き、[UIEVENTS] 仕様で定義される dispatch プロセスに従わなければなりません MUST:

  1. event を dispatch 中の clickauxclick または contextmenu イベントとし、userEventevent の 発火を引き起こしたユーザー操作イベントとします。

    注記

    イベント userEvent は非 PointerEvent である可能性があります。たとえば、 チェックボックス要素上でスペースバーを押したことによって click イベントの dispatch が 引き起こされる場合、それは KeyboardEvent です。

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

  2. userEventPointerEvent でない場合、event を [UIEVENTS] 仕様に従って、event のターゲットを オーバーライドせずに dispatch し、以下の残りの手順を飛ばします。
  3. target を次のように定義します:

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

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

  4. eventtarget へ、[UIEVENTS] 仕様に従って dispatch します。

    注記
    userEvent がキャプチャされていた場合、同じ lostpointercapture イベント pointerId がすでに dispatch されているとしても、eventuserEvent のキャプチャターゲットへ dispatch されます。

6. Wheel Events

ホイールとは、1 つ以上の空間次元で回転でき、ポインターデバイスと関連付けることができるデバイスです。 座標系は環境構成に依存します。

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

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

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

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

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

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

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

6.1 WheelEvent インターフェイス

WheelEvent インターフェイスは、 wheel イベントに関連付けられた 固有のコンテキスト情報を提供します。 WheelEvent インターフェイスの インスタンスを作成するには、任意の WheelEventInit 辞書を渡して、 WheelEvent コンストラクターを使用します。

6.1.1 WheelEvent

WebIDL[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
デルタの測定単位はピクセルでなければなりません MUST。 これは、ほとんどのオペレーティングシステムおよび実装構成において 最も典型的なケースです。
DOM_DELTA_LINE
デルタの測定単位は、個々のテキスト行でなければなりません MUST。これは多くのフォームコントロールの場合に該当します。
DOM_DELTA_PAGE
デルタの測定単位はページでなければならず MUST、 1 画面として定義される場合も、区切られたページとして定義される場合もあります。
deltaX
wheel イベントの既定の動作がスクロールであるユーザーエージェントでは、この値は、 イベントがキャンセルされない場合にスクロールされる x 軸に沿った測定値 (ピクセル、行、またはページ単位)でなければなりません MUST。 そうでない場合、これはホイールデバイスの x 軸まわりの移動についての 実装固有の測定値(ピクセル、行、またはページ単位)です。 この属性の未初期化値0.0 でなければなりません MUST
deltaY
wheel イベントの既定の動作がスクロールであるユーザーエージェントでは、この値は、 イベントがキャンセルされない場合にスクロールされる y 軸に沿った測定値 (ピクセル、行、またはページ単位)でなければなりません MUST。 そうでない場合、これはホイールデバイスの y 軸まわりの移動についての 実装固有の測定値(ピクセル、行、またはページ単位)です。 この属性の未初期化値0.0 でなければなりません MUST
deltaZ
wheel イベントの既定の動作がスクロールであるユーザーエージェントでは、この値は、 イベントがキャンセルされない場合にスクロールされる z 軸に沿った測定値 (ピクセル、行、またはページ単位)でなければなりません MUST。 そうでない場合、これはホイールデバイスの z 軸まわりの移動についての 実装固有の測定値(ピクセル、行、またはページ単位)です。 この属性の未初期化値0.0 でなければなりません MUST
deltaMode
deltaMode 属性には、デルタ値の測定単位を示す指標が含まれます。 既定値は DOM_DELTA_PIXEL (ピクセル)です。 この属性は、デルタ値の測定単位を 示すために、DOM_DELTA 定数のいずれかに設定されなければなりません MUST。 正確な測定値は、デバイス、オペレーティングシステム、および アプリケーション構成に固有です。 この属性の未初期化値0 でなければなりません MUST
momentum
このイベントが、ユーザーが物理的なスクロール操作を終了した後 (例: フリング後にトラックパッドから指を離した後)にスクロール慣性を シミュレートするためにプラットフォームによって合成された場合、この属性は true でなければならず、そうでない場合は false でなければなりません。 この属性の未初期化値false でなければなりません MUST

6.1.2 WheelEventInit

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

下記の定義は、対応する属性がすでに上で定義されているため、 冗長に思われます。次を参照してください: pointerevents/646

deltaX
deltaZ 属性を参照してください。
deltaY
deltaZ 属性を参照してください。
deltaZ
WheelEvent オブジェクトの deltaZ 属性を初期化します。 この属性(および deltaXdeltaY 属性)の相対的な正の値は、 X、Y、および Z 軸が、それぞれ文書の最も右側の端、最も下側の端、 および最も遠い奥行き(ユーザーから離れる方向)を向く 右手座標系によって与えられます。負の相対値は、それぞれの 反対方向です。
deltaMode
WheelEvent オブジェクト上の deltaMode 属性を、列挙値 0、 1、または 2 へ初期化します。これらは、ホイールの回転がスクロールをもたらす場合に、 スクロールされるピクセル量 (DOM_DELTA_PIXEL)、 スクロールされる行 (DOM_DELTA_LINE)、または スクロールされるページ (DOM_DELTA_PAGE)を 表します。
momentum
momentum 属性を初期化します。

6.2 Wheel Event 型

6.2.1 wheel

wheel
インターフェイス WheelEvent
同期 / 非同期 非同期
バブル はい
信頼済みターゲット Element
キャンセル可能 さまざま
合成 はい
既定の動作 文書をスクロール(またはズーム)する
コンテキスト
(信頼済みイベント)
  • Event.target : 現在の wheel event transaction の要素ターゲット
  • UIEvent.view : Window
  • UIEvent.detail : 0
  • MouseEvent.screenX : ホイールが ポインティングデバイスと関連付けられている場合は、画面上のポインター位置に基づく値、 そうでない場合は 0
  • MouseEvent.screenY : ホイールが ポインティングデバイスと関連付けられている場合は、画面上のポインター位置に基づく値、 そうでない場合は 0
  • MouseEvent.clientX : ホイールが ポインティングデバイスと関連付けられている場合は、ビューポート内のポインター位置に基づく値、 そうでない場合は 0
  • MouseEvent.clientY : ホイールが ポインティングデバイスと関連付けられている場合は、ビューポート内のポインター位置に基づく値、 そうでない場合は 0
  • MouseEvent.altKey : Alt 修飾子が有効であった場合は true、 そうでない場合は false
  • MouseEvent.ctrlKey : Control 修飾子が有効であった場合は true、 そうでない場合は false
  • MouseEvent.shiftKey : Shift 修飾子が有効であった場合は true、 そうでない場合は false
  • MouseEvent.metaKey : Meta 修飾子が有効であった場合は true、 そうでない場合は false
  • MouseEvent.button : ホイールが ポインティングデバイスと関連付けられている場合は、現在押されているボタンに基づく値、 そうでない場合は 0
  • MouseEvent.buttons : ホイールが ポインティングデバイスと関連付けられている場合は、現在押下されているすべてのボタンに 基づく値。押されているボタンがない場合は 0
  • MouseEvent.relatedTarget : ポインティングデバイスが指しているターゲットがあれば、それを示します
  • WheelEvent.deltaX : deltaMode 単位に従ってページが x 軸に沿ってスクロールされると予想される量、または ホイールの x 軸まわりの移動についての実装固有の値
  • WheelEvent.deltaY : deltaMode 単位に従ってページが y 軸に沿ってスクロールされると予想される量、または ホイールの y 軸まわりの移動についての実装固有の値
  • WheelEvent.deltaZ : deltaMode 単位に従ってページが z 軸に沿ってスクロールされると予想される量、または ホイールの z 軸まわりの移動についての実装固有の値
  • WheelEvent.deltaMode : deltaX、deltaY、および deltaZ 属性の単位指標(ピクセル、行、またはページ)
ユーザーエージェントは、 マウスホイールが任意の軸まわりに回転したとき、または同等の入力デバイス (マウスボール、特定のタブレットやタッチパッドなど)がそのような動作を エミュレートしたときに、このイベントを dispatch しなければなりません MUST。プラットフォームおよび入力デバイスによっては、 斜め方向の wheel デルタは、複数の非ゼロ軸を持つ単一の wheel イベントとして配信されてもよく、 または各非ゼロ軸ごとの個別の wheel イベントとして配信されてもよい MAYwheel イベント型の典型的な 既定の動作は、 示された量だけ文書をスクロール(または場合によってはズーム)することです。 このイベントがキャンセルされた場合、実装は文書をスクロールまたはズームしてはならず MUST NOT(またはこのイベント型に関連付けられたその他の 実装固有の既定の動作を実行してはなりません)。
注記

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

6.2.2 wheel events のキャンセル可能性

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

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

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

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

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

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

releasePointerCapture()

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

hasPointerCapture

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

注記
このメソッドは、setPointerCapture() の呼び出し直後に true を返します。ただし、その要素はまだ gotpointercapture イベントを 受け取っていません。その結果、pointerdown イベントリスナーの内部から 暗黙的ポインターキャプチャを検出するのに 役立つ場合があります。

8. GlobalEventHandlers mixin への拡張

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

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 属性です。

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

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

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

getter 手順は次のとおりです:

  1. emulated maxTouchPoints を、 WebDriver BiDi emulated max touch points [WEBDRIVER-BIDI] の結果とします。
  2. emulated maxTouchPoints が null でない場合、 emulated maxTouchPoints を返します。
  3. デバイスがサポートする同時 touch 接触の最大数を返します。 複数のデジタイザーを持つデバイス(例: 複数のタッチスクリーン)の場合、 値は各個別デジタイザーがサポートする最大接触数の集合の最大値でなければなりません MUST

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

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

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

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

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

10.1 touch-action CSS プロパティ

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

touch-action CSS プロパティは、直接 操作インタラクション(プロパティ名にもかかわらず touch に限定されません)が、ユーザーエージェントの パンおよびズーム挙動をトリガーしてもよい MAY かどうかを決定します。 touch-actionに関するセクションを参照してください。

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

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

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

ユーザーが直接操作ポインター(タッチスクリーン上の touch や stylus など)を使用して要素とやり取りするとき、その入力の効果は、 touch-action プロパティの値と、その要素および祖先の既定の直接操作の挙動によって、 次のように決定されます:

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

10.3 touch-action 値の詳細

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

注記
「panning」と「scrolling」という用語は同義とみなされます(より正確には、 「panning」は直接操作入力を使用した「scrolling」です)。パン/スクロールをトリガーする インタラクションまたはジェスチャーや、auto または none 値の挙動を トリガーするための定義は、この仕様の範囲外です。
auto
ユーザーエージェントは、 その要素上で開始される、ビューポートのパンおよびズームに関連する任意の許可された直接操作の挙動を 考慮してもよい MAY です。
none
その要素上で開始される直接操作インタラクションは、ビューポートのパンおよびズームに関連する挙動を トリガーしてはなりません MUST NOT
pan-x
pan-left
pan-right
pan-y
pan-up
pan-down
ユーザーエージェントは、 その要素上で開始される直接操作インタラクションを、列挙されたすべての値によって指定されるいずれかの方向で 開始されるパンの目的でのみ考慮してもよい MAY です。 パンが開始された後は、反対方向に開始されるパンが許可されていない場合でも、ユーザーは方向を反転できます。 これに対し、パンが単一軸に制限されている場合(たとえば pan-x または pan-y)、パン中に軸を変更することはできません。
manipulation
ユーザーエージェントは、 その要素上で開始される直接操作インタラクションを、パンおよび連続的なズーム (pinch-zoom など)の目的でのみ考慮してもよい MAY ですが、 一定時間内に発生しなければならない複数のアクティベーションに依存する、その他の関連する挙動 (double-tap to zoom や、single-finger zoom のための double-tap and hold など)を トリガーしてはなりません MUST NOT
注記
実装で一般的な追加の touch-actionは、[COMPAT] で定義されています。
注記
touch-action プロパティは、CSS の width および height プロパティの両方をサポートする要素にのみ適用されます ([CSS21] を参照)。 この制限は、低遅延直接操作によるパンおよびズームのためのユーザーエージェント最適化を 容易にするよう設計されています。非置換インライン要素である <span> など、 既定でサポートされない要素については、作者は display CSS プロパティを block など、width および height をサポートする値に設定できます。 将来の仕様は、この API をすべての要素へ拡張する可能性があります。
注記

方向固有の pan 値は、一部の overscroll 挙動をカスタマイズするのに有用です。 たとえば、単純な pull-to-refresh 効果を実装するために、文書の touch-action を、スクロール位置が 0 のときは pan-x pan-down に、それ以外の場合は pan-x pan-y に 設定できます。 これにより、pointer event ハンドラーは、文書の先頭から開始する上方向の パン/スクロールの挙動を定義できます。

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

注記
パンおよびズームのための一部の既定の直接操作の挙動を無効にすると、ユーザーエージェントは 他の挙動へより速く応答できる場合があります。たとえば、auto では、ユーザーエージェントは通常、 double-tap ジェスチャーを処理できるように、click の前に 300ms の遅延を追加します。 このような場合、touch-action: none または touch-action: manipulation を明示的に設定すると、この遅延が取り除かれます。 tap または double-tap ジェスチャーを決定する方法は、この仕様の範囲外であることに注意してください。
9: すべての 直接操作の挙動を許可しない
<div style="touch-action: none;">
    この要素は、そうでなければパンまたはズームにつながるすべての直接操作インタラクションについて pointer events を受け取ります。
</div>
10: 水平方向の パンのみを許可する
<div style="touch-action: pan-x;">
    この要素は、水平方向にパンしていないときに pointer events を受け取ります。
</div>
11: パンおよび ズームのための直接操作の挙動を許可しない子領域
<div style="overflow: auto;">
    <div style="touch-action: none;">
        この要素は、そうでなければパンまたはズームにつながるすべての直接操作インタラクションについて pointer events を受け取ります。
    </div>
    <div>
        この要素上の直接操作インタラクションは、親を操作するために消費されてもよい MAY です。
    </div>
</div>
12: パンおよびズームのための直接操作の挙動を許可しない中間親
<div style="overflow: auto;">
    <div style="touch-action: pan-y;">
        <div style="touch-action: pan-x;">
            この要素は、水平パンのみを許可している一方で、中間祖先
            (それとスクロール可能要素の間にあるもの)が垂直パンのみを許可しているため、
            すべての直接操作インタラクションについて pointer events を受け取ります。
            したがって、パン/ズームのための直接操作の挙動は、
            ユーザーエージェントによって処理されません。
        </div>
    </div>
</div>
13: パンおよびズームのために許可される直接操作の挙動を制限する中間親
<div style="overflow: auto;">
    <div style="touch-action: pan-y pan-left;">
        <div style="touch-action: pan-x;">
            この要素は、左方向にパンしていないときに pointer events を受け取ります。
        </div>
    </div>
</div>

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

11.1 序論

このセクションは非規範的です。

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

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

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

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

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

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

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

  1. メソッドの引数として提供された pointerId が いずれのアクティブポインターにも一致せず、かつ これらの手順がポインターキャプチャの暗黙的解放の結果として 呼び出されているのでもない場合、"NotFoundError" DOMException投げます
  2. 指定された pointerId を持つ Element について hasPointerCapture が false である場合、 これらの手順を終了します。
  3. 指定された pointerId について、 保留中のポインターキャプチャターゲット オーバーライドが設定されていれば、それをクリアします。
注記
ポインターキャプチャの設定セクションの注記を参照してください。

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

パンおよびズームのための直接操作インタラクションを実装する入力 (タッチスクリーン上の touch や stylus など)は、任意の pointerdown リスナーの呼び出し直前に、 ターゲット要素上で setPointerCapture が呼び出されたかのように 正確に振る舞うべきです SHOULD。これが発生したかどうかを判断するために、 hasPointerCapture API を使用できます (たとえば、pointerdown リスナー内で)。 次の pointer event が発火される前に、そのポインターについて releasePointerCapture が呼び出されない場合、 キャプチャがアクティブであることを示す gotpointercapture イベントが(通常どおり)ターゲットへ dispatch されます。

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

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

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

ポインターキャプチャターゲットオーバーライドが もはや 接続済み [DOM] でなくなった場合、 ポインターキャプチャターゲットオーバーライドは document に設定されるべきです SHOULD

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

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

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

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

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

12.1 合成イベント

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

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

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

注記
信頼済みの親イベントは合成イベントの概要または集約であるため、開発者は親イベントか すべての合成イベントのいずれかのみを処理すればよく、両方を処理する必要はないはずです。
注記
合成イベントリストを含む 信頼済みイベントが JavaScript から再 dispatch された場合、イベント dispatch アルゴリズムは イベントの isTrusted ビットを false に設定しますが、合成 イベントリスト内の同じビットは、元の true 値のまま変更されません。

信頼済みイベントの合成イベントリスト内のイベントは、次を持ちます:

14: 合成イベントリストを使用する基本的な canvas 描画アプリケーション
<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); // すべての raw/未合成点を描画
            }
        } else {
            paint(e); // 最終的な合成点を描画
        }
    });

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

</script>
注記
PointerEvent の属性は、合成イベントリスト内のイベントを最もよく表す方法で初期化されます。 ユーザーエージェントがこれを行う具体的な方法は、この仕様では扱いません。

これらの dispatch されたイベントすべての順序は、元のイベントの実際の順序と一致しなければなりません MUST。 たとえば、pointerdown イベントが 合成された pointermove イベントの dispatch を引き起こす場合、 ユーザーエージェントは、まずその pointerId の すべての合成イベントを含む 1 つの pointermove イベントを dispatch し、その後に pointerdown イベントを dispatch しなければなりません MUST

注記

以下は、増加する timeStamp 値を持って 実際に発生するイベントと、ユーザーエージェントによって dispatch されるイベントの例です:

実際のイベント dispatch されるイベント
pointer(pointerId=2) 座標変更 pointerrawupdatepointerId=2)、 1 つの合成イベント付き
pointer(pointerId=1) 座標変更 pointerrawupdatepointerId=1)、 1 つの合成イベント付き
pointer(pointerId=2) 座標変更 pointerrawupdatepointerId=2)、 1 つの合成イベント付き
pointer(pointerId=2) 座標変更 pointerrawupdatepointerId=2)、 1 つの合成イベント付き
pointer(pointerId=1) 座標変更 pointerrawupdatepointerId=1)、 1 つの合成イベント付き
pointer(pointerId=2) 座標変更 pointerrawupdatepointerId=2)、 1 つの合成イベント付き
pointer(pointerId=1)ボタン 押下 pointermovepointerId=1)、 2 つの合成イベント付き
pointermovepointerId=2)、 4 つの合成イベント付き
pointerdownpointerId=1)、 合成イベント 0 個
pointer(pointerId=2) 座標変更 pointerrawupdatepointerId=2)、 1 つの合成イベント付き
pointer(pointerId=2) 座標変更 pointerrawupdatepointerId=2)、 1 つの合成イベント付き
pointer(pointerId=1)ボタン 解放 pointermovepointerId=2)、 2 つの合成イベント付き
pointeruppointerId=1)、 合成イベント 0 個

12.2 予測イベント

一部のユーザーエージェントには、一連の確認済みポインター移動の後で、将来のポインター移動の位置が どうなるかを(現在のジェスチャーに対する先行イベント、および移動の速度/軌跡に基づいて)予測できる 組み込みアルゴリズムがあります。アプリケーションは、この情報を getPredictedEvents メソッドとともに使用して、 体感レイテンシーを低減するために予測位置へ投機的に「先描き」し、実際の点を受け取ったらそれらの 予測点を破棄できます。

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

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

注記

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

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

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

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

注記

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

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

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

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

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

  1. イベントの pointerId pointerTypeisPrimary および isTrusted を、「親」 pointer event のそれぞれのプロパティと一致するように設定します。
  2. イベントの cancelable および bubbles を false に設定します (これらのイベントが単独で dispatch されることはないため)。
  3. イベントの合成イベントリストおよび予測イベントリストを空のリストに設定します。
  4. その他すべての属性を、既定の PointerEvent 値へ初期化します。

信頼済みの PointerEventtarget が変更されたとき、 ユーザーエージェントは、合成イベントリストおよび予測イベントリスト内の各イベントについて、次を実行すべきです SHOULD:

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

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

今日存在する Web コンテンツの大多数は、Mouse Events のみに対してコードを書いています。以下では、このような コンテンツとの互換性のために、ユーザー エージェントが汎用ポインター入力をマウスイベントへどのようにマップしてもよいか MAY についてのアルゴリズムを説明します。

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

注記

高いレベルでは、互換性マウスイベントはそれぞれ対応する pointer event と「交互に挟まれる」ことが意図されています。 しかし、この具体的な順序は必須ではなく、互換性マウスイベントを実装するユーザーエージェントは、 その相対的な順序が一貫している限り、マウスイベントの dispatch を遅延またはグループ化することを 決定してもよい MAY です。

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

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

注記

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

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

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

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

マウスイベントは、ポインターが押下状態にあるときにのみ防止できます。ホバー中のポインター(例: ボタンが押されていない マウス)は、そのマウスイベントを防止できません。

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

pointer event の EventListenerpassive [DOM] に 設定されている場合、互換性マウスイベントは防止できません。

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

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

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

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

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

10 同時のマウスポインター(白いカーソル)と touch ポインター(白い「手」カーソル)によって、単一の レガシーマウス入力(オレンジ色のカーソル)が 2 つのポインターの間を移動する。

このアニメーションでは、マウスクリックと touch tap の間の時間帯に注意してください。Button 1 は pointerout イベントを受け取りません(この期間内に「実際の」マウスポインターがボタンの矩形から 離れていないため)が、touch tap で レガシーマウスポインターの実効位置が Button 2 へ移動したとき、Button 1 は mouseout イベントを受け取ります。同様に、touch tap とマウスが Button 1 を離れる直前までの時間帯では、同じ理由で Button 1 は pointerover イベントを受け取りませんが、レガシーマウスポインターの実効位置が Button 1 の内部へ戻ったとき、Button 1 は mouseover イベントを受け取ります。

13.2 hover をサポートする デバイスのためのマッピング

ユーザーエージェントが hover をサポートするデバイスについて pointer event を dispatch するときは常に、次の手順を 実行すべきです SHOULD:

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

13.3 hover を サポートしないデバイスのためのマッピング

ほとんどのタッチスクリーンなど、一部のデバイスは、アクティブ状態でない間に座標(または座標の集合)を hover することを サポートしません。マウスイベントに対して書かれた既存コンテンツの多くは、マウスがイベントを生成していると仮定しており、 したがって特定の性質が一般に true であると仮定します:

注記
Hover は、マウス向けに設計されたコンテンツで UI 要素の可視性を切り替えるために使用されることがあります (例: 「hover menus」)。このようなコンテンツは、hover をサポートしないデバイスとは互換性がないことが よくあります。この仕様は、このシナリオとの互換性のためのマッピングや挙動を定義しません。これは仕様の将来版で 検討されます。

これにより、ユーザーエージェントはこれらの種類の入力デバイスに対して異なるマッピングを提供する必要があります。 ユーザーエージェントが hover をサポートしないデバイスについて pointer event を dispatch するときは常に、次の手順を実行すべきです SHOULD:

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

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

注記

hover をサポートしないプライマリポインター (例: タッチスクリーン上の 1 本の指)による要素のアクティベーション(click)は、通常、 次のイベントシーケンスを生成します:

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

しかし、このインタラクション中に pointerdown イベントの キャンセル済みフラグが 設定された場合、イベントシーケンスは次のようになります:

  1. mousemove
  2. pointerover
  3. pointerenter
  4. mouseover
  5. mouseenter
  6. pointerdown
  7. ポインターの移動に応じて、0 個以上の pointermove イベント
  8. pointerup
  9. pointerout
  10. pointerleave
  11. mouseout
  12. mouseleave
  13. click

14. セキュリティとプライバシーの 考慮事項

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

この仕様で定義されるイベント型の多くは、ユーザー操作に応じて dispatch されます。これにより、悪意のある イベントリスナーが、ユーザーが通常は機密と考える情報、たとえばユーザーがページとやり取りしている間の マウス/stylus/指の正確な経路/移動へアクセスできるようになります。

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

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

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

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

これらの考慮事項を超えて、ワーキンググループは、この仕様が次のとおりであると考えています:

15. 用語集

このセクションは非規範的です。

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

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

対照的に、pointerIdpointerTypeisPrimary、および [UIEVENTS] Mouse Event モデルのプロパティ buttonbuttonsctrlKeyshiftKeyaltKey、 および metaKey は、センサーデータに関連しないため、測定可能なプロパティとはみなされません。

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

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 であってもよい MAY です。
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 であってもよい MAY です。

A. 謝辞

提案や推奨を寄せてくださった多くの方々に深く感謝します。その一部はこの文書に取り込まれています。 グループの Chair は、以下の過去および現在のグループメンバーと参加者からの貢献に感謝します: 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.

過去に mouse および wheel events を扱った方々に感謝します: Gary Kacmarcik, Travis Leithead, and the 長年にわたる さまざまな貢献者

このモデルの初版を先導する手助けをしてくださった方々に特別な感謝を捧げます。特に: Charu Chandiram, Peter Freiling, Nathan Furtwangler, Thomas Olsen, Matt Rakow, Ramu Ramanathan, Justin Rogers, Jacob Rossi, Reed Townsend and Steve Wright.

B. 改訂履歴

このセクションは非規範的です。

以下は、[PointerEvents3] 仕様に対する、 この仕様の公開間における実質的および主要な編集上の変更の参考用要約です。 この仕様の Editor's Drafts の完全な改訂履歴を参照してください。

C. IDL 索引

WebIDL[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 MouseEventInit : EventModifierInit {
	long screenX = 0;
	long screenY = 0;
	long clientX = 0;
	long clientY = 0;

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

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

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

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

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

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 Overflow Module Level 3. Elika Etemad; Florian Rivoal. W3C. 2025年10月7日. W3C 作業草案. URL: https://www.w3.org/TR/css-overflow-3/
[css-position]
CSS Positioned Layout Module Level 3. Elika Etemad; Tab Atkins Jr. W3C. 2025年10月7日. W3C 作業草案. URL: https://www.w3.org/TR/css-position-3/
[CSS21]
カスケーディングスタイルシート Level 2 Revision 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 Module. Simon Fraser; Emilio Cobos Álvarez. W3C. 2025年9月16日. W3C 作業草案. URL: https://www.w3.org/TR/cssom-view-1/
[DOM]
DOM Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript 言語仕様. Ecma International. URL: https://tc39.es/ecma262/multipage/
[HTML]
HTML Standard. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. Living Standard. 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 Standard. Anne van Kesteren; Domenic Denicola. WHATWG. Living Standard. URL: https://infra.spec.whatwg.org/
[PointerEvents]
Pointer Events. Patrick Lauke; Robert Flack. W3C. 2026年6月16日. W3C 作業草案. URL: https://www.w3.org/TR/pointerevents4/
[PointerLock]
Pointer Lock 2.0. Mustaq Ahmed; Vincent Scheib. W3C. 2026年2月25日. W3C 作業草案. URL: https://www.w3.org/TR/pointerlock-2/
[RFC2119]
RFCにおいて要件レベルを示すために用いる キーワード. S. Bradner. IETF. 1997年3月. 現行最良慣行. URL: https://www.rfc-editor.org/info/rfc2119/
[RFC8174]
RFC 2119 キーワードにおける大文字と小文字の 曖昧性. B. Leiba. IETF. 2017年5月. 現行最良慣行. URL: https://www.rfc-editor.org/info/rfc8174/
[TOUCH-EVENTS]
Touch Events. Doug Schepers; Sangwhan Moon; Matt Brubeck; Arthur Barstow. W3C. 2013年10月10日. W3C 勧告. URL: https://www.w3.org/TR/touch-events/
[UIEVENTS]
UI Events. Xiaoqian Wu. W3C. 2026年2月21日. W3C 作業草案. URL: https://www.w3.org/TR/uievents/
[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年6月29日. W3C 作業草案. URL: https://www.w3.org/TR/webdriver-bidi/
[WEBIDL]
Web IDL Standard. Edgar Chen; Timothy Gu. WHATWG. Living Standard. URL: https://webidl.spec.whatwg.org/

D.2 参考参照

[COMPAT]
互換性標準. Mike Taylor. WHATWG. Living Standard. URL: https://compat.spec.whatwg.org/
[PointerEvents3]
Pointer Events. Patrick Lauke; Robert Flack. W3C. 2026年6月30日. W3C 勧告. URL: https://www.w3.org/TR/pointerevents3/
[WCAG22]
Webコンテンツアクセシビリティガイドライン (WCAG) 2.2. Michael Cooper; Andrew Kirkpatrick; Alastair Campbell; Rachael Bradley Montgomery; Charles Adams. W3C. 2024年12月12日. W3C 勧告. URL: https://www.w3.org/TR/WCAG22/