関連して 翻訳も参照してください。
Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
本仕様の機能は、ポインターイベントに含まれる機能を拡張または修正します。ポインターイベントは、マウス、ペン、タッチスクリーンなど、ハードウェアに依存しないポインター入力の取り扱いのためのイベントおよび関連インターフェースを記述したW3C勧告です。既存のマウスベースのコンテンツとの互換性のために、本仕様では他のポインター入力機器タイプにおいてもマウスイベントを発火させるマッピングについても記載しています。
この節では、この文書が公開された時点での ステータスを説明します。現在のW3C 公開文書の一覧およびこの技術レポートの最新版は、 W3C標準および草案 インデックスにあります。
この仕様は、[PointerEvents2]の更新版です。
この改訂には、次の新機能が含まれます:
altitudeAngleazimuthAnglepointerrawupdateイベント、高頻度
イベント向けこの改訂には、次の明確化も含まれます:
pointerIdを割り当てる方法における戦略とアプローチclick、
auxclick、およびcontextmenuイベントとの関係Pointer Eventsのこの改訂版は、[PointerEvents2]を置き換えます。
この文書は、Pointer Events Working Groupによって、 勧告 トラックを使用した勧告として公開されました。
W3Cは、この仕様をWebの標準として広く展開することを 推奨します。
W3C勧告とは、広範な 合意形成を経た後、 W3Cおよびそのメンバーによって承認され、 Working Groupメンバーから、実装に対する ロイヤリティフリーのライセンス許諾 の確約がある仕様です。
この文書は、 W3C 特許 ポリシーの下で活動するグループによって作成されました。 W3Cは、 グループの成果物に関連して行われた あらゆる特許開示の公開リスト を維持しています。そのページには、 特許を開示するための手順も含まれています。ある個人が、 その個人が 必須請求項 を含むと考える特許について実際の知識を有している場合、 その情報を W3C特許ポリシー第6節に従って開示しなければなりません。
この文書は、 2025年8月18日付W3Cプロセス文書に準拠します。
このセクションは規範的ではありません。
今日、ほとんどの [HTML] コンテンツはマウス入力とともに使用され、かつ/またはマウス入力向けに設計されている。入力を カスタムな方法で処理するものは、通常 [POINTEREVENTS4] Mouse Events に合わせてコードを書く。しかし、 今日のより新しいコンピューティングデバイスは、タッチスクリーンやペン入力を含む、他の形式の入力を組み込んでいる。 これらの入力形式を個別に処理するためのイベント型が提案されてきた。しかし、その アプローチでは、新しい入力型のサポートを追加するときに、ロジックとイベント処理のオーバーヘッドが不必要に重複することが多い。 これは、1 種類のデバイス型だけを念頭に置いてコンテンツが書かれている場合に、互換性の問題を生じさせることが多い。 さらに、既存のマウスベースのコンテンツとの互換性のために、ほとんどのユーザーエージェントは、すべての入力型に対して Mouse Events を発火する。 これにより、Mouse Event が実際のマウスデバイスを表しているのか、互換性のために 別の入力型から生成されているのかが曖昧になり、両方のデバイス型に同時に対応するコードを書くことが難しくなる。
複数の入力型に対応するコードを書くコストを削減し、また上で説明した Mouse Events に関する曖昧さに対処するために、 この仕様は、ポインターと呼ばれる、より抽象的な入力形式を定義する。ポインターは、 マウスカーソル、ペン、タッチ(マルチタッチを含む)、またはその他のポインティング 入力デバイスによって画面上に作られる任意の接触点でありうる。このモデルにより、ユーザーがどのような ハードウェアを持っているかに関わらず適切に動作するサイトやアプリケーションを書きやすくなる。デバイス固有の処理が望まれるシナリオのために、この仕様はまた、 イベントを生成したデバイス型を調べるためのプロパティも定義する。主な目標は、クロスデバイスのポインター入力に対するより容易なオーサリングを可能にする 単一のイベントおよびインターフェイスの集合を提供しつつ、拡張された体験に必要な場合にのみ デバイス固有の処理も可能にすることである。
追加の重要な目標は、マルチスレッドのユーザーエージェントが、パンおよびズームのための直接操作 アクション(たとえば、タッチスクリーン上の指やスタイラスによるもの)を、スクリプト実行でブロックされることなく処理できるようにすることである。
この仕様はさまざまなポインター入力のための統一イベントモデルを定義するが、このモデルは キーボードやキーボードに似たインターフェイスなどの他の形式の入力(たとえば、 タッチスクリーンのみのデバイス上で動作し、ユーザーがフォーカス可能なコントロールおよび要素を順次ナビゲーションできるようにする スクリーンリーダーまたは同様の支援技術)を対象としていない。ユーザーエージェントが これらのインターフェイスに応じてポインターイベントも生成することを選ぶ可能性はあるが、このシナリオは この仕様では対象としない。
第一に、作者は focus、blur、および
click などの高水準イベントに応答することで、すべての形式の
入力に対して同等の機能を提供することが推奨される。しかし、低水準イベント(Pointer Events など)を使用する場合、作者は
すべての種類の入力がサポートされることを確保することが推奨される。キーボードおよび
キーボードに似たインターフェイスの場合、これは明示的なキーボードイベント処理の追加を必要とする可能性がある。詳細については、
キーボードアクセス可能 [WCAG22] を参照。
汎用的なポインター入力のためのイベントは、マウスのイベントと非常によく似ています:pointerdown、
pointermove、pointerup、pointerover、pointeroutなどです。これにより、Mouse EventsからPointer
Eventsへの容易な移行が可能となります。
Pointer Eventsは、Mouse
Eventsと同様にclient座標、ターゲット要素、ボタンの状態などのプロパティに加え、他の入力形態に合わせて圧力や接触ジオメトリ、傾きなど新たなプロパティも提供します。著者はPointer
Eventsを利用して、入力種別ごとに適宜ロジックを共通化したり、必要に応じて特定の入力タイプ向けの最適化も容易に行えます。
Pointer Eventsはさまざまな入力機器から発生しますが、他のデバイス固有のイベントから生成されるものと定義されているわけではありません。互換性のために推奨される場合もありますが、本仕様では他のデバイス固有イベント(マウスイベントやタッチイベント等)のサポートを義務付けていません。ユーザーエージェントはPointer Eventsのみをサポートし、他のデバイスイベントをサポートしなくてもかまいません。マウス固有イベント向けに書かれたコンテンツとの互換性のため、本仕様ではマウス以外の機器からのポインター入力を元に互換性マウスイベントを生成する方法についても、参考として記載しています。
本仕様は、[TOUCH-EVENTS] で定義されるTouch EventsとPointer Eventsの両方に対応するユーザーエージェントの動作について助言するものではありません。これら2つの仕様の関係についての詳細は、Touch Events Community Groupを参照してください。
非規範的と記載されたセクションのほか、本仕様におけるすべての著者指針、図式、例、および注記は規範的ではありません。それ以外は全て規範的内容です。
この文書における MAY、MUST、MUST NOT、OPTIONAL、SHOULD というキーワードは、 BCP 14 [RFC2119]および [RFC8174] で示されるとおり、ここに示すようにすべて大文字で現れる場合に、かつその場合にのみ解釈されます。
このセクションは規範的ではありません。
以下に、本仕様のAPIの一部の使用例を示します。より具体的な例は、各該当セクションにも記載されています。
/* Pointer Events または従来の touch/mouse にバインドする */
if (window.PointerEvent) {
// Pointer Events がサポートされている場合は pointer 系のみをリッスン
target.addEventListener("pointerdown", function(e) {
// 必要に応じてe.pointerTypeで入力タイプごとにロジックを分岐
// (touch/pen/mouseごとの処理)
...
});
...
} else {
// 従来の touch/mouse 用イベントハンドラ
target.addEventListener('touchstart', function(e) {
// 互換マウスイベントやclickの発生を防ぐ
e.preventDefault();
...
});
...
target.addEventListener('mousedown', ...);
...
}
// キーボード対応用のイベントリスナー追加など
...
window.addEventListener("pointerdown", detectInputType);
function detectInputType(event) {
switch(event.pointerType) {
case "mouse":
/* マウス入力 */
break;
case "pen":
/* ペン/スタイラス入力 */
break;
case "touch":
/* タッチ入力 */
break;
default:
/* pointerTypeが空(検出不可)またはUA固有カスタムタイプ */
}
}
<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>
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);
WebIDLdictionary PointerEventInit : MouseEventInit {
long pointerId = 0;
double width = 1;
double height = 1;
float pressure = 0;
float tangentialPressure = 0;
long tiltX;
long tiltY;
long twist = 0;
double altitudeAngle;
double azimuthAngle;
DOMString pointerType = "";
boolean isPrimary = false;
sequence<PointerEvent> coalescedEvents = [];
sequence<PointerEvent> predictedEvents = [];
};
[Exposed=Window]
interface PointerEvent : MouseEvent {
constructor(DOMString type, optional PointerEventInit eventInitDict = {});
readonly attribute long pointerId;
readonly attribute double width;
readonly attribute double height;
readonly attribute float pressure;
readonly attribute float tangentialPressure;
readonly attribute long tiltX;
readonly attribute long tiltY;
readonly attribute long twist;
readonly attribute double altitudeAngle;
readonly attribute double azimuthAngle;
readonly attribute DOMString pointerType;
readonly attribute boolean isPrimary;
[SecureContext] sequence<PointerEvent> getCoalescedEvents();
sequence<PointerEvent> getPredictedEvents();
};
pointerIdイベントを引き起こしたポインターの一意な識別子。ユーザーエージェントは、プライマリマウスポインターのために汎用のpointerId値
0 または 1を予約してもよい(MAY)。pointerId値
-1は予約され、ポインティングデバイス以外によって生成されたイベントを示すために使用しなければならない(MUST)。その他のポインターについて、ユーザーエージェントはpointerId値の割り当て方法において、さまざまな戦略や手法を実装してもよい。なお、アクティブなポインターは[HTML]で定義されるトップレベル閲覧コンテキスト内で一意でなければならず、識別子は他のトップレベル閲覧コンテキストに影響されてはならない(MUST
NOT)。(すなわち、あるトップレベル閲覧コンテキストは、そのポインターが閲覧コンテキスト外に移動して別のトップレベル閲覧コンテキストに入ったときに、同じpointerIdになると仮定できない)。
ユーザーエージェントは、過去のアクティブなポインターからすでに引退したpointerIdを再利用してもよい(MAY)。または、特定のポインティングデバイスに対して常に同じpointerIdを再使用してもよい(たとえば、マルチユーザーの協調アプリケーションで特定ユーザーの特定のペン/スタイラス入力を一意に識別するため)。ただし後者の場合、フィンガープリントやページ/ドメイン間の追跡の可能性を最小化するために、そのpointerIdは当該ページ/セッションの存続期間において明示的にその特定のポインティングデバイスのみに紐づくべきであり(MUST)、そのデバイスが新しいセッションで再び使用される際には新たにランダム化されたpointerIdを選ばなければならない(MUST)。
widthポインターの接触ジオメトリの、CSS ピクセル([CSS21]参照)におけるX軸方向の大きさ。与えられたポインターに対して、この値は各イベントで更新されてもよい(MAY)。通常、接触ジオメトリを持たない入力(伝統的なマウスなど)や、ハードウェアが実際のジオメトリを検出しない場合、ユーザーエージェントはデフォルト値1を返さなければならない(MUST)。
heightポインターの接触ジオメトリの、CSS ピクセル([CSS21]参照)におけるY軸方向の大きさ。与えられたポインターに対して、この値は各イベントで更新されてもよい(MAY)。通常、接触ジオメトリを持たない入力(伝統的なマウスなど)や、ハードウェアが実際のジオメトリを検出しない場合、ユーザーエージェントはデフォルト値1を返さなければならない(MUST)。
pressureポインター入力の正規化された圧力を[0,1]の範囲で表す。0と1はそれぞれ、ハードウェアが検出可能な最小および最大圧力を表す。圧力をサポートしないハードウェアやプラットフォームでは、アクティブボタン状態のとき値は0.5、それ以外は0でなければならない(MUST)。
tangentialPressureポインター入力の正規化された接線圧(別名バレル圧)。範囲は[-1,1]で、0はコントロールの中立位置を意味する。ハードウェアによっては[0,1]の正の値のみをサポートする場合がある。接線圧をサポートしないハードウェアやプラットフォームでは、値は0でなければならない(MUST)。
tiltXY-Z平面と、トランスデューサ(例:ペン/スタイラス)の軸とY軸を含む平面とのなす角(度単位、[-90,90]の範囲)。正のtiltXは右方向(X値が増加する方向)。tiltXはtiltYと組み合わせて、デジタイザに対するトランスデューサの法線からの傾きを表現できる。傾きや角度を報告しないハードウェアやプラットフォームでは、値は0でなければならない(MUST)。
tiltX。
tiltYX-Z平面と、トランスデューサ(例:ペン/スタイラス)の軸とX軸を含む平面とのなす角(度単位、[-90,90]の範囲)。正のtiltYはユーザー側(Y値が増加する方向)。tiltYはtiltXと組み合わせて、デジタイザに対するトランスデューサの法線からの傾きを表現できる。傾きや角度を報告しないハードウェアやプラットフォームでは、値は0でなければならない(MUST)。
tiltY。
twistトランスデューサ(例:ペン/スタイラス)が自身の主軸の周りに回転する時計回りの角度(度単位、[0,359]の範囲)。ツイストを報告しないハードウェアやプラットフォームでは、値は0でなければならない(MUST)。
altitudeAngleトランスデューサ(例:ペン/スタイラス)の仰角(ラジアン)。範囲は[0,π/2]で、0は表面(X-Y平面)と平行、π/2は表面に垂直。傾きや角度を報告しないハードウェアやプラットフォームでは、値はπ/2でなければならない(MUST)。
altitudeAngle のデフォルト値は π/2
で、トランスデューサが表面に対して垂直であることを意味します。これは Touch
Events - Level
2 仕様の altitudeAngle プロパティの定義(デフォルト値が 0)とは異なります。
altitudeAngle が π/4(X-Y 平面から45度)。azimuthAngleトランスデューサ(例:ペン/スタイラス)の方位角(ラジアン)。範囲は[0, 2π]で、0はX-Y平面上でキャップがX値増加方向(真上から見て「3時」方向)を向く状態を表し、時計回りに値が増加する(「6時」でπ/2、「9時」でπ、「12時」で3π/2)。トランスデューサが表面に完全に垂直(altitudeAngle
が π/2)な場合、値は0でなければならない(MUST)。傾きや角度を報告しないハードウェアやプラットフォームでは、値は0でなければならない(MUST)。
azimuthAngle が π/6(「4時」)。pointerTypeイベントを発生させたデバイス種別(マウス、ペン、タッチなど)を示します。ユーザー
エージェントがマウス、
ペン/スタイラス、またはタッチ入力デバイスに対してポインターイベントを発火する場合、
pointerTypeの値は、次の表に従わなければなりません:
| ポインターデバイス種別 | pointerType値 |
|---|---|
| マウス | mouse |
| ペン / スタイラス | pen |
| タッチ接触 | touch |
デバイス種別をユーザーエージェントが検出できない場合、その値は空文字列で
なければなりません。ユーザーエージェントが上記に列挙されていないポインターデバイス
種別をサポートする場合、異なる
デバイス種別の名前の衝突を避けるため、pointerTypeの値にはベンダープレフィックスを付ける
べきです。将来の仕様は、他のデバイス種別に対して追加の
規範値を提供することがあります。
pointerTypeをどのように使用できるかの基本的な
デモについては、例2を参照してください。また、開発者は、
独自のカスタムpointerType値を
実装している可能性のあるユーザーエージェントや、
pointerTypeが単に空文字列である状況に対応するため、
何らかの既定の処理を含めるべきであることにも注意してください。
isPrimaryそのポインターが、このポインター種別の主要ポインターを表すかどうかを示します。
getCoalescedEvents()合成イベントの一覧を返すメソッドです。
getPredictedEvents()予測イベントの一覧を返すメソッドです。
PointerEventInit 辞書は、PointerEvent インターフェイスのコンストラクターによって、
信頼されない(合成)ポインターイベントを構築するための仕組みを提供するために使用される。これは、現在
[POINTEREVENTS4] で定義される MouseEventInit
辞書から継承する。信頼されないポインターイベントを発火する方法を示すサンプルコードについては、例を参照。
PointerEvent のイベント
構築ステップは、PointerEventInit のcoalescedEventsを合体イベントリストへ複製し、
PointerEventInit のpredictedEventsを予測イベントリストへ複製する。
PointerEvent インターフェイスは、Pointer Events で定義される MouseEvent
から継承する。
また、CSSOM View Module
における提案された拡張にも注意。これは、
小数座標を許容するために、各種座標プロパティを long
から double へ変更する。この提案された拡張を
PointerEvent についてすでに実装しているが、通常の
MouseEvent
については実装していない
ユーザーエージェントには、
click、
auxclick、および contextmenu イベントに関して追加の要件がある。
マルチポインター(例:マルチタッチ)のシナリオでは、isPrimary プロパティは、各ポインタータイプのアクティブなポインター集合の中からマスターポインターを識別するために使用される。
pointerType
ごとに1つ)がプライマリと見なされる。例:タッチ接触とマウスカーソルが同時に動いた場合、両方ともプライマリと見なされる。isPrimary を false として他のポインターのイベントを発火してもよい(MAY)。
ポインターイベントを発火することは、e という名前のイベントを発火し、PointerEvent を用いて、PointerEvent インターフェースおよび 属性とデフォルトアクションで定義されるとおりに属性を設定することを意味する。
イベントが gotpointercapture、lostpointercapture、click、auxclick、contextmenu
のいずれでもない場合、この PointerEvent に対して 保留中のポインターキャプチャの処理手順を実行する。
イベントが発火されるターゲットを次のようにして決定する:
targetDocument を、ターゲットの ノードドキュメント [DOM] とする。
イベントが pointerdown、pointermove、または pointerup の場合、当該イベントの アクティブドキュメントを、そのイベントのpointerIdに対して
targetDocument に設定する。
イベントが pointerdown で、関連デバイスが直接操作デバイスであり、ターゲットが Element の場合、ポインターキャプチャを設定し、当該pointerIdのターゲット要素に対して 暗黙のポインターキャプチャとして記述されるとおりに設定する。
このイベントを発火する前に、ユーザーエージェントは、イベント順序を確保する
[POINTEREVENTS4] 目的で、ポインティングデバイスが
previousTarget から対象上へ移動したかのように、その対象を扱うべきである(SHOULD)。
needsOverEvent フラグが設定されている場合、対象要素が同じであっても、pointerover イベントが必要である。
決定したターゲットにイベントを発火する。
決定したターゲットを該当ポインターの previousTarget として保存し、needsOverEvent フラグを false
にリセットする。previousTarget が、ある時点で [DOM] の connected でなくなる場合、previousTarget
を、previousTarget へのイベントディスパッチに対応するイベントパスに従って、いまだ connected [DOM]
である最も近い親に更新し、needsOverEvent フラグを true に設定する。
本仕様で定義されるイベントタイプの bubbles および cancelable
プロパティとデフォルトアクションは、以下の表に示す。各イベントタイプの詳細は ポインターイベントの種類 を参照。
| イベント種別 | バブルする | キャンセル可能 | 既定の動作 |
|---|---|---|---|
pointerover |
はい | はい | なし |
pointerenter |
いいえ | いいえ | なし |
pointerdown |
はい | はい | 場合による: ポインターが主要ポインターである場合、
mousedownイベントのすべての既定の動作
このイベントをキャンセルすると、後続の互換マウス イベントの発火も防止されます。 |
pointermove |
はい | はい | 場合による: ポインターが主要ポインターである場合、
mousemoveのすべての既定の動作
|
pointerrawupdate |
はい | いいえ | なし |
pointerup |
はい | はい | 場合による: ポインターが主要ポインターである場合、mouseupのすべての既定の動作
|
pointercancel |
はい | いいえ | なし |
pointerout |
はい | はい | なし |
pointerleave |
いいえ | いいえ | なし |
gotpointercapture |
はい | いいえ | なし |
lostpointercapture
|
はい | いいえ | なし |
ビューポートの操作(パンやズーム)— 一般には 直接操作 の結果として発生する —
は、意図的にポインターイベントのデフォルトアクションではない。つまり、これらの挙動(例:タッチスクリーン上で指を動かすことによるページのパン)は、ポインターイベントをキャンセルしても抑制できない。著者は代わりに
touch-action を用いて、文書領域に対して明示的に 直接操作の挙動
を宣言しなければならない。イベントキャンセルへの依存を取り除くことで、ユーザーエージェントによるパフォーマンス最適化が容易になる。
pointerenter および pointerleave イベントについては、composed
[DOM] 属性は false であるべきである(SHOULD)。上記の他のすべてのポインターイベントでは、属性は true であるべきである(SHOULD)。
上記のすべてのポインターイベントについて、[UIEVENTS] の detail 属性は 0
であるべきである(SHOULD)。
fromElement および
toElement を公開している。そのようなユーザーエージェントには、作者を標準化された代替
(target および relatedTarget)の使用へ移行させるために、
PointerEvents におけるそれらの(継承された)属性の値を
null に設定することを推奨する。
MouseEvent の relatedTarget
と同様に、
relatedTarget は、ポインターがちょうどその境界を離れた要素(pointerover または pointerenter
イベントの場合)、またはポインターがその境界へ入ろうとしている要素(pointerout または pointerleave
の場合)に初期化されるべきである。他のポインターイベントでは、
この値は既定で null になる。要素がポインターキャプチャを受け取ると、そのポインターに対する
以降のすべてのイベントは、キャプチャしている要素の境界内にあるとみなされることに注意。
gotpointercapture および lostpointercapture
イベントについては、上の表で定義された属性以外のすべての属性は、ユーザーエージェントが 保留中のポインターキャプチャの処理手順を実行して gotpointercapture および lostpointercapture
を発火する原因となったポインターイベントと同じであるべきである。
ユーザーエージェントは、ポインターキャプチャを暗黙的に解除する場合や、gotpointercapture や lostpointercapture
以外のポインターイベントを発火する場合に、以下の手順を実行しなければならない(MUST)。
lostpointercapture
という名前のポインターイベントを ポインターキャプチャのターゲット上書きノードで発火する。
gotpointercapture という名前のポインターイベントを
保留中のポインターキャプチャのターゲット上書きで発火する。
click・auxclick・contextmenu
イベントのセクションで定義されるとおり、lostpointercapture
イベントがディスパッチされた後でも、対応する
click、auxclick、contextmenu(該当するもの)がキャプチャ先のターゲットにディスパッチされる。
ユーザーエージェントは、特定の pointerId
に関するポインターイベントを、そのウェブページが引き続き受け取る可能性が低いと検出した場合、MUST ポインターイベントストリームを抑制しなければならない。次のいずれかのシナリオがこの条件を満たす(他にもシナリオが存在してもMAY)。
touch-action CSS
プロパティのセクションを参照。
その他、ユーザーエージェントがMAY ポインターイベントストリームを抑制するシナリオには、以下が含まれる:
これらのシナリオを検出する方法は本仕様の範囲外である。
ユーザーエージェントは、MUST 次の手順を実行して ポインターイベントストリームを抑制しなければならない。
pointercancel イベントを発火する。pointerout イベントを発火する。pointerleave イベントを発火する。画面表面に対する相対移動があった、またはいずれかのプロパティに変化があったポインティングデバイスは、ポインターイベントの種類で定義されるさまざまなイベントを発火する。静止したポインティングデバイス(画面表面に対して移動せず、いずれのプロパティにも変化がない)に対しては、ポインターのヒットテストターゲットに影響するレイアウト変更の後に、ユーザーエージェントはMUST
特定の境界イベントを発火しなければならない。詳細は pointerover、pointerenter、pointerout、pointerleave を参照。ユーザーエージェントは、パフォーマンス上の理由(例:ヒットテスト過多や、境界イベントリスナーによるレイアウト変更の多発を避けるため)により、これらの境界イベントの発火を遅延してもMAY。
pointermove イベントを発火することはない。Pointer Events には、トランスデューサの X-Y 平面に対する向きを表現するための相補的な2組の属性が含まれる。すなわち、(元の Pointer Events
仕様で導入された)tiltX / tiltY と、(Touch Events - Level 2
仕様から採用された)azimuthAngle / altitudeAngle である。
特定のハードウェアやプラットフォームに応じて、ユーザーエージェントは画面平面に対するトランスデューサの向きに関して、tiltX / tiltY か
altitudeAngle / azimuthAngle
のいずれか一方の値のみを受け取る可能性が高い。ユーザーエージェントは、これらの値を相互に変換するために、以下のアルゴリズムをMUST使用しなければならない。
ユーザーエージェントが azimuthAngle / altitudeAngle から tiltX /
tiltY を算出する場合、最終的な整数値は Math.round [ECMASCRIPT] の規則に従って丸めるべきである(SHOULD)。
/* 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};
}
以下に本仕様で定義されるイベントタイプを示す。
プライマリポインターの場合、これらのイベント(gotpointercapture と lostpointercapture を除く)は、互換マウスイベントも発火しうる。
ユーザーエージェントは、次のいずれかが発生したとき、MUST pointerover という名前のポインターイベントを発火しなければならない。
pointerdown イベントを、ホバーをサポートしないデバイスに対して発火する前(pointerdown を参照)。ユーザーエージェントは、次のいずれかが発生したとき、MUST pointerenter という名前のポインターイベントを発火しなければならない。
pointerdown イベントを、ホバーをサポートしないデバイスに対して発火する前(pointerdown を参照)。mouseenter イベント、
および [CSS21]
で説明される CSS :hover
疑似クラスの間には類似点がある。
pointerleave イベントも参照。
ユーザーエージェントは、ポインターがアクティブボタン状態に入ったとき、MUST pointerdown という名前のポインターイベントを発火しなければならない。マウスでは未押下から少なくとも1つのボタン押下に遷移したとき、タッチではデジタイザに物理的に接触したとき、ペンではボタン未押下のままデジタイザに物理接触したとき、またはホバー中に未押下から少なくとも1つのボタン押下に遷移したときである。
pointerdown および pointerup は、mousedown および
mouseup とまったく同じ状況で発火するわけではない。詳細は 複数ボタンの組み合わせ操作 を参照。
ホバーをサポートしない入力デバイスでは、ユーザーエージェントは、MUST pointerdown をディスパッチする前に、pointerover、続いて pointerenter という名前のポインターイベントも発火しなければならない。
isPrimary プロパティが true の場合)一部の互換マウスイベントの発火を、pointerdown
イベントをキャンセルすることで防ぐことができる。これにより、そのポインターに PREVENT MOUSE EVENT
フラグが設定される。ただし、mouseover、mouseenter、mouseout、mouseleave
の発火は防止されない点に注意。ユーザーエージェントは、ポインターが pointerdown や pointerup を発火させない種類のプロパティをいずれか変更したとき、MUST pointermove
という名前のポインターイベントを発火しなければならない。これには、座標、圧力、接線圧、傾き、ねじれ、接触ジオメトリ(width と
height)、または 組み合わせボタン のいずれかの変化が含まれる。
ユーザーエージェントは、MAY パフォーマンス上の理由などにより、pointermove のディスパッチを遅延してもよい。
この場合、単一のディスパッチ済み pointermove に対して、合成イベント情報は getCoalescedEvents
メソッドを通じて公開される。
このようなイベントの最終座標は、イベントのターゲット決定に使用されるべきである。
ユーザーエージェントは、MUST pointerrawupdate
という名前のポインターイベントを発火
しなければならず、その発火は セキュアコンテキスト
内に限られる。これは、ポインターが pointerdown や pointerup
を発火しないプロパティを変更したときである。該当プロパティの一覧は pointermove イベントを参照。
pointermove と対照的に、ユーザーエージェントは pointerrawupdate を可能な限り早く、かつ JavaScript
が処理可能な頻度でディスパッチするべきである(SHOULD)。
pointerrawupdate の target は、pointermove のそれと異なる可能性がある。これは pointermove
が遅延または合成され得るためであり、target 決定に用いられるイベントの最終位置が、その合成イベントの位置と異なり得るからである。
同一の pointerId を持ち、まだ イベントループ
でディスパッチされていない別の pointerrawupdate がすでに存在する場合、ユーザーエージェントは、新規の pointerrawupdate を新たな タスクとして作成する代わりに、それに合成してもMAY。この結果、pointerrawupdate
が合成イベントを持つことがあり、イベントループで処理され次第、それらは1つの pointerrawupdate
の合成イベントとしてまとめて配信される。詳細は getCoalescedEvents を参照。
pointerrawupdate と pointermove
の順序に関して、プラットフォームからの更新が両イベントを引き起こす場合、ユーザーエージェントは、MUST
対応する pointermove より前に pointerrawupdate をディスパッチしなければならない。
target を除けば、最後の pointermove 以降にディスパッチされたすべての pointerrawupdate の合成イベントリストの連結は、次の pointermove の合成イベントと、他のイベント属性に関して同一である。pointerrawupdate の属性は、pointermove とほぼ同じだが、cancelable だけは
pointerrawupdate に対して MUST false でなければならない。
ユーザーエージェントは、SHOULD 互換マウスイベントを pointerrawupdate に対して発火しないべきである。
pointerrawupdate
のリスナーを追加すると、ユーザーエージェントの実装によってはページのパフォーマンスに悪影響を与える可能性がある。大半のユースケースでは他の pointerevent タイプで十分である。pointerrawupdate リスナーは、JavaScript
が高頻度イベントを必要とし、同等の速度で処理できる場合にのみ追加すべきである。このような場合、他の種類のポインターイベントをリッスンする必要はおそらくない。ユーザーエージェントは、ポインターがアクティブボタン状態を離れたとき、MUST pointerup という名前のポインターイベントを発火しなければならない。マウスでは少なくとも1つのボタン押下から未押下に遷移したとき、タッチではデジタイザから物理的な接触が離れたとき、ペンではボタン未押下でデジタイザとの物理接触が離れたとき、またはホバー中に少なくとも1つのボタン押下から未押下に遷移したときである。
ホバーをサポートしない入力デバイスでは、ユーザーエージェントは、MUST pointerup をディスパッチした後に、pointerout、続いて pointerleave という名前のポインターイベントも発火しなければならない。
すべての pointerup イベントにおいて、pressure の値は
0 である。
ユーザーエージェントは、ポインターが現在キャプチャされている場合、MUST ポインターキャプチャを暗黙的に解除しなければならない。
pointerdown および pointerup は、mousedown および
mouseup とまったく同じ状況で発火するわけではない。詳細は 複数ボタンの組み合わせ操作 を参照。
ユーザーエージェントは、ポインターイベントストリームを抑制するシナリオを検出したとき、MUST pointercancel という名前のポインターイベントを発火しなければならない。
pointercancel イベントの次のプロパティの値は、同じ pointerId
を持つ最後に配送されたポインターイベントの値と一致しなければならない(MUST):width、
height、pressure、tangentialPressure、tiltX、
tiltY、twist、altitudeAngle、azimuthAngle、
pointerType、isPrimary、および [POINTEREVENTS4] から継承される座標。pointercancel イベント内の
coalescedEvents および
predictedEvents リストは空でなければならず(MUST)、イベントの cancelable 属性は
false でなければならない(MUST)。
ユーザーエージェントは、次のいずれかが発生したとき、MUST pointerout という名前のポインターイベントを発火しなければならない。
pointerup イベントを、ホバーをサポートしないデバイスに対して発火した後(pointerup を参照)。ユーザーエージェントは、次のいずれかが発生したとき、MUST pointerleave という名前のポインターイベントを発火しなければならない。
pointerup イベントを、ホバーをサポートしないデバイスに対して発火した後(pointerup を参照)。mouseleave イベント、
および [CSS21]
で説明される CSS :hover
疑似クラスの間には類似点がある。
pointerenter イベントも参照。
ユーザーエージェントは、要素がポインターキャプチャを受け取ったとき、MUST gotpointercapture という名前のポインターイベントを発火しなければならない。このイベントはキャプチャを受ける要素で発火される。以後、そのポインターに関するイベントはこの要素で発火される。ポインターキャプチャの設定 と 保留中のポインターキャプチャの処理 を参照。
ユーザーエージェントは、ポインターのキャプチャが解除された後、MUST lostpointercapture
という名前のポインターイベントを発火しなければならない。このイベントは、キャプチャが削除された要素で発火される。キャプチャ解除後の、そのポインターに関する後続のイベントは、click、auxclick、contextmenu
イベントを除き、(本仕様の範囲外である)通常のヒットテストの仕組みに従ってイベントターゲットが決定される。ポインターキャプチャの解除、ポインターキャプチャの暗黙的な解除、および 保留中のポインターキャプチャの処理 を参照。
次のセクションでは、ポインターキャプチャの設定および解除を容易にするため、既存の Element インターフェースへの拡張について説明する。
WebIDLpartial interface Element {
undefined setPointerCapture (long pointerId);
undefined releasePointerCapture (long pointerId);
boolean hasPointerCapture (long pointerId);
};
setPointerCapture()引数の pointerId で識別されるポインターについて、ポインターキャプチャを設定し、このメソッドが呼び出された要素にキャプチャする。以後そのポインターのイベントに対しては、キャプチャ先ターゲットが通常のヒットテスト結果を置き換え、ポインターが常にキャプチャ先ターゲット上にあるかのように扱われ、キャプチャが解除されるまで常にこの要素をターゲットにしなければならない(MUST)。このメソッドが有効になるには、ポインターが アクティブボタン状態
にある必要があり、そうでない場合は黙って失敗する。与えられたメソッド引数がいずれのアクティブなポインターとも一致しない場合は、throw を行い、"NotFoundError" の DOMException を投げる。
releasePointerCapture()引数の pointerId で識別されるポインターについて、ポインターキャプチャを解除し、このメソッドが呼び出された要素から解放する。以後そのポインターのイベントは、イベントターゲットの決定にあたり(本仕様の範囲外である)通常のヒットテストの仕組みに従う。与えられたメソッド引数がいずれのアクティブなポインターとも一致しない場合は、throw を行い、"NotFoundError" の DOMException を投げる。
hasPointerCaptureこのメソッドが呼び出された要素が、引数の pointerId
で識別されるポインターに対して ポインターキャプチャ を保持しているかどうかを示す。特に、保留中のポインターキャプチャのターゲット上書き が、pointerId に対してこの要素に設定されている場合は
true を返し、そうでない場合は false を返す。
setPointerCapture()
を呼び出した直後に、当該要素がまだ gotpointercapture
イベントを受け取っていなくても、true を返す。そのため、暗黙のポインターキャプチャ を、pointerdown イベントリスナー内から検出するのに有用である。
次のセクションでは、イベントハンドラーの登録を容易にするため、既存の 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;
};
onpointeroverpointerover イベントタイプ用。
onpointerenterpointerenter イベントタイプ用。
onpointerdownpointerdown イベントタイプ用。
onpointermovepointermove イベントタイプ用。
onpointerrawupdatepointerrawupdate イベントタイプ用。
onpointeruppointerup イベントタイプ用。
onpointercancelpointercancel イベントタイプ用。
onpointeroutpointerout イベントタイプ用。
onpointerleavepointerleave イベントタイプ用。
ongotpointercapturegotpointercapture
イベントタイプ用。
onlostpointercapturelostpointercapture
イベントタイプ用。
属性と既定の動作
で述べたように、ビューポートの操作(パンおよびズーム)は、ポインターイベントをキャンセルしても抑止できない。代わりに、著者はどの挙動を許可し、どれを抑止するかを、touch-action
CSS プロパティを用いて宣言的に定義しなければならない。
touch-action CSS プロパティはタッチ入力のみに言及しているように見えるが、実際にはパンやズームのための直接操作を可能にするあらゆるポインター入力に適用される。
| Name: | touch-action |
|---|---|
| Value: | auto | none | [ pan-x || pan-y ] |
manipulation
|
| Initial: | auto |
| Applies to: | 以下を除くすべての要素:非置換インライン要素、表の行、行グループ、表の列、および列グループ |
| Inherited: | no |
| Percentages: | N/A |
| Media: | visual |
| Computed value: | 指定値と同じ |
| Canonical order: | 文法順 |
| Animation type: | アニメーション不可 |
touch-action CSS プロパティは、(プロパティ名に反してタッチに限定されない)直接操作の相互作用がユーザーエージェントのパンおよびズームの挙動を引き起こしてよいか(MAY)を決定する。touch-action
の値のセクションを参照。
パンやズームを開始する直前に、以下のすべての条件が真であれば、ユーザーエージェントはMUST ポインターイベントストリームを抑制しなければならない。
pointerdown イベントが送信されている。pointerdown に続く pointerup または pointercancel イベントが、まだそのポインターに対して送信されていない。
touch-action は埋め込み閲覧コンテキストには適用されず、またカスケードしない。
たとえば、touch-action を <iframe> に適用しても、
<iframe> 自体の内部でのパンおよびズームのための直接操作インタラクションの挙動には
何の効果もない。
ユーザーが直接操作ポインター(タッチスクリーンのタッチやスタイラスなど)で要素と相互作用する場合、その入力の効果は、以下のように、touch-action
プロパティの値と、当該要素およびその祖先の既定の直接操作の挙動によって決定される。
touch-action に適合する とみなされる。CSS
の変形が適用されている場合、要素の座標空間は画面座標と異なり、適合性に影響しうることに注意。例えば、画面に対して 90 度回転した要素の X 軸は、画面座標の Y 軸に平行になる。touch-action プロパティに適合する場合にサポートされる。
document 要素までの各要素の touch-action プロパティに適合する場合にサポートされる。
touch-action の値を変更しても無視される。例えば、pointerdown
ハンドラー内でプログラム的に要素の touch-action を auto から none
に変更しても、そのポインターがアクティブである間は、当該入力に対するパンやズームの挙動が中止/抑止されることはない。
touch-action の pan-*
値の場合でも、ユーザーエージェントがジェスチャー開始時点で直接処理するか否かを決定した後は、同一ジェスチャーにおけるその後の方向変更は、そのポインターがアクティブである間ユーザーエージェントによって無視されるべきである(SHOULD)。例えば、要素が
touch-action: pan-y(ユーザーエージェントは垂直方向のパンのみ処理する)に設定されていて、タッチジェスチャーが水平方向に始まった場合、指がまだ画面に触れている間に垂直方向へ方向を変えても、垂直パンは発生すべきではない。
touch-action 値を処理または関連付ける方法は本仕様の範囲外である。
touch-action
プロパティは、ビューポートのパンおよびズームに関連する直接操作の挙動を対象とする。テキスト選択/ハイライト、リンクやフォームコントロールのアクティベーションなど、その他のユーザーエージェントの挙動は、この
CSS プロパティによって影響を受けてはならない(MUST NOT)。
auto や
none の値に対する挙動を引き起こすための相互作用/ジェスチャーの定義は本仕様の範囲外である。
pan-x
または pan-y により)パンが単一の軸に制限されている場合、パン中に軸を変更することはできない。touch-action 値のうち実装で一般的なものは、[COMPAT] で定義される。方向固有の pan 値は、一部のオーバースクロール挙動をカスタマイズするのに有用である。
たとえば、単純なプルツーリフレッシュ効果を実装するには、スクロール位置が
0 のときは文書の touch-action を pan-x pan-down に設定し、
それ以外の場合は pan-x pan-y に設定できる。
これにより、ポインターイベントハンドラーは、文書の先頭から開始する上方向のパン/スクロールの
挙動を定義できる。
方向固有の pan 値は、ネイティブにスクロールする要素内でポインターイベント処理による
カスタムパンを実装するコンポーネントを構成するためにも使用できる(または
その逆も同様である)。
たとえば、画像カルーセルは、文書の垂直方向のパンを妨げることなく、任意の水平方向のパン操作について
ポインターイベントを受け取ることを確保するために pan-y を使用できる。
カルーセルが最右端に達したとき、その touch-action を
pan-y pan-right に変更することで、その範囲を超える後続のスクロール操作が、可能であれば
ビューポート内の文書をスクロールできるようにすることができる。
パン/スクロール操作が行われている間に、その挙動を変更することはできない。
auto では、ユーザー
エージェントは通常、ダブルタップジェスチャを処理できるようにするために、click の前に 300ms の遅延を追加する。
このような場合、touch-action: none または
touch-action: manipulation を明示的に設定すると、この遅延は取り除かれる。タップまたは
ダブルタップジェスチャを判定する方法は、この仕様の範囲外であることに注意。
<div style="touch-action: none;">
This element receives pointer events for all direct manipulation interactions that otherwise lead to panning or zooming.
</div>
<div style="touch-action: pan-x;">
This element receives pointer events when not panning in the horizontal direction.
</div>
<div style="overflow: auto;">
<div style="touch-action: none;">
This element receives pointer events for all direct manipulation interactions that otherwise lead to panning or zooming.
</div>
<div>
Direct manipulation interactions on this element MAY be consumed for manipulating the parent.
</div>
</div>
<div style="overflow: auto;">
<div style="touch-action: pan-y;">
<div style="touch-action: pan-x;">
This element receives pointer events for all direct manipulation interactions because
it allows only horizontal panning yet an intermediate ancestor
(between it and the scrollable element) only allows vertical panning.
Therefore, no direct manipulation behaviors for panning/zooming are
handled by the user agent.
</div>
</div>
</div>
このセクションは参考であり、規範的ではない。
ポインターキャプチャを用いると、特定のポインターに関するイベント(互換マウスイベントを含む)を、通常のポインター位置のヒットテスト結果とは異なる特定の要素へリターゲットできる。これは、カスタムスライダーコントロール(例えば [HTML] の
<input type="range">
コントロールに類似)などの場面で有用である。スライダーのつまみ要素にポインターキャプチャを設定することで、ポインターがつまみから外れても、ユーザーはコントロールを前後にスライドできる。
pointerdown
が行われた後、ポインターキャプチャを用いると、ポインターがつまみから外れてもスライドできる。ポインターキャプチャは、Element 型の element に対して
element.setPointerCapture(pointerId) メソッドを呼び出すことで設定される。
このメソッドが呼び出されたとき、ユーザーエージェントは以下の手順をMUST
実行する。
pointerId としてメソッドの
引数に与えられたものが、いずれのアクティブポインターにも一致しないなら、"NotFoundError" DOMException を投げる。pointerId によって指定されるアクティブポインターとする。
InvalidStateError" DOMException を投げる。pointerLockElement)を持つ間に
このメソッドが呼び出されたなら、"InvalidStateError" DOMException を投げる。
pointerId について、保留中のポインターキャプチャ対象オーバーライドを、このメソッドが呼び出されたElement に設定する。
pointerdown リスナーで暗黙的ポインターキャプチャを解放しようとして失敗した場合にも当てはまる。ポインターキャプチャは、要素に対して element.releasePointerCapture(pointerId)
メソッドを明示的に呼び出すことで解除される。このメソッドが呼び出されたとき、ユーザーエージェントは以下の手順をMUST
実行する。
pointerId が、いずれのアクティブなポインターにも一致せず、かつこれらの手順がポインターキャプチャの暗黙的な解除の結果として呼び出されていない場合、throw を行い、"NotFoundError" の DOMException を投げる。pointerId に対し、当該 Element の hasPointerCapture が false
の場合、これらの手順を終了する。
pointerId について、設定されていれば 保留中のポインターキャプチャのターゲット上書きをクリアする。
パンおよびズームの直接操作の相互作用を実装する入力(タッチスクリーンでのタッチやスタイラスなど)は、setPointerCapture が、任意の pointerdown
リスナーの呼び出し直前にターゲット要素で呼ばれたかのように、正確に振る舞うべきである(SHOULD)。例えば(pointerdown リスナー内などで)hasPointerCapture API
を用いて、これが行われたかどうかを判定できる。次のポインターイベントが発火する前に当該ポインターに対して releasePointerCapture
が呼ばれない場合、キャプチャが有効であることを示す gotpointercapture
イベントが(通常どおり)ターゲットにディスパッチされる。
pointerup または pointercancel イベントを発火した直後に、
ユーザーエージェントは、当該イベントの pointerup または pointercancel の pointerId について、保留中のポインターキャプチャのターゲット上書き をクリアし、
その後 保留中のポインターキャプチャの処理 手順を実行して、必要に応じて lostpointercapture を発火しなければならない(MUST)。
保留中のポインターキャプチャの処理
を実行した後、ポインターがホバーをサポートする場合、ユーザーエージェントはキャプチャなしの現在位置を反映するのに必要な境界イベントも送信しなければならない(MUST)。
ポインターキャプチャのターゲット上書き が [DOM] の接続済みでなくなった場合、 ポインターキャプチャのターゲット上書き はドキュメントに設定されるべきである(SHOULD)。
保留中のポインターキャプチャのターゲット上書き が [DOM] の接続済みでなくなった場合、 保留中のポインターキャプチャのターゲット上書き ノードはクリアされるべきである(SHOULD)。
lostpointercapture
イベントが、
キャプチャノードが削除された後、次回の 保留中のポインターキャプチャの処理
の際にドキュメントで発火される。
要素に対してポインターロック([PointerLock])が正常に適用された場合、ユーザーエージェントは、いずれかの要素がキャプチャ中もしくはキャプチャ予定であるなら、releasePointerCapture
メソッドが呼ばれたかのように手順を実行しなければならない(MUST)。
パフォーマンス上の理由から、ユーザーエージェントはポインターのpointermoveイベントを、ポインターの測定可能プロパティ
(座標、圧力、接線圧、傾き、ねじれ、接触ジオメトリなど)が更新される度に必ずしも送信しない選択を行うかもしれない。代わりに複数の変化を 1 つの pointermove または pointerrawupdate イベントに合成(結合/統合)する場合がある。この手法は
ユーザーエージェント がMUST 行うイベント処理量を減らすのに役立つ一方で、特に高速かつ大きな移動においてポインター位置追跡の粒度と忠実度を低下させる。getCoalescedEvents
メソッドを用いることで、アプリケーションは未合成の生の位置変化へアクセスでき、より精密なポインター移動データ処理が可能となる。例えば描画アプリケーションでは、未合成イベントを用いてポインターの実際の動きにより近い滑らかな曲線を描画できる。
pointermove
イベントの合成済み座標(灰色の点)のみを使うと、線は角ばってギザギザになる;getCoalescedEvents()
が提供するより細かいポイント(赤い円)で同じ線を描画すると、ポインター移動をより滑らかに近似できる。PointerEvent は関連付けられた 合成イベントリスト(0 個以上の PointerEvent のリスト)を持つ。信頼できる(trusted) pointermove および pointerrawupdate
イベントの場合、このリストはそのイベントへ合成されたすべての PointerEvent の列である。信頼できる「親」pointermove や pointerrawupdate
イベントはこれら合成イベントの蓄積結果を表すが、(ディスプレイのリフレッシュレートに合わせるなど)追加処理を含む場合がある。その結果、これらイベントの合成イベントリストには常に少なくとも 1
つのイベントが含まれる。その他のすべての信頼できるイベントタイプでは空リストとなる。信頼されない(untrusted)イベントでは、合成イベントリストはコンストラクタに渡された値で初期化される。
信頼できるイベントの合成イベントリスト内のイベントは以下を持つ:
timeStamp 値 [DOM]
— すべての合成イベントは、getPredictedEvents
メソッドが呼び出されたディスパッチ済みポインターイベントの timeStamp 以下の timeStamp
を持つ。合成イベントリストは timeStamp
により時間順に並べられていなければならず(MUST)、最初のイベントが最小の timeStamp を持つ。pointerId、pointerType、isPrimary。
<style>
/* キャンバス要素上の全イベントをアプリ側で受け取るため、
既存のユーザーエージェントの直接操作(パンやズームなど)を無効化する。 */
canvas { touch-action: none; }
</style>
<canvas id="drawSurface" width="500px" height="500px" style="border:1px solid black;"></canvas>
<script>
const canvas = document.getElementById("drawSurface"),
context = canvas.getContext("2d");
canvas.addEventListener("pointermove", (e)=> {
if (e.getCoalescedEvents) {
for (let coalesced_event of e.getCoalescedEvents()) {
paint(coalesced_event); // 生(未合成)ポイントをすべて描画
}
} else {
paint(e); // 最終的に合成されたポイントを描画
}
});
function paint(event) {
if (event.buttons>0) {
context.fillRect(event.clientX, event.clientY, 5, 5);
}
}
</script>
これらディスパッチされたイベントの順序は、元のイベントの実際の順序と一致していなければならない(MUST)。例えば、ある pointerdown イベントが合成 pointermove イベント群のディスパッチを引き起こす場合、ユーザーエージェントはまずその pointerId の合成イベントをすべて含む 1 つの pointermove イベントをディスパッチし、その後で pointerdown イベントをディスパッチしなければならない。
以下は増加する timeStamp
値を伴う実際のイベントと、ユーザーエージェントがディスパッチするイベントの例である。
| 実際のイベント | ディスパッチされたイベント |
|---|---|
ポインター (pointerId=2)
座標変更 |
pointerrawupdate (pointerId=2) 合成イベント
1 件 |
ポインター (pointerId=1)
座標変更 |
pointerrawupdate (pointerId=1) 合成イベント
1 件 |
ポインター (pointerId=2)
座標変更 |
pointerrawupdate (pointerId=2) 合成イベント
1 件 |
ポインター (pointerId=2)
座標変更 |
pointerrawupdate (pointerId=2) 合成イベント
1 件 |
ポインター (pointerId=1)
座標変更 |
pointerrawupdate (pointerId=1) 合成イベント
1 件 |
ポインター (pointerId=2)
座標変更 |
pointerrawupdate (pointerId=2) 合成イベント
1 件 |
ポインター (pointerId=1) ボタン押下
|
pointermove (pointerId=1) 合成イベント
2 件pointermove (pointerId=2) 合成イベント
4 件pointerdown (pointerId=1) 合成イベント
0 件 |
ポインター (pointerId=2)
座標変更 |
pointerrawupdate (pointerId=2) 合成イベント
1 件 |
ポインター (pointerId=2)
座標変更 |
pointerrawupdate (pointerId=2) 合成イベント
1 件 |
ポインター (pointerId=1) ボタン解放
|
pointermove (pointerId=2) 合成イベント
2 件pointerup (pointerId=1) 合成イベント
0 件 |
一部のユーザーエージェントには、確定したポインター移動の一連の後で、現在のジェスチャーにおける直前のイベントや移動の速度/軌道に基づき、将来のポインター移動の位置を予測できるアルゴリズムが組み込まれている。アプリケーションはこの情報を
getPredictedEvents
メソッドで利用し、知覚遅延を減らすために先読み描画を行い、実際のポイントが到着したら予測ポイントを破棄できる。
pointermove
イベントの合成座標に加え、ユーザーエージェントの予測する将来ポイント(灰色の円)を表示。PointerEvent は関連付けられた 予測イベントリスト(0 個以上の PointerEvent のリスト)を持つ。信頼できる pointermove イベントでは、ユーザーエージェントが将来続くと予測する
PointerEvent の列である。その他の信頼できるイベントタイプでは空リストとなる。信頼されないイベントでは、予測イベントリストはコンストラクタに渡された値で初期化される。
isTrusted ビットを
false に設定するが、予測
イベントリスト内の同じビットは、元の true 値のまま変更されない。
リスト内のイベント数と、それらが現在のタイムスタンプからどれだけ離れているかは、 ユーザーエージェントおよびそれが使用する予測アルゴリズムによって決定される。
信頼済みイベントの予測イベントリスト内のイベントは、次を持つ:
timeStamp 値
[DOM] — すべての予測イベントは、
timeStamp が、
getPredictedEvents メソッドが
呼び出された配送済みポインターイベントの
timeStamp 以上である。
予測イベントリストは timeStamp によって時系列順に
ソートされていなければならない(MUST)ため、最初の
イベントは最小の timeStamp を持つ。
pointerId、pointerType、
および isPrimary。作者は、次のポインターイベントが配送されるまでの間だけ、予測イベントを有効な予測とみなすべきであることに 注意。ユーザーエージェントがどれだけ未来までイベントを予測するかによっては、 通常のポインターイベントが、1 つ以上の予測イベントのタイムスタンプよりも早く配送される可能性がある。
let predicted_points = [];
window.addEventListener("pointermove", function(event) {
// 以前に描画した予測ポイントをクリア。
for (let e of predicted_points.reverse()) {
clearPoint(e.pageX, e.pageY);
}
// 最後に受け取ったイベント以降に実際に発生した移動を描画。
for (let e of event.getCoalescedEvents()) {
drawPoint(e.pageX, e.pageY);
}
// 知覚遅延を減らすため、現在の予測ポイントを描画。
predicted_points = event.getPredictedEvents();
for (let e of predicted_points) {
drawPoint(e.pageX, e.pageY);
}
});
信頼できる PointerEvent が生成されたとき、ユーザーエージェントは、合成イベントリスト および 予測イベントリスト
の各イベントに対して以下の手順を実行すべきである(SHOULD)。
pointerId、
pointerType、
isPrimary、isTrusted
を「親」ポインターイベントの対応するプロパティに一致させる。
cancelable および bubbles を false
に設定(これらイベントは単独でディスパッチされることがないため)。PointerEvent 値に初期化する。信頼できる PointerEvent の target が変更されたとき、ユーザーエージェントは 合成イベントリスト および 予測イベントリスト
の各イベントに対し以下を実行すべきである(SHOULD)。
現在存在するウェブコンテンツの大多数は Mouse Events のみを対象に記述されている。以下では、ユーザーエージェント がこのコンテンツとの互換性のために汎用ポインター入力をマウスイベントへマッピングする方法のアルゴリズムを説明する(MAY)。
マウスイベントとの互換マッピングは本仕様の任意(OPTIONAL)機能である。ユーザーエージェントは既存のレガシーコンテンツとの互換性を最大化するため、この機能をサポートすることが推奨される。
高レベルでは、互換マウスイベントは対応するポインターイベントと「インターリーブ」されることを意図している。しかし、この具体的な順序は必須ではなく、互換マウスイベントを実装するユーザーエージェントは、相対順序が一貫している限り、マウスイベントのディスパッチを遅延またはグループ化してもよい(MAY)。
特にタッチスクリーン入力の場合、ユーザーエージェントは(著者が touch-action
により明示的に抑止しない限り)ジェスチャー認識のため追加のヒューリスティクスを適用するかもしれない。pointerdown から pointerup までのイベント列において、ジェスチャー認識はジェスチャーの検出/無視のため
pointerup
まで待機する必要がある場合がある。その結果、相互作用が特定のジェスチャーを意図していないと判断された場合は、シーケンス全体の互換マウスイベントが最後の pointerup
イベント後にまとめてディスパッチされる可能性がある。これらジェスチャー認識の詳細は本仕様で定義されず、実装間で差異がありうる。
互換マウスイベントへの対応に関係なく、ユーザーエージェントは常に click、auxclick、contextmenu
イベントをサポートしなければならない(MUST)。これらのイベントは PointerEvent 型であり、互換マウスイベント ではないためである。ポインターイベント中に
preventDefault を呼び出しても、click、auxclick、contextmenu
が発火するかどうかには影響を与えてはならない(MUST NOT)。
一部高レベルイベント(contextmenu、focus、blur
など)のポインターイベントとの相対順序は未定義であり、ユーザーエージェント間で異なる。例えば、あるユーザーエージェントでは contextmenu が pointerup の後に続くことが多い一方、別のユーザーエージェントでは pointerup や pointercancel
に先行する場合があり、状況によっては対応するポインターイベントなしに(キーボード操作などの結果として)発火することもある。
さらに、ユーザーエージェントは click、auxclick、contextmenu
イベントを発火すべきかどうかを判断する独自のヒューリスティクスを適用する場合がある。同種の他の(非プライマリ)ポインターや別タイプの他のプライマリポインターが存在する場合、これらイベントを発火しない選択をすることがある。また、指の接触中に過度の移動が含まれるなど「クリーン」なタップ/クリック/長押しと見なされない行為について、click、auxclick、contextmenu
を発火しない場合がある。これらユーザーエージェントの挙動は本仕様で定義されず、実装間で差異がありうる。
特に断りがない限り、マッピングされた任意のマウスイベントのターゲットは、対象のポインターイベントと同一であるべきである(SHOULD)。ただしターゲットがもはやその
ownerDocument のツリーに参加していない場合は、マウスイベントは当該ターゲットがツリーから除去された時点での最も近い祖先ノード(依然として
ownerDocument のツリーに参加している)で発火されるべきであり、そのノードに基づく新しいイベントパスがマウスイベント用に構築される。
著者は pointerdown イベントをキャンセルすることで、特定の互換マウスイベントの生成を防ぐことができる。
マウスイベントはポインターが押下状態(down)のときのみ防ぐことができる。ホバー中のポインター(例:ボタン未押下のマウス)はそのマウスイベントを防止できない。
mouseover、mouseout、mouseenter、mouseleave
イベントは(ポインターが押下状態でも)決して防止されない。
互換マウスイベントは、ポインターイベントの EventListener が passive
[DOM]
に設定されている場合は防止できない。
プライマリポインターだけが互換性マウスイベントを生成できるが、複数のプライマリポインターが同時にアクティブになり、それぞれが
独自の互換性マウスイベントを生成できる。MouseEvents に依存するスクリプトとの互換性のために、
マウス遷移イベント(mouseover、mouseout、mouseenter および
mouseleave)は、単一の
レガシーマウス入力の移動をシミュレートするべきである(SHOULD)。
これは、すべてのイベント対象について入退場状態が、[POINTEREVENTS4] に従って有効であることを意味する。ユーザーエージェントは、
文書内のレガシーマウスポインターの有効位置を次のように維持することによって、
これを保証するべきである(SHOULD)。
pointerdown、pointerup、pointermove イベント、または window での pointerleave
イベントを発火する直前に、ユーザーエージェントは以下の手順を実行すべきである(SHOULD)。
pointerdown、pointerup、または pointermove イベントの対象とする。pointerleave イベントについては、T を未設定にする。
mouseover、mouseout、mouseenter および
mouseleave イベントを配送する。現在のレガシーマウスポインターの有効位置または
T のいずれかの未設定値は、ウィンドウ外のマウス位置とみなす。
レガシーマウスポインターの有効位置
は、ポインター遷移イベント(pointerover、pointerout、pointerenter、pointerleave)と対応するレガシーマウス遷移イベント(mouseover、mouseout、mouseenter、mouseleave)を常に直接
1 対 1 でマッピングできるわけではないことを表す。次のアニメーションは、単一のレガシーマウス入力で 2
つのプライマリポインターを調停するために、ユーザーエージェントがポインター遷移イベントより多くのレガシーマウス遷移イベントをディスパッチする必要があるケースを示す。
このアニメーションでは、マウスクリックとタッチタップの間の時間に着目すると、ボタン 1 は pointerout
を受け取らない(「実際の」マウスポインターがその期間中にボタン矩形を離れていないため)が、タッチタップで レガシーマウスポインターの有効位置 がボタン 2
へ移動した際には mouseout を受け取る。同様に、タッチタップとマウスがボタン 1 を離れる直前の間、ボタン 1 は同じ理由で
pointerover を受け取らないが、レガシーマウスポインターの有効位置 が再びボタン 1
内に戻った際 mouseover を受け取る。
ユーザーエージェントがホバーをサポートするデバイスのポインターイベントをディスパッチする際は、以下の手順を実行すべきである(SHOULD)。
isPrimary プロパティが false の場合、ポインターイベントをディスパッチして手順を終了する。
pointerdown、pointerup、pointermove イベント、または window での pointerleave イベントなら、レガシーマウスポインターの有効位置の追跡
で述べる互換マウス遷移イベントをディスパッチする。pointerdown で、イベントが キャンセル された場合、当該 pointerType に対して
PREVENT MOUSE EVENT フラグを設定する。
PREVENT MOUSE EVENT フラグが当該 pointerType
に設定されていない場合、かつディスパッチされたポインターイベントが以下のいずれかであれば:
pointerdown の場合、mousedown
を発火。pointermove の場合、mousemove
を発火。pointerup の場合、mouseup を発火。
pointercancel の場合、window
で mouseup を発火。pointerup または pointercancel の場合、当該 pointerType
の PREVENT MOUSE EVENT フラグをクリアする。多くのタッチスクリーンのように、アクティブ状態でない間に座標(または座標集合)をホバーできないデバイスがある。既存の多くのマウスイベント向けコンテンツは入力としてマウスを仮定し、一般に以下が成り立つ:
mousemove を生成する可能性が高い。これにより、この種の入力デバイスに対してユーザーエージェントは異なるマッピングを提供する必要がある。ユーザーエージェントが ホバーをサポートしない デバイスのポインターイベントをディスパッチする際は、以下の手順を実行すべきである(SHOULD)。
isPrimary が false の場合、ポインターイベントをディスパッチして終了。pointerover で、当該ポインターの pointerdown
がまだディスパッチされていない場合、mousemove を発火(レガシーなマウス特化コードとの互換性のため)。pointerdown、pointerup、pointermove、または window での pointerleave なら、レガシーマウスポインターの有効位置の追跡
に従って互換マウス遷移イベントをディスパッチ。pointerdown でイベントが キャンセル された場合、当該 pointerType に
PREVENT MOUSE EVENT フラグを設定。
PREVENT MOUSE EVENT フラグが設定されていない場合、かつディスパッチされたポインターイベントが以下なら:
pointerdown → mousedown
発火。pointermove → mousemove
発火。pointerup → mouseup 発火。pointercancel → window で
mouseup 発火。
pointerup または pointercancel の場合、当該 pointerType
の PREVENT MOUSE EVENT フラグをクリア。ユーザーエージェントが [TOUCH-EVENTS] で定義される Touch Events と Pointer Events の両方をサポートする場合、ユーザーエージェント は、本セクションで述べられる互換マウスイベントと [TOUCH-EVENTS] に記載される フォールバックマウスイベント の双方を生成してはならない(MUST NOT)。
ホバーをサポートしないデバイス(例:タッチスクリーン上の単一指)によるプライマリポインターで要素をアクティベート(click)する場合、典型的なイベントシーケンスは次のとおり:
mousemovepointeroverpointerentermouseovermouseenterpointerdownmousedownpointermove および mousemove
pointerupmouseuppointeroutpointerleavemouseoutmouseleaveclickただし、この相互作用中に pointerdown イベントが キャンセル された場合、イベントシーケンスは次のようになる:
mousemovepointeroverpointerentermouseovermouseenterpointerdownpointermovepointeruppointeroutpointerleavemouseoutmouseleaveclickこの付録では、Pointer Events の実装におけるセキュリティおよびプライバシーに関する考慮事項を論じる。ここでの議論は、本仕様で定義されるイベントモデル、API、およびイベントの実装から直接生じるセキュリティとプライバシーの問題に限定する。
本仕様で定義される多くのイベント型は、ユーザーの操作に応じてディスパッチされる。これは、悪意のあるイベントリスナーが、ユーザーが通常は機密と考える情報(たとえば、ページと対話中のユーザーのマウス/スタイラス/指の正確な経路/動き)へアクセスできる可能性を生む。
ポインターイベントには、(ユーザーのデバイスが対応している場合)ペン入力が保持される角度や傾き、接触面のジオメトリ、スタイラスやタッチスクリーンに加えられる圧力などの追加情報が含まれる。角度、傾き、ジオメトリ、圧力に関する情報はユーザーのデバイス上のセンサーに直接関係するため、本仕様はオリジンに対してこれらのセンサーへのアクセスを許可することになる。
このセンサーのデータや、使用された入力機構(マウス、タッチ、ペン)の種類を判別できる能力は、ユーザー、またはユーザーのデバイスや環境の特性を推測するために用いられる可能性がある。推測された特性や、デバイス/環境に関するあらゆる情報自体が機微なものである場合がある — たとえば、悪意のあるサイトがユーザーが支援技術を使用しているかどうかをさらに推測できてしまう可能性がある。この情報は、ユーザープロファイルの構築や、特定のユーザーを「フィンガープリント」して追跡する目的に使用され得る。
緩和策として、ユーザーエージェントは、特定のセンサーデータ(角度、傾き、圧力など)へのアクセスをユーザーが無効化できる機能を含めること、またはユーザーの明示的なオプトイン後にのみ利用可能にすることを検討してもよい。
センサーの工場校正情報は、センサーデータの特有の変動や特性に基づき、個々のデバイスをフィンガープリントするために使用され得る。本仕様では多くのセンサー関連イベント属性を
float や double の精度で定義しているが、実装では実用上有用な精度に公開するセンサーデータを制限することを推奨する:
0.1 度以下とすること本仕様は、著者が「予測イベント」へアクセスできる方法を定義するが、ユーザーエージェントが予測に用いるアルゴリズム自体は定義しない。仕様策定者は、これらのアルゴリズムが、ユーザーが現在実行中のジェスチャーに関連する直前のポインターイベントのみに依拠することを想定している。ユーザーエージェントは、予測アルゴリズムの具体的な実装が、ユーザーに関する機微な情報を明らかにしたり、ユーザーを「フィンガープリント」して追跡するために使用され得る、異なるサイト間でのユーザーの完全な操作履歴のような追加データに依拠しないことを確実にする責任を負う。
これらの考慮事項に加えて、ワーキンググループは本仕様が次のとおりであると考える:
このセクションは参考であり、規範的ではない。
buttons プロパティについて非ゼロ値を持つ状態。マウスの場合、これは
デバイスで少なくとも 1 つのボタンが押下されているときである。タッチの場合、これはデジタイザーとの物理的接触が
あるときである。ペンの場合、これはペンがデジタイザーと物理的に接触しているか、または
ホバー中に少なくとも 1 つのボタンが押下されているときである。pointerId によって識別される)が
文書内で追加のイベントを生成できる可能性があるなら、そのポインターはまだアクティブであるとみなされる。例:
preventDefault()、イベントハンドラー内で false を返すこと、または
[UIEVENTS] および
[HTML]
によって定義されるその他の手段により、既定アクションが防止されたイベント。
測定可能プロパティは、実数または大きな定義域の整数を用いて表現される、連続的なポインターセンサーデータに関係する値を表す。
ポインターイベントについては、width、height、
pressure、
tangentialPressure、tiltX、tiltY、twist、
altitudeAngle、azimuthAngle、および [POINTEREVENTS4] Mouse Event モデルのプロパティ
screenX、screenY、clientX、clientY は
測定可能プロパティである。
対照的に、pointerId、pointerType、
isPrimary、および
[POINTEREVENTS4] Mouse Event モデルのプロパティ
button、buttons、ctrlKey、
shiftKey、altKey、および metaKey は測定可能プロパティとは
みなされない。なぜなら、それらはセンサーデータに関係しないからである。
本ドキュメントに取り入れられているものも含め、多くの提案および推奨をいただいた多くの方々に深く感謝する。グループの議長は、以下の過去および現在のグループメンバーおよび参加者の貢献をここに認める: Mustaq Ahmed、 Arthur Barstow、 Ben Boyle、 Matt Brubeck、 Rick Byers、 Marcos Cáceres、 Cathy Chan、 Bo Cupp、 Domenic Denicola、 Ted Dinklocker、 Adam Ettenberger、 Robert Flack、 Dave Fleck、 Mike Fraser、 Ella Ge、 Olga Gerchikov、 Scott González、 Kartikaya Gupta、 Dominique Hazael-Massieux、 Philippe Le Hégaret、 Hayato Ito、 Patrick Kettner、 Patrick H. Lauke、 Scott Low、 Sangwhan Moon、 Masayuki Nakano、 Olli Pettay、 Addison Phillips、 Alan Pyne、 Antoine Quint、 Jacob Rossi、 Kagami Sascha Rosylight、 Doug Schepers、 Ming-Chou Shih、 Brenton Simpson、 Dave Tapuska、 Liviu Tinta、 Asir Vedamuthu、 Lan Wei、 Jeffrey Yasskin、 Navid Zolghadr.
本モデルの初版の開拓に尽力された方々、とりわけ次の方々に特別な感謝を捧げる:Charu Chandiram、Peter Freiling、Nathan Furtwangler、Thomas Olsen、Matt Rakow、Ramu Ramanathan、Justin Rogers、 Jacob Rossi、Reed Townsend、Steve Wright。
このセクションは参考であり、規範的ではない。
以下は、本仕様の各版の公開間における、[PointerEvents2] 仕様に対する重大かつ主要な編集上の変更の非規範的な要約である。 本仕様のエディターズドラフトの完全な変更履歴も参照のこと。
touch-action 値を削除
(pan-left、pan-right、pan-up、pan-down)click、
auxclick、contextmenu が .button と
.buttons の挙動を UIEvents から継承することを明確化isTrusted
ビットの明確化pointercancel
の座標/プロパティに関する明確化を追加click/contextmenu
が互換マウスイベントではないことを規範として明確化pointerId に関する注記の要素を規範テキストへ移動
pointercancel 発火の挙動を明確化
pointermove
のディスパッチを遅らせる理由としての animation frame コールバックの言及を削除
pointerrawmove
の予測イベントリストが空であることに関する明示的な注記を追加測定可能プロパティを対象とするため)
touch-action の根拠と目的を明確化touch-action
の定義を言い換え/拡張(パン/ズーム動作のみに明確に範囲を限定)click/contextmenu
とユーザーエージェントのヒューリスティクスに関する注記に情報を追加pointerId を
0 から -1 に変更touch-action と
iframe/埋め込みブラウジングコンテキストに関する注記を追加azimuthAngle、
altitudeAngle、tiltX、tiltY が Pointer Events Web IDL
で既定値を要求しないよう更新pointerrawupdate と
getCoalescedEvents にセキュアコンテキストの基準を追加click、auxclick、contextmenu
の型を PointerEvent に変更altitudeAngle/azimuthAngle を追加getPredictedEvents API を追加。
getCoalescedEvents API と
pointerrawupdate イベントを導入。touch-action 値を追加
(pan-left、pan-right、pan-up、pan-down)し、既存の
pan-x と pan-y の挙動を明確化。
WebIDLdictionary PointerEventInit : MouseEventInit {
long pointerId = 0;
double width = 1;
double height = 1;
float pressure = 0;
float tangentialPressure = 0;
long tiltX;
long tiltY;
long twist = 0;
double altitudeAngle;
double azimuthAngle;
DOMString pointerType = "";
boolean isPrimary = false;
sequence<PointerEvent> coalescedEvents = [];
sequence<PointerEvent> predictedEvents = [];
};
[Exposed=Window]
interface PointerEvent : MouseEvent {
constructor(DOMString type, optional PointerEventInit eventInitDict = {});
readonly attribute long pointerId;
readonly attribute double width;
readonly attribute double height;
readonly attribute float pressure;
readonly attribute float tangentialPressure;
readonly attribute long tiltX;
readonly attribute long tiltY;
readonly attribute long twist;
readonly attribute double altitudeAngle;
readonly attribute double azimuthAngle;
readonly attribute DOMString pointerType;
readonly attribute boolean isPrimary;
[SecureContext] sequence<PointerEvent> getCoalescedEvents();
sequence<PointerEvent> getPredictedEvents();
};
partial interface Element {
undefined setPointerCapture (long pointerId);
undefined releasePointerCapture (long pointerId);
boolean hasPointerCapture (long pointerId);
};
partial interface mixin GlobalEventHandlers {
attribute EventHandler onpointerover;
attribute EventHandler onpointerenter;
attribute EventHandler onpointerdown;
attribute EventHandler onpointermove;
[SecureContext] attribute EventHandler onpointerrawupdate;
attribute EventHandler onpointerup;
attribute EventHandler onpointercancel;
attribute EventHandler onpointerout;
attribute EventHandler onpointerleave;
attribute EventHandler ongotpointercapture;
attribute EventHandler onlostpointercapture;
};
partial interface Navigator {
readonly attribute long maxTouchPoints;
};
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: