ポインターイベント

レベル 4

W3C 作業草案

この文書の詳細情報
このバージョン:
https://www.w3.org/TR/2026/WD-pointerevents4-20260225/
最新の公開バージョン:
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/pointerevents2
編集者:
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およびWheelイベント、さらに他のポインタデバイスタイプに対してMouseイベントを発火させるマッピングも定義しています。

この文書の位置付け

このセクションは、この 文書が公開された時点でのステータスを説明します。最新のW3C 公開文書およびこの技術レポートの最新版は、 W3C 規格・ドラフト一覧 で確認できます。

本仕様は [PointerEvents3] 仕様の更新版です。また以前は [UIEVENTS] 仕様にあった Mouse および Wheel イベントも含みます。

この改訂には新機能が含まれています:

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

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

本文書はドラフトであり、いつでも更新、置き換え、または他の文書によって廃止されることがあります。他のものとして引用するのは適切ではなく、「作業中の文書」としてのみ扱ってください。

この文書は、 W3C 特許 ポリシー の下で活動するグループによって作成された。 W3C は、 グループの成果物に関連して行われたあらゆる特許開示の 公開リスト を維持している。そのページには、特許を開示するための手順も含まれる。特許についての実際の知識を有し、かつその特許が エッセンシャル・クレーム(Essential Claim(s)) を含むと当人が信じる場合、その個人は W3C 特許ポリシーの第 6 節 に従って当該情報を開示しなければならない。

本文書は 2025年8月18日 W3Cプロセス文書に従って運用されています。

1. はじめに

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

今日のほとんどの[HTML]コンテンツはマウス入力で使用・設計されています。カスタムな方法で入力を処理するものは、たいてい[UIEVENTS]マウスイベント用にコーディングされています。しかし、近年のコンピュータデバイスは、タッチスクリーンやペン入力を含む他の入力形式も取り入れています。これら個別の入力形式を扱うためのイベントタイプも提案されてきましたが、その手法では新たな入力タイプのサポート追加時にロジックやイベントハンドリングが重複しがちで、不要なオーバーヘッドが発生します。コンテンツが1つのデバイスタイプのみを想定して書かれた場合、これが互換性問題となることも多いです。さらに既存のマウスベースのコンテンツとの互換のため、ほとんどのユーザーエージェントは全ての入力タイプに対してマウスイベントを発火します。これにより、マウスイベントが実際のマウスデバイスによるものか、互換性のため他の入力タイプから生成されたものか曖昧になり、両方のデバイスタイプに対応したコードを書くのが困難になります。

複数の入力タイプへの対応コスト低減や、マウスイベントが持つ上記の曖昧さ解決のため、本仕様はポインターと呼ばれる、より抽象的な入力モデルを定義します。ポインターは、マウスカーソル、ペン、タッチ(マルチタッチ含む)、その他の指す入力デバイスによるスクリーン上の任意の接触点を示します。このモデルにより、ユーザーがどんなハードウェアを持っていても正常に動作するサイトやアプリケーションが作成しやすくなります。デバイス固有の処理が必要なシナリオ向けに、どのデバイスタイプからイベントが生成されたかを調べるプロパティも定義されています。主な目的は、クロスデバイスポインタ入力対応のための、より簡単な記述を可能にする単一のイベント・インターフェース群を提供しつつ、拡張的な体験のために必要に応じてデバイス固有処理も許容することです。

さらに重要な目的として、ユーザーエージェントがマルチスレッドでダイレクト操作(例えば、指やスタイラスによるパンやズーム)をスクリプト実行でブロックすることなく処理できるようにする点も挙げられます。

注記

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

まずはfocusblurclickといった高レベルイベントに対応することで、あらゆる入力形式で等価な機能を提供することが推奨されます。ただし、Pointer Eventsなど低レベルイベントを使う場合は、全ての入力タイプがサポートされていることを確認してください。キーボードやその類似インターフェースの場合、明示的にキーボードイベント処理を追加する必要があるかもしれません。詳しくはキーボード対応 [WCAG22]を参照してください。

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

汎用的なポインター入力を扱うイベントはマウスのものと非常によく似ています:pointerdownpointermovepointeruppointeroverpointeroutなどです。これにより、マウスイベントからポインターイベントへのコンテンツ移行が容易になります。 Pointer Eventsは、クライアント座標・ターゲット要素・ボタン状態などマウスイベントが持つ従来プロパティに加え、圧力・接触幾何・傾きなど他の入力形式向けの新しいプロパティも提供します。著者は入力タイプ間でロジックを共有しつつ、必要な場合のみ特定の入力種に特化した処理を記述できます。

Pointer Eventsは様々な入力デバイスから発生しますが、他のデバイス固有イベントから生成されるものとは定義されません。互換性確保のため、他イベントからの変換も可能かつ推奨ですが、この仕様は他デバイス固有イベント(マウス・タッチイベント等)のサポートを必須とはしません。ユーザーエージェントが他のデバイスイベントを一切サポートせずpointer eventsのみ持つことも可能です。マウス固有イベント向けのコンテンツ互換のため、本仕様はオプションで、マウス以外のデバイス入力より 互換マウスイベントを生成する方法も記述します。

注記

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

2. 適合性

非規範的と明記されたセクションと同様に、本仕様に含まれるすべてのオーサリングガイドライン、図、例、注記は非規範的である。それ以外の本仕様の内容は規範的である。

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

3.

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

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

1: 機能検出とイベントのバインディング
/* Bind to either Pointer Events or traditional touch/mouse */

if (window.PointerEvent) {
    // if Pointer Events are supported, only listen to pointer events
    target.addEventListener("pointerdown", function(e) {
        // if necessary, apply separate logic based on e.pointerType
        // for different touch/pen/mouse behavior
        ...
    });
    ...
} else {
    // traditional touch/mouse event handlers
    target.addEventListener('touchstart', function(e) {
        // prevent compatibility mouse events and click
        e.preventDefault();
        ...
    });
    ...
    target.addEventListener('mousedown', ...);
    ...
}

// additional event listeners for keyboard handling
...
2: ユーザーからの入力の種類を検出する
window.addEventListener("pointerdown", detectInputType);

function detectInputType(event) {
    switch(event.pointerType) {
        case "mouse":
            /* mouse input detected */
            break;
        case "pen":
            /* pen/stylus input detected */
            break;
        case "touch":
            /* touch input detected */
            break;
        default:
            /* pointerType is empty (could not be detected)
            or UA-specific custom type */
    }
}
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;
    // Check if a unique Id exists.
    if (uniqueId == 0) {
        return;
    }
    // Check if a color has been assigned to the device.
    if (map.has(uniqueId)) {
        return;
    }
    // Assign a color to the device.
    let newColor = getNewColor();
    map.set(uniqueId, newColor);
    return newColor;
}

function getNewColor() {
    /* return some color value */
}
</script>

4. Mouseイベント

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

4.1 インターフェース MouseEvent

DOM Level 2 で導入され、本仕様で修正された。

MouseEvent インターフェースは、Mouseイベントに関連する特定の文脈情報を提供する。

ネストされた要素の場合、mouseイベントは常に最も深くネストされた要素をターゲットとする。

注記

ターゲットとなった要素の祖先は、イベントバブリングを用いることで、子孫要素内で発生するmouseイベントの通知を取得できる。

MouseEvent インターフェースのインスタンスを作成するには、 MouseEvent コンストラクターを使用し、任意の MouseEventInit ディクショナリを渡す。

注記

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

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

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

この属性の 未初期化値MUST 0 でなければならない。

screenY

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

この属性の 未初期化値MUST 0 でなければならない。

clientX

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

この属性の 未初期化値MUST 0 でなければならない。

clientY

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

この属性の 未初期化値MUST 0 でなければならない。

layerX

最も近い 祖先 要素(それがスタッキングコンテキストである、positionedである、または スタッキングコンテキストを描画する際に positioned フェーズで描画される)からの水平オフセット。

この属性の 未初期化値MUST 0 でなければならない。

layerY

最も近い 祖先 要素(それがスタッキングコンテキストである、positionedである、または スタッキングコンテキストを描画する際に positioned フェーズで描画される)からの垂直オフセット。

この属性の 未初期化値MUST 0 でなければならない。

ctrlKey

KeyboardEventctrlKey 属性を参照。

この属性の 未初期化値MUST false でなければならない。

shiftKey

KeyboardEventshiftKey 属性を参照。

この属性の 未初期化値MUST false でなければならない。

altKey

KeyboardEventaltKey 属性を参照。

この属性の 未初期化値MUST false でなければならない。

metaKey

KeyboardEventmetaKey 属性を参照。

この属性の 未初期化値MUST false でなければならない。

button

マウスボタンの押下または解放によって引き起こされるmouseイベントの間、button は、どのポインタデバイスのボタンが状態を変更したかを示すために MUST 使用されなければならない。

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

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

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

注記

button の値は、マウスボタンの押下/解放によって引き起こされないイベントでは更新されない。これらのシナリオでは、値 0 を左ボタンとして解釈せず、デフォルト値として扱うよう注意すること。

注記

mousedownmouseup などのイベントに関連する一部の デフォルト動作 は、使用中の特定のマウスボタンに依存する。

この属性の 未初期化値MUST 0 でなければならない。

buttons

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

注記

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

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

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

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

注記

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

注記

mousedownmouseup などのイベントに関連する一部の デフォルト動作 は、使用中の特定のマウスボタンに依存する。

この属性の 未初期化値MUST 0 でなければならない。

relatedTarget

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

この属性の 未初期化値MUST null でなければならない。

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 属性を、ユーザーのスクリーン上におけるマウスポインタの望ましい水平相対位置に、MouseEvent オブジェクト内で初期化する。

与えられたマウス位置でイベントオブジェクトを初期化しても、ユーザーのマウスポインタを初期化位置へ移動させてはならない。

screenY

screenY 属性を、ユーザーのスクリーン上におけるマウスポインタの望ましい垂直相対位置に、MouseEvent オブジェクト内で初期化する。

与えられたマウス位置でイベントオブジェクトを初期化しても、ユーザーのマウスポインタを初期化位置へ移動させてはならない。

clientX

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

与えられたマウス位置でイベントオブジェクトを初期化しても、ユーザーのマウスポインタを初期化位置へ移動させてはならない。

clientY

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

与えられたマウス位置でイベントオブジェクトを初期化しても、ユーザーのマウスポインタを初期化位置へ移動させてはならない。

button

button 属性を、マウスのボタンの望ましい状態を表す数値として、MouseEvent オブジェクト内で初期化する。

注記

値 0 は主マウスボタンを表すために使用され、1 は補助/中央マウスボタンを表すために使用され、2 は右マウスボタンを表すために使用される。2 より大きい数値も可能だが、本書では規定しない。

buttons

buttons 属性を、アクティブとみなされるマウスのボタンのうちの 1つ以上 を表す数値として、MouseEvent オブジェクト内で初期化する。

注記

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

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

{ buttons: 2 | 4 }

または:

{ buttons: 6 }
relatedTarget

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

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

4.2 MouseEvent アルゴリズム

4.2.1 ネイティブ OS 要件

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

  • マウスが移動したときのイベント(handle native mouse move により処理される)
  • マウスボタンが押下されたときのイベント(handle native mouse down により処理される)
  • マウスボタンが解放されたときのイベント(handle native mouse up により処理される)
  • マウスボタン押下が「クリック」と解釈されるべきタイミングを識別する方法(handle native mouse click により処理される)
    • 例えば、フラグとして、または別個のイベントとして
    • 別個の「click」イベントが発火される場合、ネイティブ OS は対応する「mouse up」イベントの直後に、間にマウス関連イベントを挟まずにそれを発火する
  • マウスクリックが「ダブルクリック」であるタイミングを識別する方法(handle native mouse double click により処理される)

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

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

4.2.2 Mouse Events の構築

警告

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

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

MouseEvent(または、以下のアルゴリズムを用いてそれらから派生したオブジェクト)を構築する目的において、すべての MouseEvent および派生オブジェクトは、internal key modifier state を持つ。これは、[UIEvents-Key] の Modifier Keys table で記述される key modifier names を用いて、設定および取得できる。

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

  • 構築される EventMouseEvent オブジェクト、またはそれから派生したオブジェクトであり、かつコンストラクターに EventModifierInit 引数が提供された場合、次のサブステップを実行する:
    • EventModifierInit 引数について、ディクショナリメンバーが文字列 "modifier" で始まるなら、key modifier name を、接頭辞 "modifier" を除いたディクショナリメンバー名とし、Event オブジェクトの internal key modifier state のうち、その key modifier name に一致するものを、対応する値に設定する。

4.2.3 MouseEvent のグローバル状態

警告

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

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

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

マウスボタンの現在状態を追跡する mouse button bitmask

4.2.3.2 ウィンドウレベルの状態

UA は、ウィンドウで共有される次の値を維持しなければならない。

last mouse element 値(初期状態は未定義)。これは、MouseEvent を送信した最後の Element を追跡する。

last mouse DOM path 値(初期状態は空)。これは、直近のmouseイベントが送信された時点における last mouse element の祖先 Element 群のスナップショットを含む。

4.2.4 MouseEvent の内部状態

警告

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

MouseEvent は、各種修飾キーの状態を追跡するために用いられる次の内部フラグを持つ: shift flagcontrol flagalt flagaltgraph flag、 および meta flag。 これらのフラグは、mouseイベント発生時点で対応する修飾キーが押下されていた場合に設定される。

4.2.5 hit test

警告

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

  1. pos を、ビューポートに対する相対 x,y 座標とする
  2. [CSSOM-View] の elementFromPoint()pos で呼び出した結果(pos における最前面の DOM 要素)を返す
    注記

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

4.2.6 MouseEvent を初期化する

警告

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

eventeventTypeeventTargetbubbles、および cancelable を用いて initialize a MouseEvent を行うには、次の手順を実行する:

  1. eventeventTypeeventTargetbubbles、および cancelable を用いて UIEvent を初期化する。
  2. event.screenX を、デスクトップの原点に対する相対位置として、イベントが発生した位置の x 座標に設定する
  3. event.screenY を、デスクトップの原点に対する相対位置として、イベントが発生した位置の y 座標に設定する
  4. event.clientX を、viewport の原点に対する相対位置として、イベントが発生した位置の x 座標に設定する
  5. event.clientY を、viewport の原点に対する相対位置として、イベントが発生した位置の y 座標に設定する
  6. Set mouse event modifiersevent に対して実行する
  7. event.button を 0 に設定する
  8. event.buttonsmouse button bitmask に設定する
  9. event に対して MouseEvent の PointerLock 属性を初期化する
    Issue 1

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

4.2.7 set mouse event modifiers

警告

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

  1. 更新対象の MouseEventevent とする
  2. key modifier state に "Shift" が含まれる場合、eventshift flag を設定し、それ以外の場合は解除する
  3. key modifier state に "Control" が含まれる場合、eventcontrol flag を設定し、それ以外の場合は解除する
  4. key modifier state に "Alt" が含まれる場合、eventalt flag を設定し、それ以外の場合は解除する
  5. key modifier state に "AltGraph" が含まれる場合、eventaltgraph flag を設定し、それ以外の場合は解除する
  6. key modifier state に "Meta" が含まれる場合、eventmeta flag を設定し、それ以外の場合は解除する
  7. event.shiftKey を、イベントの shift flag が設定されている場合は true、そうでない場合は false に設定する
  8. event.ctrlKey を、イベントの control flag が設定されている場合は true、そうでない場合は false に設定する
  9. event.altKey を、イベントの alt flag または altgraph flag が設定されている場合は true、そうでない場合は false に設定する
  10. event.metaKey を、イベントの meta flag が設定されている場合は true、そうでない場合は false に設定する

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

警告

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

  1. eventType を、有効な MouseEvent 型を含む DOMString とする
  2. eventTarget を、イベントの EventTarget とする
  3. bubbles を true とする
  4. cancelable を true とする
  5. creating an event を用いて MouseEvent により作成した結果を event とする
  6. Initialize a MouseEventeventeventTypeeventTargetbubbles、および cancelable で行う。
  7. event を返す

4.2.9 キャンセル不可の MouseEvent を作成する

警告

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

  1. eventType を、有効な MouseEvent 型を含む DOMString とする
  2. eventTarget を、イベントの EventTarget とする
  3. bubbles を "false" とする
  4. cancelable を "false" とする
  5. creating an event を用いて MouseEvent により作成した結果を event とする
  6. Initialize a MouseEventeventeventTypeeventTargetbubbles、および cancelable で行う。
  7. event を返す

4.2.10 MouseEvent の button 属性を算出する

警告

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

これは、MouseEventbutton 属性に格納するのに適した button 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. 初期化対象の MouseEventevent とする
  2. native をネイティブのマウスイベントとする
    編集者注

    TODO。

  3. event.type が [ mousedown, mouseup ] のいずれかなら、
    1. native から、どのマウスボタンが押下されたかを識別する ID を mbutton とする
    2. event.button を、 mbutton に対して calculate MouseEvent button attribute を行った結果に設定する

4.2.12 handle native mouse down

警告

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

  1. native をネイティブ mousedown とする
  2. native から、どのマウスボタンが押下されたかを識別する ID を mbutton とする
  3. mouse button bitmask を次のとおり更新する:
    1. mbutton が主マウスボタンなら、0x01 ビットを設定する
    2. mbutton が副マウスボタンなら、0x02 ビットを設定する
    3. mbutton が補助(中央)マウスボタンなら、0x04 ビットを設定する
      注記

      他のボタンは 0x08 から追加できる。

  4. native のビューポート相対座標を用いて hit test を行った結果を target とする
  5. "mousedown" と targetcreating a cancelable MouseEvent を行った結果を event とする
  6. native に対して Set MouseEvent attributes from native を行う
  7. event に対して Maybe send pointerdown event を行う
  8. dispatch により targetevent をディスパッチした結果を result とする
  9. result が true であり、かつ targetfocusable area であり、かつ click focusable であるなら、
    1. targetfocusing steps を実行する
  10. mbutton が副マウスボタンなら、
    1. nativetarget に対して Maybe show context menu を行う

4.2.13 handle native mouse up

警告

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

  1. native をネイティブ mouseup とする
    注記

    mousedown と mouseup の間に、他のmouseイベントが発生することがある。

  2. native から、どのマウスボタンが押下されたかを識別する ID を mbutton とする
  3. mouse button bitmask を次のとおり更新する:
    1. mbutton が主マウスボタンなら、0x01 ビットをクリアする
    2. mbutton が副マウスボタンなら、0x02 ビットをクリアする
    3. mbutton が補助(中央)マウスボタンなら、0x04 ビットをクリアする
  4. native のビューポート相対座標を用いて hit test を行った結果を target とする
  5. "mouseup" と targetcreating a cancelable MouseEvent を行った結果を event とする
  6. native に対して Set MouseEvent attributes from native を行う
  7. event に対して Maybe send pointerup event を行う
  8. dispatch により targetevent をディスパッチする

4.2.14 handle native mouse click

警告

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

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

    プラットフォームは、クリックを生成する mouseup に対して、handle native mouse up の直後にこれを呼び出すべきである。

  2. native のビューポート相対座標を用いて hit test を行った結果を target とする
  3. nativetargetSend click event を行う。

4.2.15 send click event

警告

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

  1. native をネイティブ mousedown とする
  2. target を、イベントの EventTarget とする
  3. mbutton を 1(既定では主マウスボタン)とする
  4. native が有効なら、
    1. native から、どのマウスボタンが押下されたかを識別する ID を mbutton とする
  5. mbutton が主マウスボタンなら eventType を "click" に、そうでなければ "auxclick" に設定する
  6. eventTypetargetcreating a PointerEvent を行った結果を event とする
  7. native が有効なら、
    1. eventnativeSet MouseEvent attributes from native を行う
    2. event.screenX が整数値でないなら、丸める。
    3. event.screenY が整数値でないなら、丸める。
  8. dispatch により targetevent をディスパッチする
    注記

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

    編集者注

    いかなる「default action」も、ターゲットに対する activation behavior アルゴリズムをトリガーすることで、ディスパッチ中に処理される。したがって、ここでそれを扱う必要はない。 ただし、既存の仕様が disabled/css-pointer-events/inert/... を処理することを検証する必要がある。

    注記

    HTMLelement.click() を扱うには、このアルゴリズムを native = null、target = HTMLelement で呼び出す。

    注記

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

4.2.16 handle native mouse double click

警告

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

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

    これは、ダブルクリックを生成する mouse click に対して、handle native mouse click の直後に呼び出されるべきである。

  2. native から、どのマウスボタンが押下されたかを識別する ID を mbutton とする
  3. mbutton が主マウスボタンでないなら、return
  4. native のビューポート相対座標を用いて hit test を行った結果を target とする
  5. "dblclick" と targetcreating a PointerEvent を行った結果を event とする
  6. eventnativeSet MouseEvent attributes from native を行う
  7. event.screenX が整数値でないなら、丸める。
  8. event.screenY が整数値でないなら、丸める。
  9. dispatch により targetevent をディスパッチする

4.2.17 handle native mouse move

警告

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

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

    このアルゴリズムは PointerEvents のディスパッチに関して、現時点で明示的に規定されていない前提を置いている。pointerevents/285 が 解決されたら、更新が必要になるかもしれない。

  2. native のビューポート相対座標を用いて hit test を行った結果を target とする
  3. targetinclusive ancestorstargetDomPath とする
  4. 現在の要素から離れるためのイベントを生成する:
    1. last mouse element が定義されており、かつ target と等しくないなら、
      1. "mouseout" と last mouse elementcreating a cancelable MouseEvent を行った結果を mouseout とする
        編集者注

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

    2. mouseoutMaybe send pointerout event を行う
    3. Dispatch により targetmouseout をディスパッチする
      注記

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

    4. last mouse DOM path のコピーから targetDomPath と共通の全要素を削除したものを leaveElements とする。
    5. leaveElements 内の各 element について、次を行う:
      編集者注

      element が削除された場合を扱う。 移動された場合も扱う:DOM 変更によって mouseleave イベントがトリガーされるべきだったか?今送るべきか?破棄すべきか? 現在のブラウザーの挙動を検証する必要がある。

      1. "mouseleave" と elementcreating a non-cancelable MouseEvent を行った結果を mouseleave とする
      2. mouseleave.Event.composed = false に設定する
        注記

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

      3. mouseleaveMaybe send pointerleave event を行う
      4. dispatch により elementmouseleave をディスパッチした結果を result とする
  5. 新しい要素へ入るためのイベントを生成する:
    1. targetlast mouse element でないなら、
      1. "mouseover" と targetcreating a cancelable MouseEvent を行った結果を mouseover とする
        編集者注

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

      2. mouseoverMaybe send pointerover event を行う
      3. Dispatch により targetmouseout をディスパッチする
        注記

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

      4. targetDomPath のコピーから、last mouse DOM path と共通の全要素を削除したものを enterElements とする。
      5. enterElements 内の各 element について、次を行う:
        注記

        element が削除または移動された場合を扱う。

        1. "mouseenter" と elementcreating a non-cancelable MouseEvent を行った結果を mouseenter とする
        2. mouseenter.Event.composed = false に設定する
          注記

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

        3. mouseenterMaybe send pointerenter event を行う
          注記

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

        4. dispatch により elementmouseenter をディスパッチした結果を result とする
      6. last mouse elementtarget に設定する
      7. last mouse DOM pathtargetDomPath に設定する
  6. "mousemove" と elementcreating a cancelable MouseEvent を行った結果を mousemove とする
  7. Set PointerLock attributes for mousemove
  8. mousemoveMaybe send pointermove event を行う
  9. Dispatch により elementmousemove をディスパッチする

4.2.18 maybe show context menu

警告

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

  1. native をネイティブ mousedown または pointer event とする
  2. target を、イベントの EventTarget とする
    1. "contextmenu" と targetcreating a PointerEvent を行った結果を menuevent とする
    2. native が有効なら、
      1. native に対して Set MouseEvent attributes from native を行う
    3. dispatch により targetmenuevent をディスパッチした結果を result とする
    4. result が true なら、UA コンテキストメニューを表示する
注記

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

4.3 Mouseイベントの順序

本仕様で定義される特定のmouseイベントは、互いに相対して定められた順序で発生しなければならない(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つの要素が、いずれも同一の寸法と、ウェブページ上での同一の絶対位置を持つ。要素 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
注記

mousedownmouseup の間に許容される mousemove イベントの遅延時間、程度、距離、および個数(それでも click または dblclick イベントを発火するかどうか)は、実装、デバイス、およびプラットフォームに固有である。この許容度は、手が震えるなどの身体的障害を持つユーザーがポインティングデバイスと対話する際に役立ちうる。

各実装は適切な hysteresis の許容度を決定するが、一般に、関連する mousedown および mouseup イベントのイベントターゲットが、間に mouseout または mouseleave イベントを挟まずに同一要素である場合、click および dblclick イベントを発火すべきである(SHOULD)。また、関連する mousedown および mouseup のイベントターゲットが異なる場合、最も近い共通の inclusive ancestor に対して click および dblclick イベントを発火すべきである(SHOULD)。

もし mousedown イベントが HTML 文書の body element をターゲットとしており、対応する mouseup イベントが document element をターゲットとしていたなら、click イベントは、最も近い共通の inclusive ancestor であるため、document element にディスパッチされる。

mouseイベント列の途中で target(例:ターゲット要素)が DOM から削除された場合、その列の残りのイベントは、その要素に対して発火してはならない(MUST NOT)。

もし mousedown イベントの結果としてターゲット要素が DOM から削除された場合、その要素に対して mouseupclick、または dblclick のいずれのイベントもディスパッチされず、デフォルトのアクティベーションイベントもディスパッチされない。ただし、mouseup イベントは、初期ターゲット要素の削除後にマウスに露出する要素へ引き続きディスパッチされる。同様に、mouseup イベントのディスパッチ中にターゲット要素が DOM から削除された場合、click およびその後続イベントはディスパッチされない。

4.4 Mouseイベント種別

Mouseイベント種別を以下に列挙する。ネストされた要素の場合、 mouseイベント種別は常に最も深くネストされた要素をターゲットとする。 ターゲットとなった要素の祖先は、バブリングを用いて、その子孫要素内で発生するmouseイベントの 通知を取得してもよい(MAY)。

4.4.1 auxclick

Type auxclick
Interface PointerEvent
Sync / Async Sync
Bubbles Yes
Trusted Targets Element
Cancelable Yes
Composed Yes
Default action Varies
Context
(trusted events)

auxclick イベント種別は、ユーザーが非主ポインタボタンを押下して解放したとき、またはそれをシミュレートする方法でポインタをアクティベートしたとき、ポインタが示す 最上位の イベントターゲットへディスパッチされなければならない(MUST)。マウスボタンの作動方法はポインタデバイスと環境設定に依存し、例えば、画面位置またはポインティングデバイスボタンの押下と解放の間の遅延に依存してもよい(MAY)。

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

auxclick イベントに先行して、同一要素上での mousedown および mouseup イベントが発生してもよい(MAY)。ここでは、他のノード種別(例:テキストノード)間での変化は無視する。環境設定に応じて、押下と解放の間に mouseovermousemove、および mouseout のうち1つ以上のイベント種別が発生した場合でも、 auxclick イベントがディスパッチされてもよい(MAY)。

auxclick イベント種別の デフォルト動作 は、イベントの target および button または buttons 属性の値に応じて変化する。auxclick イベント種別の典型的な デフォルト動作 は次のとおりである:

  • target に関連付けられた activation behavior がある場合、 デフォルト 動作は、その activation behavior を実行することでなければならない(MUST)。
Example 6: 中ボタンの auxclick を受け取り処理する
myLink.addEventListener("auxclick", function(e) {
  if (e.button === 1) {
    // This would prevent the default behavior which is for example
    // opening a new tab when middle clicking on a link.
    e.preventDefault();
    // Do something else to handle middle button click like taking
    // care of opening link or non-link buttons in new tabs in a way
    // that fits the app. Other actions like closing a tab in a tab-strip
    // which should be done on the click action can be done here too.
  }
});
注記

右ボタンの場合、auxclick イベントは、任意の contextmenu イベントの後にディスパッチされる。コンテキストメニューが表示されている間、すべての入力イベントを飲み込むユーザーエージェントもあるため、そのようなシナリオでは auxclick がアプリケーションで利用できない場合があることに留意すること。 さらなる説明は Example 7 を参照。

Example 7: 右ボタンの auxclick を受け取り処理する
myDiv.addEventListener("contextmenu", function(e) {
  // This call makes sure no context menu is shown
  // to interfere with page receiving the events.
  e.preventDefault();
});
myDiv.addEventListener("auxclick", function(e) {
  if (e.button === 2) {
    // Do something else to handle right button click like opening a
    // customized context menu inside the app.
  }
});

4.4.2 click

Type click
Interface PointerEvent
Sync / Async Sync
Bubbles Yes
Trusted Targets Element
Cancelable Yes
Composed Yes
Default action Varies
Context
(trusted events)

click イベント種別は、ユーザーが主ポインタボタンを押下して解放したとき、またはそれをシミュレートする方法でポインタをアクティベートしたとき、ポインタが示す 最上位の イベントターゲットへディスパッチされなければならない(MUST)。マウスボタンの作動方法はポインタデバイスと環境設定に依存し、例えば、画面位置またはポインティングデバイスボタンの押下と解放の間の遅延に依存してもよい(MAY)。

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

click イベントに先行して、同一要素上での mousedown および mouseup イベントが発生してもよい(MAY)。ここでは、他のノード種別(例:テキストノード)間での変化は無視する。環境設定に応じて、押下と解放の間に mouseovermousemove、および mouseout のうち1つ以上のイベント種別が発生した場合でも、 click イベントがディスパッチされてもよい(MAY)。 click イベントの後に、dblclick イベントが続いてもよい(MAY)。

もしユーザーが、大きな line-height でスタイルされた <p> 要素のテキストノード子に対して mousedown し、マウスをわずかに移動して、もはやテキストを含む領域の上ではないが、その <p> 要素の包含ブロック内には依然としてある(すなわち、ポインタは同一テキストブロックの行間にあるが、テキストノード自体の上ではない)ようにし、その後 mouseup した場合、ユーザーが同一要素の範囲内に留まっているため、(click に対する通常の時間的 hysteresis の範囲内であれば)click イベントを依然としてトリガーする可能性が高い。ユーザーエージェントが生成するmouseイベントはテキストノードに対してはディスパッチされないことに留意すること。

ポインタデバイスとの関連付けに加えて、click イベント種別は、要素アクティベーションの一部としてディスパッチされなければならない(MUST)。

注記

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

click イベント種別の デフォルト動作 は、イベントの target および button または buttons 属性の値に応じて変化する。click イベント種別の典型的な デフォルト動作 は次のとおりである:

  • If the target has associated activation behavior, the default action MUST be to execute that activation behavior.
  • If the target is focusable, the default action MUST be to give that element document focus.

4.4.3 contextmenu

Type contextmenu
Interface PointerEvent
Sync / Async Sync
Bubbles Yes
Trusted Targets Element
Cancelable Yes
Composed Yes
Default action サポートされている場合、コンテキストメニューを起動する。
Context
(trusted events)

user agent は、コンテキストメニューを起動する前にこのイベントをディスパッチしなければならない(MUST)。

contextmenu イベントが右マウスボタンによってトリガーされる場合、 contextmenu イベントは mousedown イベントの後にディスパッチされなければならない(MUST)。

注記

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

4.4.4 dblclick

Type dblclick
Interface MouseEvent
Sync / Async Sync
Bubbles Yes
Trusted Targets Element
Cancelable Yes
Composed Yes
Default action None
Context
(trusted events)

user agent は、ポインティングデバイスの主ボタンが要素上で2回クリックされたとき、このイベントをディスパッチしなければならない(MUST)。ダブルクリックの定義は環境設定に依存するが、mousedownmouseup、および dblclick の間でイベントターゲットは同一でなければならない(MUST)。クリックとダブルクリックが同時に発生する場合、このイベント種別はイベント種別 click の後にディスパッチされなければならず(MUST)、それ以外の場合はイベント種別 mouseup の後にディスパッチされなければならない(MUST)。

click イベントと同様に、dblclick イベントは 主ポインタボタンに対してのみ発火されるべきである。副ボタンは dblclick イベントを発火してはならない(MUST NOT)。

注記

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

click イベント種別と同様に、デフォルト動作dblclick イベント種別においても、イベントの target および button または buttons 属性の値に応じて変化する。dblclick イベント種別の典型的な デフォルト動作は、click イベント種別のものと一致する。

4.4.5 mousedown

Type mousedown
Interface MouseEvent
Sync / Async Sync
Bubbles Yes
Trusted Targets Element
Cancelable Yes
Composed Yes
Default action Varies: ドラッグ&ドロップ操作を開始する;テキスト選択を開始する;スクロール/パン操作を開始する(サポートされている場合、中ボタンとの組み合わせ)
Context
(trusted events)
user agent は、ポインティングデバイスの ボタンが要素上で押下されたとき、このイベントをディスパッチしなければならない(MUST)。
注記

多くの実装は mousedown イベントを、文脈に依存する多様な デフォルト動作 の開始に使用する。これらのデフォルト動作は、このイベントがキャンセルされた場合に防止できる。これらのデフォルト動作には、画像またはリンクとのドラッグ&ドロップ操作の開始、テキスト選択の開始などが含まれうる。また、一部の実装は、mousedown イベントがディスパッチされた時点で中ボタンが押下されている場合に有効化される、マウス駆動のパン機能を提供する。

4.4.6 mouseenter

Type mouseenter
Interface MouseEvent
Sync / Async Sync
Bubbles No
Trusted Targets Element
Cancelable No
Composed No
Default action None
Context
(trusted events)
user agent は、ポインティングデバイスが 要素、またはその子孫要素の境界上へ移動したとき、このイベントをディスパッチしなければならない(MUST)。また、要素またはその子孫のいずれかが移動して主ポインティングデバイスの下に来たときにも、このイベントをディスパッチしなければならない(MUST)。このイベント種別は mouseover に類似するが、 バブリングしない点、およびポインタデバイスがある要素からその子孫要素の境界上へ移動したときにディスパッチされてはならない(MUST NOT)点が異なる。
注記

このイベント種別と CSS の :hover 擬似クラス [CSS2] には類似点がある。mouseleave イベント種別も参照。

4.4.7 mouseleave

Type mouseleave
Interface MouseEvent
Sync / Async Sync
Bubbles No
Trusted Targets Element
Cancelable No
Composed No
Default action None
Context
(trusted events)
user agent は、ポインティングデバイスが 要素およびそのすべての子孫要素の境界から離れたとき、このイベントをディスパッチしなければならない(MUST)。また、要素またはその子孫のいずれかが移動して主ポインティングデバイスの下に存在しなくなったときにも、このイベントをディスパッチしなければならない(MUST)。このイベント種別は mouseout に類似するが、 バブリングしない点、およびポインティングデバイスが要素の境界およびその全子要素の境界を離れるまでディスパッチされてはならない(MUST NOT)点が異なる。
注記

このイベント種別と CSS の :hover 擬似クラス [CSS2] には類似点がある。mouseenter イベント種別も参照。

4.4.8 mousemove

Type mousemove
Interface MouseEvent
Sync / Async Sync
Bubbles Yes
Trusted Targets Element
Cancelable Yes
Composed Yes
Default action None
Context
(trusted events)
user agent は、ポインティングデバイスが 要素上にある間に移動したとき、このイベントをディスパッチしなければならない(MUST)。ポインティングデバイスが移動している間のイベント頻度は、実装、デバイス、およびプラットフォームに固有であるが、マウス移動の各インスタンスにつき単一イベントとするのではなく、持続的なポインティングデバイス移動に対して複数の連続した mousemove イベントを発火すべきである(SHOULD)。実装には、応答性と性能の均衡を取るために最適な頻度を決定することが推奨される。
注記

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

注記

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

4.4.9 mouseout

Type mouseout
Interface MouseEvent
Sync / Async Sync
Bubbles Yes
Trusted Targets Element
Cancelable Yes
Composed Yes
Default action None
Context
(trusted events)
user agent は、ポインティングデバイスが 要素の境界から離れたとき、または要素が移動して主ポインティングデバイスの下に存在しなくなったとき、このイベントをディスパッチしなければならない(MUST)。 このイベント種別は mouseleave に類似するが、バブリングする点、およびポインタデバイスがある要素からその子孫要素の境界上へ移動したときにディスパッチされなければならない(MUST)点が異なる。
注記

mouseover イベント種別も参照。

4.4.10 mouseover

Type mouseover
Interface MouseEvent
Sync / Async Sync
Bubbles Yes
Trusted Targets Element
Cancelable Yes
Composed Yes
Default action None
Context
(trusted events)
user agent は、ポインティングデバイスが 要素の境界上へ移動したとき、または要素が移動して主ポインティングデバイスの下に来たとき、このイベントをディスパッチしなければならない(MUST)。 このイベント種別は mouseenter に類似するが、バブリングする点、およびポインタデバイスが同一 event listener インスタンスに対する同一 target の祖先要素である要素の境界上へ移動した場合にディスパッチされなければならない(MUST)点が異なる。
注記

mouseout イベント種別も参照。

4.4.11 mouseup

Type mouseup
Interface MouseEvent
Sync / Async Sync
Bubbles Yes
Trusted Targets Element
Cancelable Yes
Composed Yes
Default action None
Context
(trusted events)
user agent は、ポインティングデバイスの ボタンが要素上で解放されたとき、このイベントをディスパッチしなければならない(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

イベントを発生させたポインタの一意な識別子。user agents は、primary mouse pointer のために、汎用の pointerId 値として 0 または 1 を予約してもよい(MAY)。pointerId-1 は、ポインティングデバイス以外によって生成されたイベントを示すために、予約され使用されなければならない(MUST)。他の任意のポインタについては、user agents は pointerId 値をどのように割り当てるかに関して、異なる戦略やアプローチを自由に実装できる。しかし、[HTML] で定義される top-level browsing context 内のすべての active pointers は一意でなければならず、その識別子は他の top-level browsing context によって影響されてはならない(MUST NOT)(すなわち、ある top-level browsing context は、ポインタが当該 browsing context の外へ移動して別の top-level browsing context に入ったとき、そのポインタの pointerId が同じであると仮定できない)。

user agent は、以前の active pointer のために退役した pointerId の値を再利用してもよい(MAY)。または、特定のポインティングデバイスに対して常に同じ pointerId を再利用してもよい(MAY)(たとえば、複数ユーザーが協調するアプリケーションにおいて、特定ユーザーの特定のペン/スタイラス入力を一意に識別するため)。 ただし後者の場合、ページやドメインをまたぐフィンガープリンティングや追跡の可能性を最小化するため、pointerId はページ/セッションの存続期間に限り、その特定のポインティングデバイスに明示的に関連付けられなければならず(MUST)、その特定のポインティングデバイスが新しいセッションで再び使用される次回には、新しいランダム化された pointerId が選択されなければならない(MUST)。

注記

pointerId の選択アルゴリズムは実装依存である。作者は、値が「他のすべての active pointer から一意であるポインタの識別子」以外の特定の意味を伝えると仮定できない。例として、user agent は active pointer になった順に、0 から始まる番号を単純に割り当ててもよいが、これらの値が単調増加であることは保証されない。特定のポインティングデバイスに対して同じ pointerId を再利用するかどうかは各実装に委ねられているため、作者がそれに依存することは強く推奨されず、代わりに persistentDeviceId を参照すること。

width

ポインタの contact geometry の幅(X 軸方向の大きさ)。CSS ピクセル単位([CSS21] 参照)。 この値は、あるポインタについてイベントごとに更新されてもよい(MAY)。通常 contact geometry を欠く入力(伝統的なマウスなど)や、入力の実際のジオメトリがハードウェアで検出されない場合、user agent は既定値 1 を返さなければならない(MUST)。

height

ポインタの contact geometry の高さ(Y 軸方向の大きさ)。CSS ピクセル単位([CSS21] 参照)。 この値は、あるポインタについてイベントごとに更新されてもよい(MAY)。通常 contact geometry を欠く入力(伝統的なマウスなど)や、入力の実際のジオメトリがハードウェアで検出されない場合、user agent は既定値 1 を返さなければならない(MUST)。

pressure

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

tangentialPressure

正規化された接線方向の圧力(barrel pressure とも呼ばれる)。通常は追加のコントロール(例:エアブラシ用スタイラスのフィンガーホイール)で設定される。範囲は [-1,1] で、0 はコントロールの中立位置である。なお、一部のハードウェアは [0,1] の正の値のみをサポートする場合がある。接線圧力をサポートしないハードウェアおよびプラットフォームでは、値は 0 でなければならない(MUST)。

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

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

tiltX explanation diagram
3 正の tiltX
tiltY

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

tiltY explanation diagram
4 正の tiltY
twist

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

altitudeAngle

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

注記
ここで定義する altitudeAngle の既定値は π/2 であり、トランスデューサが表面に対して垂直となるように配置する。 これは Touch Events - Level 2 仕様における altitudeAngle プロパティの定義(既定値が 0)とは異なる。
altitudeAngle explanation diagram
5 例:altitudeAngleπ/4(X-Y 平面から 45 度)。
azimuthAngle

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

azimuthAngle explanation diagram
6 例:azimuthAngleπ/6(「4 時」)。
pointerType

イベントを引き起こしたデバイス種別(例:mouse, pen, touch)を示す。user agent がマウス、ペン/スタイラス、またはタッチ入力デバイスに対して pointer event を発火する場合、pointerType の値は次の表に従わなければならない(MUST):

ポインタデバイス種別 pointerType の値
Mouse mouse
Pen / stylus pen
Touch contact touch

user agent がデバイス種別を検出できない場合、値は空文字列でなければならない(MUST)。user agent が上記以外のポインタデバイス種別をサポートする場合、異なるデバイス種別間で名前が衝突しないように、pointerType の値はベンダープレフィックス付きであるべきである(SHOULD)。将来の仕様が、他のデバイス種別に対して追加の規範値を提供してもよい(MAY)。

注記
基本的なデモとして Example 2 を参照。さらに、開発者は、独自のカスタム pointerType 値を実装している可能性のある user agent をカバーするため、および pointerType が単に空文字列である状況のために、何らかの既定のハンドリングを含めるべきである点にも留意すること。
isPrimary

ポインタがこのポインタ種別における primary pointer を表すかどうかを示す。

persistentDeviceId

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

注記
デジタイザおよびポインティングデバイスのハードウェア制約により、ポインティングデバイスからのすべての pointer event で persistentDeviceId が利用可能であるとは限らない。例えば、デバイスがハードウェア ID をデジタイザへ報告するタイミングが間に合わず、pointerdownpersistentDeviceId が付与できない場合がある。この場合、persistentDeviceId は最初は 0 で、後から有効な値に変化することがある。
getCoalescedEvents()

coalesced events のリストを返すメソッド。

getPredictedEvents()

predicted events のリストを返すメソッド。

PointerEventInit ディクショナリは、PointerEvent インターフェイスのコンストラクタにより、信頼されない(合成の)pointer event を構築するための仕組みを提供するために使用される。これは [UIEVENTS] で定義される MouseEventInit ディクショナリを継承する。信頼されない pointer event を発火する方法を示すサンプルコードについては examples を参照。

PointerEvent に対する event constructing steps は、PointerEventInitcoalescedEventscoalesced events list に複製し、PointerEventInitpredictedEventspredicted events list に複製する。

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

5.1.1 ボタン状態

5.1.1.1 Chorded button interactions

マウスやペンなどの一部のポインタデバイスは、複数のボタンをサポートする。[UIEVENTS] の Mouse Event モデルでは、各ボタン押下は mousedownmouseup イベントを生成する。このハードウェア差異をよりよく抽象化し、デバイス横断の入力オーサリングを簡素化するため、Pointer Events は chorded button press(ポインタデバイス上で、あるボタンがすでに押下されている状態で別のボタンを押下すること)に対して、重なり合う pointerdown および pointerup イベントを発火しない。

代わりに、chorded button press は button および buttons プロパティの変化を調べることで検出できる。buttonbuttonsMouseEvent インターフェイスから継承されるが、次節で概説するように、意味論および値が変更される。

buttonbuttons の修正は pointer event にのみ適用される。ただし clickauxclick および contextmenu については、buttonbuttons の値は [UIEVENTS] に従わなければならない(MUST)。これは compatibility mouse events の場合と同様である。

5.1.1.2 button プロパティ

任意の pointer event におけるボタン状態遷移(pointerdownpointerup のみならず)を識別するため、button プロパティは、その状態変化によりイベントを発火させたデバイスボタンを示す。

デバイスボタンの変化 button
前回イベントから、ボタンもタッチ/ペン接触も変化していない -1
左マウス,
タッチ接触,
ペン接触
0
中マウス 1
右マウス,
ペンのバレルボタン
2
X1(戻る)マウス 3
X2(進む)マウス 4
ペンの消しゴムボタン 5
注記
マウスドラッグ中、pointermove イベントにおける button の値は、mousemove イベントのそれとは異なる。例えば、右ボタンを押したままマウスを移動している間、pointermovebutton 値は -1 になるが、mousemovebutton 値は 2 になる。
5.1.1.3 buttons プロパティ

buttons プロパティは、デバイスボタンの現在状態をビットマスクとして与える(MouseEvent と同様だが、取りうる値の集合が拡張されている)。

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

5.1.2 primary pointer

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

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

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

e という名前の pointer event を発火するとは、event を発火することにより、e という名前のイベントを PointerEvent を用いて発火し、その属性を PointerEvent インターフェイスおよび 属性と既定動作で定義されるとおりに設定することを意味する。

イベントが gotpointercapturelostpointercaptureclickauxclick、または contextmenu イベントでない場合、この PointerEvent について 保留中の pointer capture を処理する手順を実行する。

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

targetDocument を、ターゲットの node document とする [DOM]。

イベントが pointerdownpointermove、または pointerup の場合、イベントの active document を、このイベントの pointerId に対して targetDocument に設定する。

イベントが pointerdown であり、関連付けられたデバイスが direct manipulation device で、かつターゲットが Element の場合、暗黙の pointer capture で記述されるとおり、当該 pointerId に対してターゲット要素へ pointer capture を設定する。

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

決定されたターゲットへイベントを発火する。

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

注記
通常の hit-test 結果ではなく pointer capture target override をターゲットとして用いると、[UIEVENTS] で定義される一部の boundary event を発火する場合がある。これは、ポインタが以前のターゲットを離れ、この新しい capturing target に入るのと同じである。capture が解放されると、ポインタが capturing target を離れ、hit-test ターゲットに入るため、同様の状況が起こりうる。
5.1.3.1 属性と既定動作

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

イベント種別 Bubbles Cancelable 既定動作
pointerover Yes Yes None
pointerenter No No None
pointerdown Yes Yes Varies: ポインタが primary のとき、mousedown イベントのすべての既定動作
このイベントをキャンセルすると、後続の compatibility mouse events の発火も防止する。
pointermove Yes Yes Varies: ポインタが primary のとき、mousemove のすべての既定動作
pointerrawupdate Yes No None
pointerup Yes Yes Varies: ポインタが primary のとき、mouseup のすべての既定動作
pointercancel Yes No None
pointerout Yes Yes None
pointerleave No No None
gotpointercapture Yes No None
lostpointercapture Yes No None

ビューポート操作(パンおよびズーム)— 一般に direct manipulation インタラクションの結果として — は、意図的に pointer event の既定動作ではない。つまり、これらの挙動(例:タッチスクリーン上で指を動かした結果としてページをパンする)は、pointer event をキャンセルしても抑止できない。作者は代わりに touch-action を用い、文書の領域について direct manipulation の挙動を宣言しなければならない。イベントのキャンセルに対するこの依存を除去することにより、user agent による性能最適化が容易になる。

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

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

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

MouseEventrelatedTarget と同様に、relatedTarget は、ポインタがちょうど離れた要素の境界(pointerover または pointerenter の場合)またはポインタが侵入しつつある要素の境界(pointerout または pointerleave の場合)に初期化されるべきである。その他の pointer event では、この値は既定で null になる。要素が pointer capture を受け取った場合、そのポインタに対する後続のすべてのイベントは capturing 要素の境界内にあるものとみなされる点に留意すること。

gotpointercapture および lostpointercapture イベントでは、上表で定義されるものを除くすべての属性は、user agent が 保留中の pointer capture を処理する手順を実行し、gotpointercapture および lostpointercapture イベントを発火させた原因となる Pointer Event と同一であるべきである。

5.1.3.2 保留中の pointer capture を処理する

user agent は、暗黙に pointer capture を解放する場合、および gotpointercapture または lostpointercapture ではない Pointer Event を発火する場合、次の手順を実行しなければならない(MUST)。

  1. このポインタの pointer capture target override が設定されており、かつ pending pointer capture target override と等しくない場合、lostpointercapture という名前の pointer event を、pointer capture target override ノードに対して発火する。
  2. このポインタの pending pointer capture target override が設定されており、かつ pointer capture target override と等しくない場合、gotpointercapture という名前の pointer event を、pending pointer capture target override に対して発火する。
  3. pointer capture target override を、設定されていれば pending pointer capture target override に設定する。そうでなければ、pointer capture target override をクリアする。
注記

click, auxclick, および contextmenu イベント節で定義されるとおり、lostpointercapture イベントがディスパッチされた後であっても、対応する clickauxclick または contextmenu イベント(存在する場合)は、依然として capturing target にディスパッチされる。

5.1.3.3 pointer event ストリームの抑止

user agent は、ウェブページが特定の pointerId を持つ pointer event を今後受信し続ける可能性が低いことを検出したとき、pointer event ストリームを抑止しなければならない(MUST)。次のいずれかのシナリオがこの条件を満たす(追加のシナリオがあってもよい(MAY)):

  • user agent がモーダルダイアログまたはメニューを開いた。
  • ポインタ入力デバイスが物理的に切断された、またはホバー可能なポインタ入力デバイス(例:ホバー可能なペン/スタイラス)がデジタイザで検出可能なホバー範囲を離れた。
  • ポインタが、その後 user agent によりページのビューポートを操作するために使用される(例:パンまたはズーム)。詳細は touch-action CSS プロパティ節を参照。
    注記
    user agent は複数のポインタ種別(例:touch と pen)でパン/ズームをトリガーできる。そのため、パン/ズーム動作の開始により、異なるポインタ種別を持つポインタを含め、さまざまなポインタが抑止される場合がある。
  • drag and drop processing model [HTML] で定義されるドラッグ操作開始アルゴリズムの一部として、ドラッグ操作を引き起こしたポインタに対して。
注記

user agentpointer event ストリームを抑止してもよい(MAY)他のシナリオには次が含まれる:

  • ポインタが active の間に、デバイスの画面向きが変更された。
  • ユーザーが、デバイスがサポートする数より多い同時ポインタ入力を使って対話しようとした。
  • user agent が入力を偶発的なものとして解釈した(例えば、ハードウェアが palm rejection をサポートする)。

これらのシナリオを検出する方法は、この仕様のスコープ外である。

user agent は、pointer event ストリームを抑止するために、次の手順を実行しなければならない(MUST):

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

画面表面に対して相対的に移動した、またはそのプロパティのいずれかに何らかの変化が生じたポインティングデバイスは、Pointer Event 種別で定義されるさまざまなイベントを発火する。静止したポインティングデバイス(画面表面に対する相対移動も、いずれかのプロパティ変化もない)については、user agent は、ポインタに対する hit test ターゲットに影響を与えたレイアウト変更の後に、特定の境界イベントを発火しなければならない(MUST)。詳細は pointeroverpointerenterpointerout および pointerleave を参照。user agent は性能上の理由により、これらの境界イベントの発火を遅延してもよい(MAY)(例:境界イベントリスナーにより多すぎる hit-test やレイアウト変更が起こることを避けるため)。

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

5.1.5 tiltX / tiltYaltitudeAngle / azimuthAngle の変換

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

特定のハードウェアおよびプラットフォームに応じて、user agent は画面平面に対するトランスデューサの向きとして、片方の組の値のみを受け取る可能性が高い — すなわち tiltX / tiltY か、altitudeAngle / azimuthAngle のいずれかである。user agent は、これらの値を変換するために次のアルゴリズムを使用しなければならない(MUST)。

user agent が azimuthAngle / altitudeAngle から tiltX / tiltY を計算する場合、最終的な整数値を Math.round [ECMASCRIPT] の規則に従って丸めるべきである(SHOULD)。

Example 8: tiltX/tiltY と altitudeAngle/azimuthAngle の変換
/* Converting between tiltX/tiltY and altitudeAngle/azimuthAngle */

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

  let tiltXrad = 0;
  let tiltYrad = 0;

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

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

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

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

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

  // calculate azimuth angle
  let azimuthAngle = 0;

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

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

  // calculate altitude angle
  let altitudeAngle = 0;

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

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

5.2 PointerEvent アルゴリズム

5.2.1 PointerEvent を初期化する

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

  1. MouseEvent を初期化する を、eventeventTypeeventTargetbubbles、および cancelable を用いて実行する。
  2. それ以外のすべての属性を、既定の PointerEvent 値に初期化する。

5.2.2 PointerEvent を作成する

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

  1. event を、event を作成するPointerEvent を用いて行った結果とする。
  2. PointerEvent を初期化する を、eventeventTypeeventTargetbubbles、および cancelable を用いて実行する。
  3. event を返す

5.2.3 MouseEvent から PointerEvent を作成する

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

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

  1. mouseout を、対応する mouseout MouseEvent とする
  2. pointerout を、MouseEvent から PointerEvent を作成する を "pointerout" と mouseout で実行した結果とする
  3. pointerevent 属性を設定する
    Editor's note

    TODO.

  4. target を、mouseout.target とする
  5. dispatch pointerouttarget に対して行う

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

  1. mouseout を、対応する mouseout MouseEvent とする
  2. pointerout を、MouseEvent から PointerEvent を作成する を "pointerout" と mouseout で実行した結果とする
  3. pointerevent 属性を設定する
    Editor's note

    TODO.

  4. target を、mouseout.target とする
  5. dispatch pointerouttarget に対して行う

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

  1. mouseout を、対応する mouseout MouseEvent とする
  2. pointerout を、MouseEvent から PointerEvent を作成する を "pointerout" と mouseout で実行した結果とする
  3. pointerevent 属性を設定する
    Editor's note

    TODO.

  4. target を、mouseout.target とする
  5. dispatch pointerouttarget に対して行う

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

  1. mouseout を、対応する mouseout MouseEvent とする
  2. pointerout を、MouseEvent から PointerEvent を作成する を "pointerout" と mouseout で実行した結果とする
  3. pointerevent 属性を設定する
    Editor's note

    TODO.

  4. target を、mouseout.target とする
  5. dispatch pointerouttarget に対して行う

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

  1. mouseout を、対応する mouseout MouseEvent とする
    Editor's note

    Can this send pointermove and pointerrawupdate? Or do we need 2 methods?

    Editor's note

    What is needed to properly define how pointermove events are coalesced?

  2. pointerout を、MouseEvent から PointerEvent を作成する を "pointerout" と mouseout で実行した結果とする
  3. pointerevent 属性を設定する
    Editor's note

    TODO.

  4. target を、mouseout.target とする
  5. dispatch pointerouttarget に対して行う

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

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

    mousedown イベントとは異なり、pointerdown イベントは、複数ボタンが押下されたときにネストされない。 フィールドを PointerEvent にコピーできるよう、この MouseEvent が渡される。

  2. pointerout を、MouseEvent から PointerEvent を作成する を "pointerout" と mouseout で実行した結果とする
  3. pointerevent 属性を設定する
    Editor's note

    TODO.

  4. target を、mouseout.target とする
  5. dispatch pointerouttarget に対して行う

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

  1. mouseout を、対応する mouseout MouseEvent とする
  2. target を、mouseout.target とする
  3. dispatch pointerouttarget に対して行う

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

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

    mouseup イベントとは異なり、pointerup イベントは、複数ボタンが押下されたときにネストされない。フィールドを PointerEvent にコピーできるよう、この MouseEvent が渡される。

  2. pointerout を、MouseEvent から PointerEvent を作成する を "pointerout" と mouseout で実行した結果とする
  3. pointerevent 属性を設定する
    Editor's note

    TODO.

  4. target を、mouseout.target とする
  5. dispatch pointerouttarget に対して行う

5.3 Pointer Event 種別

以下に、この仕様で定義されるイベント種別を示す。

primary pointer の場合、これらのイベント(gotpointercapture および lostpointercapture を除く)は、compatibility mouse events も発火しうる。

5.3.1 pointerover イベント

user agent は、次のいずれかが起こったとき、pointer event を発火して pointerover という名前のイベントを発火しなければならない(MUST):

5.3.2 pointerenter イベント

user agent は、次のいずれかが起こったとき、pointer event を発火して pointerenter という名前のイベントを発火しなければならない(MUST):

  • ポインタのターゲットを 決定する手順が、ポインタが要素またはその子孫へ移動したことを検出した。
  • レイアウト変更により、静止したポインティングデバイスの capture されていないポインタの下に、要素またはその子孫の hit test 境界が移動した。
  • user agent が、ホバーをサポートしないデバイスに対して pointerdown イベントを発火する前(pointerdown 参照)。
注記
このイベント種別は pointerover に類似するが、2つの違いがある:pointerenter はバブリングせず、そのディスパッチは子孫要素の hit test 境界も考慮する。
注記
このイベント種別は、[UIEVENTS] に記述される mouseenter イベント、および [CSS21] に記述される CSS :hover 擬似クラスと類似点がある。pointerleave イベントも参照。

5.3.3 pointerdown イベント

user agent は、ポインタが active buttons state に入ったとき、pointer event を発火して pointerdown という名前のイベントを発火しなければならない(MUST)。マウスでは、デバイスがボタン未押下の状態から少なくとも1つのボタンが押下された状態へ移行したときである。タッチでは、digitizer に物理的接触が行われたときである。ペンでは、ボタン未押下のままデジタイザに物理的接触する場合、またはホバー中にボタン未押下の状態から少なくとも1つのボタンが押下された状態へ移行する場合である。

注記
マウス(またはその他の複数ボタンのポインタデバイス)では、これは pointerdownpointerup が、mousedownmouseup と同一の状況すべてで発火するわけではないことを意味する。詳しくは chorded buttons を参照。

入力 ホバーをサポートしないデバイスについては、user agent は、pointerdown イベントをディスパッチする前に、pointer event を発火して pointerover という名前のイベントを発火し、その後に pointerenter という名前の pointer event を発火しなければならない(MUST)。

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

5.3.4 pointermove イベント

user agent は、ポインタが pointerdown または pointerup イベントを発火しない任意のプロパティを変更したとき、pointer event を発火して pointermove という名前のイベントを発火しなければならない(MUST)。これには、座標、圧力、接線圧(tangential pressure)、 tilt、twist、接触ジオメトリ(width および height)、または chorded buttons の変更が含まれる。

user agent は、(例えば性能上の理由から)pointermove イベントのディスパッチを遅延してもよい(MAY)。 coalesced events 情報は、ディスパッチされた単一の pointermove イベントに対するgetCoalescedEvents メソッドを通じて公開される。 イベントのターゲットを見つけるには、この種のイベントの最終座標を使用すべきである。

5.3.5 pointerrawupdate イベント

user agent は、ポインタが pointerdown または pointerup イベントを発火しない任意のプロパティを変更したとき、pointer event を発火して pointerrawupdate という名前のイベントを発火しなければならない(MUST)。また、これは secure context 内でのみ行わなければならない。該当するプロパティの一覧は pointermove イベントを参照。

pointermove とは対照的に、user agent は pointerrawupdate イベントを、可能な限り速やかに、かつ JavaScript がイベントを処理できる頻度でディスパッチすべきである(SHOULD)。

pointerrawupdate イベントの target は、pointermove イベントと異なる場合がある。これは、pointermove イベントが遅延または coalesce される可能性があり、ターゲット検出に用いられるイベントの最終位置が、その coalesced events と異なりうるためである。

すでに同一の pointerId を持ち、かつ event loop 内で未ディスパッチの別の pointerrawupdate がすでに存在する場合、user agent は、新しい pointerrawupdate を新しい task を作成する代わりに、そのイベントと coalesce してもよい(MAY)。 これにより、pointerrawupdate が coalesced events を持ちうるようになり、 それらはイベントが event loop で処理され次第、単一の pointerrawupdate イベントの coalesced events としてすべて配信される。 詳しくはgetCoalescedEvents を参照。

pointerrawupdatepointermove の順序について、プラットフォームからの更新により pointerrawupdatepointermove の両方のイベントが発生する場合、user agent は、対応する pointermove の前に pointerrawupdate イベントをディスパッチしなければならない(MUST)。

target を除けば、直前の pointermove イベント以降にディスパッチされたすべての pointerrawupdate イベントの coalesced events リストを連結したものは、次の pointermove イベントの coalesced events と、その他のイベント属性の点で同一である。 pointerrawupdate の属性は、例外として cancelable があり、これは pointerrawupdate では false でなければならない(MUST)。それ以外は、概ね pointermove と同じである。

user agent は、compatibility mouse eventspointerrawupdate に対して発火しないべきである(SHOULD)。

注記
pointerrawupdate イベントにリスナーを追加すると、user agent の実装によってはウェブページの性能に悪影響を及ぼす可能性がある。 多くのユースケースでは、他の pointerevent 種別で十分である。 pointerrawupdate リスナーは、JavaScript が高頻度のイベントを必要とし、かつ同じ速さで処理できる場合にのみ追加すべきである。 その場合、他の種別の pointer event をリッスンする必要はおそらくない。

5.3.6 pointerup イベント

user agent は、ポインタが active buttons state から離れたとき、pointer event を発火して pointerup という名前のイベントを発火しなければならない(MUST)。マウスでは、デバイスが少なくとも1つのボタンが押下された状態からボタン未押下の状態へ移行したときである。タッチでは、digitizer から物理的接触が取り除かれたときである。ペンでは、ボタン未押下のままデジタイザへの物理的接触が取り除かれたとき、またはホバー中に少なくとも1つのボタンが押下された状態からボタン未押下の状態へ移行したときである。

入力 ホバーをサポートしないデバイスについては、user agent は、pointerup イベントをディスパッチした後に、pointer event を発火して pointerout という名前のイベントを発火し、その後に pointerleave という名前の pointer event を発火しなければならない(MUST)。

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

user agent は、ポインタが現在 capture されている場合、暗黙に pointer capture を解放もしなければならない(MUST)。

注記
マウス(またはその他の複数ボタンのポインタデバイス)では、これは pointerdownpointerup が、mousedownmouseup と同一の状況すべてで発火するわけではないことを意味する。詳しくは chorded buttons を参照。

5.3.7 pointercancel イベント

user agent は、pointer event ストリームを抑止するシナリオを検出したとき、pointer event を発火して pointercancel という名前のイベントを発火しなければならない(MUST)。

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

5.3.8 pointerout イベント

user agent は、次のいずれかが起こったとき、pointer event を発火して pointerout という名前のイベントを発火しなければならない(MUST):

5.3.9 pointerleave イベント

user agent は、次のいずれかが起こったとき、pointer event を発火して pointerleave という名前のイベントを発火しなければならない(MUST)。

注記
このイベント種別は pointerout に類似するが、2つの違いがある:pointerleave はバブリングせず、そのディスパッチは子孫要素の hit test 境界も考慮する。
注記
このイベント種別、[UIEVENTS] に記述される mouseleave イベント、および [CSS21] に記述される CSS :hover 擬似クラスの間には類似点がある。pointerenter イベントも参照。

5.3.10 gotpointercapture イベント

user agent は、要素が pointer capture を受け取ったとき、pointer event を発火して gotpointercapture という名前のイベントを発火しなければならない(MUST)。このイベントは pointer capture を受け取る要素に対して発火される。そのポインタに対する後続のイベントは、この要素で発火される。pointer capture を設定する節および 保留中の pointer capture を処理する節を参照。

5.3.11 lostpointercapture イベント

user agent は、ポインタについて pointer capture が解放された後に、pointer event を発火して lostpointercapture という名前のイベントを発火しなければならない(MUST)。このイベントは、capture が解放された後のポインタに対する後続イベントのいずれよりも先に発火されなければならない(MUST)。このイベントは、pointer capture が取り除かれた要素に対して発火される。click, auxclick, および contextmenu イベント を除く、そのポインタに対する後続のすべてのイベントは、イベントターゲットを決定するために通常の hit testing 機構(この仕様のスコープ外)に従う。pointer capture を解放する節、pointer capture の暗黙の解放節、および 保留中の pointer capture を処理する節を参照。

5.3.12 clickauxclick、および contextmenu イベント

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

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

5.3.12.1 イベント属性

これらのイベントについては、pointerIdpointerType を除く、PointerEvent 固有の属性(本仕様で定義されるもの)はすべて既定値を持たなければならない(MUST)。加えて:

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

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

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

clickauxclick または contextmenu イベントは、次のアルゴリズムを用いてイベントターゲットが上書きされることを除き、[UIEVENTS] 仕様で定義されるディスパッチ処理に従わなければならない(MUST):

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

    注記

    イベント userEvent は非 PointerEvent でありうる。例えば、チェックボックス要素でスペースバーを押すことにより click イベントがディスパッチされる場合、userEventKeyboardEvent である。

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

  2. userEventPointerEvent でない場合、[UIEVENTS] 仕様に従い、event のターゲットを上書きせずに event をディスパッチし、以下の残りの手順をスキップする。
  3. target を次のとおり定義する:

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

    それ以外(eventclick または auxclick イベントで、かつ userEvent が capture されずにディスパッチされた pointerup イベントである場合)、event がディスパッチされる瞬間の DOM において、対応する pointerdownpointerup のターゲットの最近共通の包含祖先を target とする。

  4. [UIEVENTS] 仕様に従い、eventtarget にディスパッチする。

    注記
    userEvent が capture されていた場合、同一の pointerId を持つ lostpointercapture イベントがすでにディスパッチされていたとしても、eventuserEvent の capturing target にディスパッチされる。

6. ホイールイベント

ホイールは、1つ以上の空間次元で回転でき、かつポインティングデバイスに関連付けられうるデバイスである。座標系は 環境設定に依存する。

ユーザーの環境は、垂直スクロールを y 軸方向の回転に、 水平スクロールを x 軸方向の回転に、 ズームを z 軸方向の回転に関連付けるよう設定されているかもしれない。

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

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

deltaX、deltaY、deltaZ 属性の値の符号(正または負)は、 実際のホイールデバイスの動きが同じ方向に回転/移動している間にディスパッチされる複数回の wheel イベント間で一貫していなければならない(MUST)。 もし user agent が wheel イベントの既定動作としてスクロールするなら、 delta の符号は、正の X、Y、Z 軸がそれぞれ文書の右端、下端、最も遠い 奥行き(ユーザーから遠ざかる方向)へ向く右手座標系によって与えられるべきである(SHOULD)。
注記

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

user agent は、最初のホイールイベントが発火されたときに wheel event transaction を作成しなければならない(MUST)。これにより、実装固有の一定時間内の後続のすべてのホイールイベントが同じ要素をターゲットにできる。 wheel event transaction は、単一のユーザージェスチャーに関連付けられた一連の ホイールイベントである。 wheel event transaction は、関連付けられたイベントターゲットを持たなければならない(MUST)。それは、当該グループで最初のホイールイベントが発生した時点における topmost event target である。

スクロール可能な要素内で、ホイールイベントの系列が子要素の上から始まった場合、 同じユーザージェスチャーに対する後続イベントは子要素の上で発生しうる。

6.1 WheelEvent インターフェイス

WheelEvent インターフェイスは、 wheel イベントに関連付けられた特定の文脈情報を提供する。 WheelEvent インターフェイスのインスタンスを作成するには、WheelEvent コンストラクタを使用し、 オプションの WheelEventInit ディクショナリを渡す。

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;
};
DOM_DELTA_PIXEL
delta の測定単位はピクセルでなければならない(MUST)。 これはほとんどのオペレーティングシステムおよび 実装構成における最も典型的なケースである。
DOM_DELTA_LINE
delta の測定単位は個々のテキスト行でなければならない(MUST)。 これは多くのフォームコントロールにおけるケースである。
DOM_DELTA_PAGE
delta の測定単位はページでなければならない(MUST)。 ページは単一の画面として、または区切られたページとして定義される。
deltaX
wheel イベントの既定動作がスクロールである user agent では、このイベントがキャンセルされない場合にスクロールされるべき x 軸方向の測定値(ピクセル、行、またはページ)が値でなければならない(MUST)。 それ以外の場合、これは x 軸まわりのホイールデバイスの動きを表す、実装固有の測定値 (ピクセル、行、またはページ)である。 この属性の un-initialized value0.0 でなければならない(MUST)。
deltaY
wheel イベントの既定動作がスクロールである user agent では、このイベントがキャンセルされない場合にスクロールされるべき y 軸方向の測定値(ピクセル、行、またはページ)が値でなければならない(MUST)。 それ以外の場合、これは y 軸まわりのホイールデバイスの動きを表す、実装固有の測定値 (ピクセル、行、またはページ)である。 この属性の un-initialized value0.0 でなければならない(MUST)。
deltaZ
wheel イベントの既定動作がスクロールである user agent では、このイベントがキャンセルされない場合にスクロールされるべき z 軸方向の測定値(ピクセル、行、またはページ)が値でなければならない(MUST)。 それ以外の場合、これは z 軸まわりのホイールデバイスの動きを表す、実装固有の測定値 (ピクセル、行、またはページ)である。 この属性の un-initialized value0.0 でなければならない(MUST)。
deltaMode
deltaMode 属性は、 delta 値に対する測定単位の指示を含む。既定値は DOM_DELTA_PIXEL(ピクセル)である。 この属性は、delta 値の測定単位を示すために、 DOM_DELTA 定数のいずれかに設定されなければならない(MUST)。 正確な測定値は、デバイス、オペレーティングシステム、 およびアプリケーション構成に固有である。 この属性の un-initialized value0 でなければならない(MUST)。

6.1.2 WheelEventInit

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

6.2 ホイールイベント種別

6.2.1 wheel

Type wheel
Interface WheelEvent
Sync / Async 非同期
Bubbles Yes
Trusted Targets Element
Cancelable 可変
Composed Yes
Default action 文書をスクロール(またはズーム)する
Context
(trusted events)
  • 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 : (存在する場合)ポインティングデバイスが指している target を示す
  • WheelEvent.deltaX : deltaMode の単位に従ってページが x 軸方向へスクロールする見込み量、または x 軸まわりのホイールの動きを表す実装固有の値
  • WheelEvent.deltaY : deltaMode の単位に従ってページが y 軸方向へスクロールする見込み量、または y 軸まわりのホイールの動きを表す実装固有の値
  • WheelEvent.deltaZ : deltaMode の単位に従ってページが z 軸方向へスクロールする見込み量、または z 軸まわりのホイールの動きを表す実装固有の値
  • WheelEvent.deltaMode : deltaX、deltaY、deltaZ 属性に対する単位指示子(ピクセル、行、またはページ)
user agent は、マウスホイールが任意の軸まわりに回転したとき、または等価の入力デバイス (マウスボール、特定のタブレットやタッチパッド等)がそのような動作をエミュレートしたときに、このイベントをディスパッチしなければならない(MUST)。プラットフォームおよび入力デバイスに応じて、斜め方向のホイール deltas は、複数の非ゼロ軸を持つ単一の wheel イベントとして配信されることも、 非ゼロの各軸ごとに別々の wheel イベントとして配信されることもある(MAY)。 wheel イベント種別の典型的な default action は、 示された量だけ文書をスクロール(または場合によってはズーム)することである。このイベントがキャンセルされた場合、実装は(当該イベント種別に関連付けられたその他の実装固有の既定動作があるならそれも含めて)文書をスクロールまたはズームしてはならない(MUST NOT)。
注記

一部の user agents、またはいくつかの入力デバイスでは、ホイールが回された速度が delta 値に影響しうる。 速度が速いほど、delta 値がより大きくなる。

6.2.2 ホイールイベントのキャンセル可否

ホイールイベントに対して preventDefault を呼び出すと、スクロールを防止したり、 あるいは中断したりできる。最大のスクロール性能を得るため、user agent は、スクロールに関連付けられた各ホイールイベントがキャンセルされるかどうかを見るために、 それらが処理されるのを待たない場合がある。そのような場合、user agent は cancelable プロパティが falsewheel イベントを生成すべきである(SHOULD)。これは、 preventDefault を用いてスクロールを防止または中断できないことを示す。そうでなければ cancelabletrue になる。

特に、user agent は、このイベントに対して non-passive リスナーが存在しないことを観測したとき、 キャンセル不可能な wheel イベントのみを生成すべきである(SHOULD)。

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

以下の節では、pointer capture の設定および解放を容易にするために、既存の Element インターフェイスへの拡張について述べる。

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

引数 pointerId によって識別されるポインタについて、pointer capture を設定し、このメソッドが呼び出された要素に対して capture する。以後、そのポインタの後続イベントについては、capture 対象(capturing target)が、ポインタが常に capture 対象の上にあるかのように、通常の hit testing の結果を置き換え、capture が解放されるまで常にこの要素をターゲットにしなければならない(MUST)。このメソッドが有効になるには、ポインタが active buttons state にある必要があり(MUST)、そうでなければ黙って失敗する。与えられたメソッドの引数が、いずれの active pointers にも一致しない場合、"NotFoundError" の DOMExceptionthrow する。

releasePointerCapture()

引数 pointerId によって識別されるポインタについて、pointer capture を解放し、このメソッドが呼び出された要素から capture を解除する。以後そのポインタに対する後続イベントは、イベントターゲットを決定するために通常の hit testing 機構(この仕様のスコープ外)に従う。与えられたメソッドの引数が、いずれの active pointers にも一致しない場合、"NotFoundError" の DOMExceptionthrow する。

hasPointerCapture

このメソッドが呼び出された要素が、引数 pointerId によって識別されるポインタに対して pointer capture を持つかどうかを示す。具体的には、pending pointer capture target overridepointerId について、このメソッドが呼び出された要素に設定されている場合は true を返し、それ以外は false を返す。

注記
このメソッドは、setPointerCapture() の呼び出し直後に true を返す。たとえその要素がまだ gotpointercapture イベントを受け取っていなくても同様である。その結果、このメソッドは、pointerdown イベントリスナー内から implicit pointer capture を検出するのに有用になりうる。

8. GlobalEventHandlers ミックスインへの拡張

以下の節では、イベントハンドラの登録を容易にするために、既存の GlobalEventHandlers ミックスインへの拡張について述べる。

WebIDLpartial interface mixin GlobalEventHandlers {
    attribute EventHandler onpointerover;
    attribute EventHandler onpointerenter;
    attribute EventHandler onpointerdown;
    attribute EventHandler onpointermove;
    [SecureContext] attribute EventHandler onpointerrawupdate;
    attribute EventHandler onpointerup;
    attribute EventHandler onpointercancel;
    attribute EventHandler onpointerout;
    attribute EventHandler onpointerleave;
    attribute EventHandler ongotpointercapture;
    attribute EventHandler onlostpointercapture;
};
onpointerover
pointerover イベント種別に対する event handler IDL attribute
onpointerenter
pointerenter イベント種別に対する event handler IDL attribute
onpointerdown
pointerdown イベント種別に対する event handler IDL attribute
onpointermove
pointermove イベント種別に対する event handler IDL attribute
onpointerrawupdate
pointerrawupdate イベント種別に対する event handler IDL attribute
onpointerup
pointerup イベント種別に対する event handler IDL attribute
onpointercancel
pointercancel イベント種別に対する event handler IDL attribute
onpointerout
pointerout イベント種別に対する event handler IDL attribute
onpointerleave
pointerleave イベント種別に対する event handler IDL attribute
ongotpointercapture
gotpointercapture イベント種別に対する event handler IDL attribute
onlostpointercapture
lostpointercapture イベント種別に対する event handler IDL attribute

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. デバイスがサポートする同時タッチ接触の最大数を返す。複数のデジタイザ(例: 複数のタッチスクリーン)を持つデバイスの場合、値は各デジタイザがサポートする接触点数の最大値の集合の最大でなければならない(MUST)。

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

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

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

Attributes and Default Actions で述べたとおり、ビューポートの操作(パンおよびズーム)は、pointer event をキャンセルしても抑止できない。代わりに、作者は、許可したい挙動と抑止したい挙動を、touch-action CSS プロパティを用いて宣言的に定義しなければならない。

注記
ビューポートを操作するためにポインタが用いられる問題は一般にタッチ入力に限定される(ユーザーの指はコンテンツと相互作用しつつ、ページをパン/ズームできる)が、いくつかの user agent は、他のポインタ種別についても同様の(直接または間接の)操作を許容する場合がある。例えばモバイル/タブレット端末では、ユーザーはスタイラスを使ってスクロールできる場合もある。歴史的理由により、この仕様で定義される touch-action CSS プロパティはタッチ入力のみを参照しているように見えるが、実際にはパンおよびズームに対する direct manipulation を許容するあらゆる形態のポインタ入力に適用される。

10.1 touch-action CSS プロパティ

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

touch-action CSS プロパティは、(プロパティ名に反してタッチに限定されない)direct manipulation の相互作用が、user agent のパン/ズーム挙動をトリガーしてよいかどうか(MAY)を決定する。touch-actionに関する節を参照。

パンまたはズームを開始する直前に、user agent は、次の条件がすべて真である場合、pointer event ストリームを抑止しなければならない(MUST):

注記
いくつかの user agent は、一連の独立した離散ジェスチャーを含みつつ、単一の連続ジェスチャーの一部として扱われる挙動のために複雑なジェスチャーを実装している。例えばタッチスクリーンにおける「フリックしてスクロール」ジェスチャーを考えると、ユーザーは素早い指の動きで文書のパンを開始し、指をタッチスクリーンから離しても、文書は慣性を模擬してパンし続ける。文書がまだ動いている間に、ユーザーは指をタッチスクリーンに置き、別の「フリック」を行ってパンにさらに勢いを与えたり、現在のパンを打ち消して減速させたり、パンを完全に止めたり、パン方向を反転させたりできる。この仕様はジェスチャーと挙動の実装方法を規範的に定義しないため、2 回目のタッチ(それが 2 回目の「フリック」または現在のパンに対する反作用として解釈される前)で pointer event を発火するかどうかは user agent の判断に委ねられる。
注記
touch-action は埋め込みブラウジングコンテキストへは適用/カスケードしない。例えば、<iframe>touch-action を適用しても、<iframe> 自体の内部におけるパンおよびズームの direct manipulation 相互作用の挙動には影響しない。

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

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

注記
いくつかの user agent は、複数の同時ポインタ(例:マルチタッチ)を伴うパンおよびズームの相互作用をサポートする。複数の同時ポインタに対する touch-action 値の処理または関連付け方法は、この仕様のスコープ外である。

10.3 touch-action 値の詳細

touch-action プロパティは、ビューポートのパンおよびズームに関連する直接操作の挙動を対象とする。テキスト選択/ハイライト、またはリンクやフォームコントロールの有効化のような追加の user agent 挙動は、この CSS プロパティによって影響されてはならない(MUST NOT)。

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

方向指定の pan 値は、いくつかのオーバースクロール挙動をカスタマイズするのに有用である。 例えば、簡単な pull-to-refresh 効果を実装するには、文書の touch-action を、スクロール位置が 0 のときは pan-x pan-down に、そうでない場合は pan-x pan-y に設定できる。 これにより、ポインタイベントハンドラは、文書の先頭から開始される上方向へのパン/スクロールに対する挙動を定義できる。

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

注記
パンおよびズームに対する一部の既定の direct manipulation 挙動を無効にすると、user agents が他の挙動により速く応答できる場合がある。例えば auto の場合、user agents は通常、ダブルタップジェスチャーを処理できるように click の前に 300ms の遅延を追加する。これらの場合、touch-action: none または touch-action: manipulation を明示的に設定すると、この遅延は取り除かれる。タップまたはダブルタップジェスチャーを決定する方法は、この仕様のスコープ外である点に注意。
Example 9: すべての直接操作の挙動を禁止する
<div style="touch-action: none;">
    この要素は、そうでなければパンまたはズームにつながるすべての direct manipulation 相互作用に対して pointer event を受け取る。
</div>
Example 10: 水平方向のパンのみを許可する
<div style="touch-action: pan-x;">
    この要素は、水平方向にパンしていないときに pointer event を受け取る。
</div>
Example 11: パンおよびズームに対する直接操作の挙動を禁止する子領域
<div style="overflow: auto;">
    <div style="touch-action: none;">
        この要素は、そうでなければパンまたはズームにつながるすべての direct manipulation 相互作用に対して pointer event を受け取る。
    </div>
    <div>
        この要素上の direct manipulation 相互作用は、親を操作するために消費されてもよい(MAY)。
    </div>
</div>
Example 12: パンおよびズームに対する直接操作の挙動を禁止する中間の親
<div style="overflow: auto;">
    <div style="touch-action: pan-y;">
        <div style="touch-action: pan-x;">
            この要素は、次の理由により、すべての direct manipulation 相互作用に対して pointer event を受け取る。
            それは、この要素が水平方向のパンのみを許可する一方で、中間の祖先(この要素とスクロール可能要素の間)が垂直方向のパンのみを許可するためである。
            したがって、パン/ズームに対するいかなる直接操作の挙動も user agent によって処理されない。
        </div>
    </div>
</div>
Example 13: パンおよび ズームに対して許可される直接操作の挙動を制限する中間の親
<div style="overflow: auto;">
    <div style="touch-action: pan-y pan-left;">
        <div style="touch-action: pan-x;">
            この要素は、左方向にパンしていないときに pointer event を受け取る。
        </div>
    </div>
</div>

11. ポインタ キャプチャ

11.1 導入

この節は非規範である。

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

カスタム音量スライダー
7 つまみ要素を前後にスライドさせることで値を選ぶカスタムスライダーコントロールの例。つまみに対して pointerdown した後、ポインタがそこから逸れてもつまみをスライドできるようにするために、ポインタキャプチャを利用できる。

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

ポインタキャプチャは、element.setPointerCapture(pointerId) メソッドを呼び出すことで、型 Elementelement に設定される。 このメソッドが呼び出されたとき、user agent は次の手順を実行しなければならない(MUST):

  1. メソッド引数として提供された pointerId が、いずれの active pointers にも一致しない場合、"NotFoundError" の DOMExceptionthrow する。
  2. pointer を、与えられた pointerId によって指定される active pointer とする。
  3. elementconnected [DOM] でない場合、"InvalidStateError" の DOMExceptionthrow する。
  4. このメソッドが呼び出された時点で、elementnode document [DOM] が locked element([PointerLock] pointerLockElement)を持つ場合、"InvalidStateError" の DOMExceptionthrow する。
  5. pointeractive buttons state にない、または elementnode documentpointeractive document でない場合、これらの手順を終了する。
  6. 指定された pointerId について、pending pointer capture target override を、このメソッドが呼び出された Element に設定する。
注記
以前の set または release の呼び出しが保留状態にある間に(process pending pointer capture を参照)新たに set または release が呼び出された場合、2 回目の呼び出しが成功したときは 2 回目の呼び出しが 1 回目を上書きし、そうでなければ 1 回目の呼び出しが有効なまま残る。これは、implicit pointer capturepointerdown リスナーで解放しようとして失敗した場合にも当てはまる。

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

ポインタキャプチャは、element.releasePointerCapture(pointerId) メソッドを呼び出すことで、要素上で明示的に解放される。このメソッドが呼び出されたとき、user agent は次の手順を実行しなければならない(MUST):

  1. メソッド引数として提供された pointerId が、いずれの active pointers にも一致せず、かつこれらの手順が pointer capture の暗黙的解放の結果として呼び出されていない場合、"NotFoundError" の DOMExceptionthrow する。
  2. 指定された pointerId を持つ Element に対して hasPointerCapture が false の場合、これらの手順を終了する。
  3. 指定された pointerId について、pending pointer capture target override が設定されていればそれをクリアする。
注記
ポインタキャプチャの設定 の注記を参照。

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

パンおよびズームに対する direct manipulation 相互作用(タッチスクリーン上のタッチやスタイラスなど)を実装する入力は、任意の pointerdown リスナーの呼び出し直前に、ターゲット要素に対して setPointerCapture が呼び出されたかのように、まったく同じ挙動をするべきである(SHOULD)。hasPointerCapture API は(例えば pointerdown リスナー内で)これが起こったかどうかを判断するために使用できる。次の pointer event が発火される前に、そのポインタに対して releasePointerCapture が呼び出されなかった場合、キャプチャがアクティブであることを示す gotpointercapture イベントが(通常どおり)ターゲットへディスパッチされる。

注記
これは [PointerEvents] からの破壊的変更であるが、既存コンテンツの大多数には影響しない。典型的なプラットフォームの UX 慣習に合致することに加えて、この暗黙的キャプチャの設計により、user agent は、開発者の明示的なオプトインなしにタッチ移動イベントで hit-testing を呼び出す必要を防ぐ性能最適化を行える(既存の支配的なネイティブおよび Web のタッチ入力 API の性能特性と整合する)。
注記
さらに、user agent は、input range コントロールのような特定の UI ウィジェット上のすべての入力デバイスに対して、暗黙的ポインタキャプチャの挙動を実装してもよい(相互作用中に、指の動きがフォームコントロール自体の外へある程度はみ出すことを許容する)。

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

pointerup または pointercancel イベントを発火した直後に、 user agent は、たった今ディスパッチされた pointerup または pointercancel イベントの pointerId について、pending pointer capture target override をクリアしなければならない(MUST)。その後、必要であれば lostpointercapture を発火するために process pending pointer capture の手順を実行する。 process pending pointer capture の手順を実行した後、ポインタがホバーをサポートする場合、user agent は、キャプチャのないポインタの現在位置を反映するために必要な対応する境界イベントも送信しなければならない(MUST)。

pointer capture target override がもはや connected [DOM] でない場合、pointer capture target override は文書に設定されるべきである(SHOULD)。

pending pointer capture target override がもはや connected [DOM] でない場合、pending pointer capture target override ノードはクリアされるべきである(SHOULD)。

注記
上記 2 段落により、キャプチャノードが除去された後の次の Process pending pointer capture の際に、キャプチャされたポインタに対応する lostpointercapture イベントが文書に対して発火される結果になる。

要素に対して pointer lock [PointerLock] が成功裏に適用されたとき、いずれかの要素がキャプチャ中またはキャプチャ保留中に設定されているなら、user agent は、releasePointerCapture メソッドが呼び出されたかのように手順を実行しなければならない(MUST)。

12. Coalesced および predicted イベント

注記
この仕様は、user agent がどのようにポインタ移動データを coalesce または predict すべきかは定義しない。この情報にアクセスするための API のみを規定する。

12.1 Coalesced イベント

性能上の理由から、user agent は、ポインタの measurable property (座標、圧力、接線圧、tilt、twist、または接触ジオメトリなど) が更新されるたびに pointermove イベントを送らないことを選んでもよい。代わりに、それらは複数の変化を coalesce(結合/マージ)して、 単一の pointermove または pointerrawupdate イベントにしてもよい。これは、user agent が行わなければならないイベント処理量(MUST)を減らすのに役立つ一方で、とりわけ高速かつ大きな動きにおいて、ポインタ位置の追跡における粒度と忠実度を自然に低下させる。getCoalescedEvents メソッドを用いると、アプリケーションは生の、coalesce されていない位置変化へアクセスできる。これにより、ポインタ移動データをより精密に処理できる。例えば描画アプリケーションでは、coalesce されていないイベントを用いて、ポインタの実際の動きにより近い、より滑らかな曲線を描画できる。

曲線の拡大図(coalesced および un-coalesced の点を示す)
8 描画アプリケーションにおける曲線の例 — pointermove イベントからの coalesced 座標(灰色の点)だけを用いると、曲線は目に見えて角張ってギザギザになる。getCoalescedEvents() が提供する、より粒度の細かい点(赤い円)を用いて同じ線を描くと、ポインタ移動に対するより滑らかな近似になる。

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

注記
信頼された親イベントは coalesced イベントの要約または集約であるため、開発者は、親イベントだけ、または coalesced イベントすべてのいずれか一方のみを処理すればよく、両方を処理する必要はない。
注記
coalesced events list を含む信頼されたイベントが JavaScript から再ディスパッチされると、イベントディスパッチアルゴリズムは、そのイベントの isTrusted ビットを false に設定するが、coalesced events list 内の同じビットは、元の true の値から変更されない。

信頼されたイベントの coalesced events list 内のイベントは、次を持つ:

Example 14: coalesced events list を使用する基本的な canvas 描画アプリケーション
<style>
    /* canvas 要素上のすべてのイベントがアプリケーションへ渡されるように、
    user agent 固有の直接操作の既定挙動(パンまたはズームなど)を無効にする。 */

    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); // 生の(coalesce されていない)点をすべて描画する
            }
        } else {
            paint(e); // 最終的な coalesced 点を描画する
        }
    });

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

</script>
注記
PointerEvent の属性は、coalesced events list 内のイベントを最もよく表す方法で初期化される。user agent がこれをどのように行うべきかの具体的な方法は、この仕様では扱わない。

これらディスパッチされたすべてのイベントの順序は、元のイベントの実際の順序と一致しなければならない(MUST)。 例えば、pointerdown イベントが、coalesced pointermove イベントのディスパッチを引き起こす場合、user agent はまず、同一の pointerId を持つそれら coalesced イベントすべてを含む 1 つの pointermove イベントをディスパッチし、その後に pointerdown イベントをディスパッチしなければならない(MUST)。

注記

以下は、timeStamp 値が増加する実際のイベント、および user agent がディスパッチするイベントの例である:

実際のイベント ディスパッチされるイベント
pointer (pointerId=2) 座標変化 pointerrawupdate (pointerId=2) 1 つの coalesced イベントを伴う
pointer (pointerId=1) 座標変化 pointerrawupdate (pointerId=1) 1 つの coalesced イベントを伴う
pointer (pointerId=2) 座標変化 pointerrawupdate (pointerId=2) 1 つの coalesced イベントを伴う
pointer (pointerId=2) 座標変化 pointerrawupdate (pointerId=2) 1 つの coalesced イベントを伴う
pointer (pointerId=1) 座標変化 pointerrawupdate (pointerId=1) 1 つの coalesced イベントを伴う
pointer (pointerId=2) 座標変化 pointerrawupdate (pointerId=2) 1 つの coalesced イベントを伴う
pointer (pointerId=1) ボタン押下 pointermove (pointerId=1) 2 つの coalesced イベントを伴う
pointermove (pointerId=2) 4 つの coalesced イベントを伴う
pointerdown (pointerId=1) 0 個の coalesced イベントを伴う
pointer (pointerId=2) 座標変化 pointerrawupdate (pointerId=2) 1 つの coalesced イベントを伴う
pointer (pointerId=2) 座標変化 pointerrawupdate (pointerId=2) 1 つの coalesced イベントを伴う
pointer (pointerId=1) ボタン解放 pointermove (pointerId=2) 2 つの coalesced イベントを伴う
pointerup (pointerId=1) 0 個の coalesced イベントを伴う

12.2 Predicted イベント

いくつかの user agent には、確認済みの一連のポインタ移動の後で、(現在のジェスチャーに対する先行イベント、および移動の速度/軌跡に基づいて)将来のポインタ移動位置がどこになりそうかを予測できる組み込みアルゴリズムがある。アプリケーションは、この情報を getPredictedEvents メソッドで利用し、知覚レイテンシを減らすために予測位置へ先回りして「描画」し、その後、実際の点が受信されたらこれらの予測点を破棄できる。

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

PointerEvent には、関連付けられた predicted events list(0 個以上の PointerEvent のリスト)がある。信頼された pointermove イベントについて、これは user agent が将来そのイベントに続くと予測する PointerEvent の列である。他のすべての信頼されたイベント種別については空リストである。信頼されないイベントは、その predicted events list がコンストラクタに渡された値で初期化される。

注記

pointerrawupdate イベントは空でない coalesced events list を持ちうるが、性能上の理由から、その predicted events list は通常は空リストになる。

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

リスト内のイベント数、およびそれらが現在のタイムスタンプからどれほど先かは、user agent と、その予測アルゴリズムにより決定される。

信頼されたイベントの predicted events list 内のイベントは、次を持つ:

注記

作者は、予測イベントを、次の pointer event がディスパッチされるまでの間のみ有効な予測として考慮すべきである。user agent がどれほど将来まで予測するかによっては、通常の pointer event が、1 つ以上の予測イベントのタイムスタンプよりも早くディスパッチされることがあり得る。

Example 15: coalesced イベントおよび predicted イベントを用いた描画の概念的アプローチ

let predicted_points = [];
window.addEventListener("pointermove", function(event) {
    // 以前に描画した predicted 点をクリアする。
    for (let e of predicted_points.reverse()) {
        clearPoint(e.pageX, e.pageY);
    }

    // 最後に受信したイベント以降に起きた実際の動きを描画する。
    for (let e of event.getCoalescedEvents()) {
        drawPoint(e.pageX, e.pageY);
    }

    // 遅延の知覚を減らすために、現在の predicted 点を描画する。
    predicted_points = event.getPredictedEvents();
    for (let e of predicted_points) {
        drawPoint(e.pageX, e.pageY);
    }
});

12.3 coalesced および predicted events list の設定と維持

信頼された PointerEvent が作成されるとき、user agent は、coalesced events list および predicted events list 内の各イベントについて、次の手順を実行すべきである(SHOULD):

  1. イベントの pointerId pointerTypeisPrimary および isTrusted を、「親」ポインタイベントの各プロパティと一致するよう設定する。
  2. イベントの cancelable および bubbles を false に設定する(これらのイベントは単独では決してディスパッチされないため)。
  3. イベントの coalesced events list および predicted events list を空リストに設定する。
  4. その他のすべての属性を、既定の PointerEvent 値へ初期化する。

信頼された PointerEventtarget が変更されたとき、user agent は、coalesced events list および predicted events list 内の各イベントについて、次のとおり行うべきである(SHOULD):

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

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

今日存在する Web コンテンツの大多数は、Mouse Events に対してのみコード化されている。以下では、このコンテンツとの互換性のために、user agent が汎用ポインタ入力をマウスイベントへマップしてよい(MAY)方法のアルゴリズムを述べる。

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

注記

高レベルでは、互換マウスイベントは、それぞれ対応する pointer event と「インタリーブ」されることが意図されている。しかし、この特定の順序は必須ではなく、互換マウスイベントを実装する user agent は、それらの相対順序が一貫している限り、マウスイベントのディスパッチを遅延させたりグループ化したりすることを選んでもよい(MAY)。

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

互換マウスイベントのサポートの有無にかかわらず、user agent は常に clickauxclick、および contextmenu イベントをサポートしなければならない(MUST)。なぜなら、これらのイベントは PointerEvent 型であり、したがって 互換マウスイベントではないためである。pointer event 中に preventDefault を呼び出しても、clickauxclick、または contextmenu が発火されるかどうかに影響してはならない(MUST NOT)。

注記

これら高レベルイベントのいくつか(contextmenufocusblur など)と pointer event の相対順序は未定義であり、user agent 間で異なる。例えば、ある user agent では contextmenupointerup の後に続くことが多い一方、別の user agent では pointeruppointercancel に先行することが多く、また状況によっては対応する pointer event なしに発火することもある(例えばキーボード操作の結果として)。

加えて、user agent は、clickauxclick、または contextmenu イベントを発火すべきかどうかを決定するために独自のヒューリスティクスを適用しうる。同一種別の他の(非 primary)ポインタが存在する場合、または異なる種別の他の primary ポインタが存在する場合に、これらのイベントを発火しないことを選ぶ user agent もある。user agent は、特定の動作が「クリーン」なタップ、クリック、またはロングプレスではない(例えば、タッチスクリーン上の指の相互作用が、指が画面に接触している間に動きすぎる場合)と判断し、clickauxclick、または contextmenu イベントを発火しない決定をしうる。user agent の挙動のこれらの側面は、この仕様では定義されず、実装間で異なりうる。

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

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

マウスイベントは、ポインタが down のときにのみ防止できる。ホバーするポインタ(例:ボタンが押されていないマウス)は、マウスイベントを防止できない。

mouseovermouseoutmouseentermouseleave イベントは、(ポインタが down であっても)決して防止されない。

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

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

primary pointers だけが互換マウスイベントを生成できる一方で、複数の primary pointers が同時にアクティブになりえ、それぞれが自身の互換マウスイベントを生成できる。MouseEvents に依存するスクリプトとの互換性のため、マウス遷移イベント(mouseovermouseoutmouseenter および mouseleave)は、単一のレガシーマウス入力の移動をシミュレートすべきである(SHOULD)。これは、[UIEVENTS] に従い、すべてのイベントターゲットの entry/exit 状態が有効であることを意味する。user agent は、文書内で レガシーマウスポインタの実効位置 を以下のとおり維持することで、これを保証するべきである(SHOULD)。

pointerdownpointerup、または pointermove イベント、あるいは window における pointerleave イベントを発火する直前に、user agent は次の手順を実行すべきである(SHOULD):

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

レガシーマウスポインタの実効位置は、ポインタ遷移イベント(pointeroverpointeroutpointerenter および pointerleave)から対応するレガシーマウス遷移イベント(mouseovermouseoutmouseenter および mouseleave)への直接マッピングを常に持てるわけではないという事実をモデル化する。以下のアニメーションは、2 つの primary pointer を単一のレガシーマウス入力で整合させるために、user agent がポインタ遷移イベントよりも多くのレガシーマウス遷移イベントをディスパッチする必要があるケースを示す。

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

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

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

user agent がホバーをサポートするデバイスに対して pointer event をディスパッチする場合は常に、次の手順を実行すべきである(SHOULD):

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

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

多くのタッチスクリーンなどのいくつかのデバイスは、アクティブ状態にない間に座標(または座標集合)をホバーできない。マウスイベントにコード化された既存コンテンツの多くは、マウスがイベントを生成すると仮定しており、したがって一般に次の性質が真である:

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

このため user agent は、これら種別の入力デバイスに対して異なるマッピングを提供する必要がある。user agent が ホバーをサポートしないデバイスに対して pointer event をディスパッチする場合は常に、次の手順を実行すべきである(SHOULD):

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

user agent が Touch Events([TOUCH-EVENTS] で定義)と Pointer Events の両方をサポートする場合、user agent は、この節で述べた互換マウスイベントと、[TOUCH-EVENTS] に概説されている fallback mouse events の両方を生成してはならない(MUST NOT)。

注記

ホバーをサポートしない primary pointer(例:タッチスクリーン上の単一の指)による要素のアクティベーション(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 イベントの canceled flag が設定された場合、イベントシーケンスは次のとおりになる:

  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、およびイベントの実装から直接生じるセキュリティ/プライバシー問題に限定される。

この仕様で定義される多くのイベント種別は、ユーザーの操作に応答してディスパッチされる。これは悪意あるイベントリスナーが、ユーザーが通常は機密とみなす情報(例:ページと相互作用している間のユーザーのマウス/スタイラス/指の正確な経路/動き)へアクセスすることを可能にする。

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

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

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

この仕様は、作者が「predicted events」へアクセスできる方法を定義する。この仕様自体は、user agent が予測に用いるべきアルゴリズムを定義しない。仕様の作者は、アルゴリズムはユーザーが実行している現在のジェスチャーに関連する先行 pointer event にのみ依存することを想定している。予測アルゴリズムの具体的実装が、追加データ(例えば、異なるサイトにわたるユーザーの完全な相互作用履歴)に依存せず、ユーザーに関する機微情報を露呈したり、「フィンガープリント」作成および追跡に利用されたりしないことを保証する責任は、user agent にある。

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

15. 用語集

この節は非規範である。

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

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

対照的に pointerIdpointerTypeisPrimary、および [UIEVENTS] の Mouse Event モデルプロパティである buttonbuttonsctrlKeyshiftKeyaltKeymetaKey は、センサーデータに関係しないため measurable properties とは見なされない。

pointer
マウス、ペン、またはタッチ接触のように、画面上の特定座標(または座標集合)をターゲットにできる入力デバイスの、ハードウェア非依存の表現。
rotation
WheelEvent インターフェイスを用いる入力デバイス上の増分変化の指示。いくつかのデバイスでは、これは文字どおりホイールの回転であるかもしれない(MAY)。一方で別のデバイスでは、平面上の移動、または特定ボタンへの圧力であるかもしれない(MAY)。
topmost event target
topmost event target は、描画順序において最上位であり、target になりうる要素でなければならない(MUST)。グラフィカルユーザーインターフェイスでは、これはユーザーのポインティングデバイスの下にある要素である。ターゲットを決定するために、ユーザーインターフェイスの hit testing 機能が用いられる。hit testing およびスタック順序に関する具体的詳細については、host language を参照。

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

この節は規範である。 以下の機能は廃止されており、レガシーソフトウェアとの互換性を必要とする user agents によってのみ実装されるべきである。また、[UIEvents] における legacy event initializers も参照。

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

WebIDLpartial 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);
};
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. 謝辞

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

過去にマウスおよびホイールイベントの面倒を見てくれた方々に感謝する: Gary Kacmarcik, Travis Leithead、そして 長年にわたるさまざまな 貢献者

このモデルの第 1 版を先駆けて成立させるのを助けてくれた方々、特に次の方々に特別な感謝を表する: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 Draft の完全な改訂履歴も参照。

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

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

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オーバーフロー・モジュール レベル3。Elika Etemad;Florian Rivoal。W3C。2025年10月7日。W3C作業草案。URL: https://www.w3.org/TR/css-overflow-3/
[css-position]
CSS配置レイアウト・モジュール レベル3。Elika Etemad;Tab Atkins Jr。W3C。2025年10月7日。W3C作業草案。URL: https://www.w3.org/TR/css-position-3/
[CSS21]
カスケーディングスタイルシート レベル2 改訂1版(CSS 2.1)仕様。Bert Bos;Tantek Çelik;Ian Hickson;Håkon Wium Lie。W3C。2011年6月7日。W3C勧告。URL: https://www.w3.org/TR/CSS2/
[CSSOM-View]
CSSOMビュー・モジュール。Simon Fraser;Emilio Cobos Álvarez。W3C。2025年9月16日。W3C作業草案。URL: https://www.w3.org/TR/cssom-view-1/
[DOM]
DOM標準。Anne van Kesteren。WHATWG。リビングスタンダード。URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript言語仕様。Ecma International。URL: https://tc39.es/ecma262/multipage/
[HTML]
HTML標準。Anne van Kesteren;Domenic Denicola;Dominic Farolino;Ian Hickson;Philip Jägenstedt;Simon Pieters。WHATWG。リビングスタンダード。URL: https://html.spec.whatwg.org/multipage/
[HTML401]
HTML 4.01仕様。Dave Raggett;Arnaud Le Hors;Ian Jacobs。W3C。2018年3月27日。W3C勧告。URL: https://www.w3.org/TR/html401/
[infra]
Infra標準。Anne van Kesteren;Domenic Denicola。WHATWG。リビングスタンダード。URL: https://infra.spec.whatwg.org/
[PointerEvents]
Pointer Events(ポインターイベント)。Patrick Lauke;Robert Flack。W3C。2026年2月11日。W3C作業草案。URL: https://www.w3.org/TR/pointerevents4/
[PointerLock]
ポインターロック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/rfc/rfc2119
[RFC8174]
RFC2119キーワードにおける大文字と小文字の曖昧性。B. Leiba。IETF。2017年5月。最良現行運用。URL: https://www.rfc-editor.org/rfc/rfc8174
[TOUCH-EVENTS]
タッチイベント。Doug Schepers;Sangwhan Moon;Matt Brubeck;Arthur Barstow。W3C。2013年10月10日。W3C勧告。URL: https://www.w3.org/TR/touch-events/
[UIEVENTS]
UIイベント。Xiaoqian Wu。W3C。2026年2月21日。W3C作業草案。URL: https://www.w3.org/TR/uievents/
[UIEvents-Key]
UI Events KeyboardEvent key値。Travis Leithead;Gary Kacmarcik。W3C。2025年4月22日。W3C勧告。URL: https://www.w3.org/TR/uievents-key/
[WEBDRIVER-BIDI]
WebDriver BiDi。James Graham;Alex Rudenko;Maksim Sadym。W3C。2026年2月25日。W3C作業草案。URL: https://www.w3.org/TR/webdriver-bidi/
[WEBIDL]
Web IDL標準。Edgar Chen;Timothy Gu。WHATWG。リビングスタンダード。URL: https://webidl.spec.whatwg.org/

D.2 参考(参考情報)

[COMPAT]
Compatibility Standard. Mike Taylor. WHATWG. Living Standard. URL: https://compat.spec.whatwg.org/
[PointerEvents3]
Pointer Events. Patrick Lauke; Robert Flack. W3C. 13 February 2026. CRD. URL: https://www.w3.org/TR/pointerevents3/
[WCAG22]
Web Content Accessibility Guidelines (WCAG) 2.2. Michael Cooper; Andrew Kirkpatrick; Alastair Campbell; Rachael Bradley Montgomery; Charles Adams. W3C. 12 December 2024. W3C Recommendation. URL: https://www.w3.org/TR/WCAG22/