Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
Pointer Events 仕様は、マウス、タッチスクリーン、ペン/スタイラスを含む さまざまなデバイスからの入力を処理するための、ハードウェアに依存しない統一されたフレームワークを定義します。単一のイベントセット(例: pointerdown、pointermove、pointerup)を提供することで、開発者は各デバイス固有のロジックを記述することなく 多様な入力方法をサポートできます。
この仕様では、マウスイベントおよびホイールイベントに加え、他の ポインターデバイスタイプに対してマウスイベントを発火するためのマッピングも定義します。
この節では、公開時点におけるこの 文書のステータスについて説明します。現在の W3C 公開文書の一覧およびこの技術報告書の最新リビジョンは、 W3C 標準および草案 インデックスで確認できます。
この仕様は、[PointerEvents3] 仕様を更新するものです。また、 以前は [UIEVENTS] 仕様に含まれていたマウスイベントおよびホイールイベントも含みます。
このリビジョンには、次の新機能が含まれています:
persistentDeviceId。
touch-action 値: pan-left,
pan-right, pan-up, pan-down
この文書は、Pointer Events ワーキンググループによって、 勧告 トラックを使用して作業草案として公開されました。
作業草案としての公開は、 W3C およびそのメンバーによる承認を意味するものではありません。
これは草案文書であり、いつでも他の 文書によって更新、置換、または廃止される可能性があります。この文書を 作業中の文書以外のものとして引用することは適切ではありません。
この文書は、 W3C 特許 ポリシーの下で活動するグループによって作成されました。 W3C は、グループの成果物に関連して行われた 特許開示の公開一覧 を管理しています。そのページには、 特許を開示するための手順も記載されています。ある特許に 必須クレーム が含まれていると実際に認識している個人は、 W3C 特許ポリシーの第 6 節に従って、その情報を開示しなければなりません。
この文書は、 2025年8月18日付 W3C プロセス文書に準拠します。
この節は非規範的です。
今日、ほとんどの [HTML] コンテンツは、マウス入力で使用されるか、マウス入力向けに設計されています。入力を 独自の方法で処理するものは、通常、マウスイベントに対応するコードを記述します。しかし今日の新しいコンピューティングデバイスは、 タッチスクリーンやペン入力など、他の形式の入力も取り入れています。これらの各入力形式を個別に 処理するためのイベントタイプが提案されてきました。しかし、この方法では、新しい入力タイプのサポートを追加するときに ロジックの不必要な重複やイベント処理のオーバーヘッドが生じることがよくあります。これは、 1 種類のデバイスタイプだけを念頭に置いてコンテンツが記述された場合、互換性の問題を引き起こすことがよくあります。さらに、 既存のマウスベースのコンテンツとの互換性のため、ほとんどの ユーザーエージェントは、すべての入力タイプに対してマウスイベントを発火します。 そのため、マウスイベントが実際のマウスデバイスを表しているのか、それとも互換性のために 別の入力タイプから生成されたものなのかが曖昧になり、両方のデバイスタイプに同時に対応するコードを記述することが困難になります。
複数の入力タイプに対応するコードを記述するコストを削減し、さらに上述した マウスイベントの曖昧さを解消するために、この仕様では、ポインターと呼ばれる、より抽象的な入力形式を定義します。ポインターは、 マウスカーソル、ペン、タッチ(マルチタッチを含む)、またはその他のポインティング 入力デバイスによって画面上に作られる任意の接触点とすることができます。このモデルにより、ユーザーがどのような ハードウェアを持っているかにかかわらず、適切に動作するサイトやアプリケーションを記述しやすくなります。デバイス固有の処理が望まれる場合に備えて、この仕様では、 イベントを生成したデバイスタイプを調べるためのプロパティも定義します。主な目標は、 クロスデバイスのポインター入力に対するオーサリングを容易にする単一のイベントおよびインターフェイスのセットを提供すると同時に、 より優れた体験を実現するために必要な場合にのみデバイス固有の処理を可能にすることです。
もう 1 つの重要な目標は、マルチスレッドのユーザーエージェントが、スクリプトの実行を 待ってブロックすることなく、パンやズーム(たとえば、タッチスクリーン上の指やスタイラスによる)のための 直接操作 アクションを処理できるようにすることです。
この仕様では、さまざまなポインター入力向けの統一されたイベントモデルを定義していますが、このモデルは、 キーボードやキーボードに似たインターフェイスなど、その他の形式の入力を対象としていません(たとえば、 タッチスクリーンのみのデバイス上で動作するスクリーンリーダーや同様の支援技術で、 ユーザーがフォーカス可能なコントロールや要素を順番にナビゲートできるものなど)。ユーザーエージェントは、 これらのインターフェイスへの応答としてポインターイベントも生成することを選択する場合がありますが、このシナリオは この仕様の対象ではありません。
まず第一に、作者は focus、blur、
click などの高レベルイベントに応答することで、あらゆる形式の
入力に対して同等の機能を提供することが推奨されます。ただし、低レベルイベント(Pointer Events など)を
使用する場合、作者は、すべての種類の入力がサポートされるようにすることが推奨されます。キーボードや
キーボードに似たインターフェイスの場合、明示的なキーボードイベント処理を追加する必要がある場合があります。詳細については、
キーボードによるアクセス [WCAG22] を参照してください。
汎用ポインター入力を処理するためのイベントは、マウス用のイベントと非常によく似ています: pointerdown、pointermove、pointerup、pointerover、pointerout
などです。これにより、コンテンツを
マウスイベントからポインターイベントへ容易に移行できます。
ポインターイベントは、マウスイベントに存在する通常のプロパティ(クライアント座標、
対象要素、ボタンの状態を含む)すべてに加えて、圧力、
接触領域の形状、傾きなど、その他の形式の入力向けの新しいプロパティも提供します。作者は、適切な場合には異なる入力
タイプ間でロジックを共有するようにポインターイベントへ容易に対応でき、最良の
体験を得るために必要な場合にのみ、特定の入力タイプ向けにカスタマイズできます。
ポインターイベントはさまざまな入力デバイスを発生源としますが、他の何らかの デバイス固有イベントの集合から生成されるものとして定義されてはいません。互換性のためには可能であり推奨されますが、この仕様では、 その他のデバイス固有イベント(マウスイベントやタッチイベントなど)のサポートを要求しません。ユーザー エージェントは、その他のデバイスイベントを一切サポートせずにポインターイベントをサポートできます。 マウス固有イベント向けに記述されたコンテンツとの互換性のため、この仕様では、マウス以外の デバイスからのポインター入力に基づいて 互換マウスイベントを生成する方法を説明する任意の節を提供しています。
この仕様では、Touch Events([TOUCH-EVENTS] で定義される)と Pointer Events の 両方をサポートするユーザーエージェントに期待される動作について、いかなる助言も提供しません。 これら 2 つの仕様の関係について詳しくは、Touch Events コミュニティグループを参照してください。
非規範的と示されている節に加えて、この仕様内のすべてのオーサリングガイドライン、図、例、および注記は 非規範的です。この仕様内のそれ以外のすべては規範的です。
この文書におけるキーワード MAY、MUST、MUST NOT、OPTIONAL、および SHOULD は、 ここに示すように、すべて 大文字で記述されている場合にのみ、 BCP 14 [RFC2119] [RFC8174] に記載されているとおりに解釈されるものとします。
WebIDLdictionary PointerEventInit : MouseEventInit {
long pointerId = 0;
double width = 1;
double height = 1;
float pressure = 0;
float tangentialPressure = 0;
long tiltX;
long tiltY;
long twist = 0;
double altitudeAngle;
double azimuthAngle;
DOMString pointerType = "";
boolean isPrimary = false;
long persistentDeviceId = 0;
sequence<PointerEvent> coalescedEvents = [];
sequence<PointerEvent> predictedEvents = [];
};
[Exposed=Window]
interface PointerEvent : MouseEvent {
constructor(DOMString type, optional PointerEventInit eventInitDict = {});
readonly attribute long pointerId;
readonly attribute double width;
readonly attribute double height;
readonly attribute float pressure;
readonly attribute float tangentialPressure;
readonly attribute long tiltX;
readonly attribute long tiltY;
readonly attribute long twist;
readonly attribute double altitudeAngle;
readonly attribute double azimuthAngle;
readonly attribute DOMString pointerType;
readonly attribute boolean isPrimary;
readonly attribute long persistentDeviceId;
[SecureContext] sequence<PointerEvent> getCoalescedEvents();
sequence<PointerEvent> getPredictedEvents();
};
pointerIdイベントを発生させたポインターの一意の識別子です。ユーザーエージェントは、プライマリマウスポインター用として汎用的な
pointerId
値
0 または 1 を予約してもよいです。pointerId
の値
-1 は、ポインティングデバイス以外によって生成されたイベントを示すために
予約して使用しなければなりません。その他のポインターについては、ユーザー
エージェントは pointerId
値を割り当てる方法について、異なる戦略や手法を自由に実装できます。ただし、トップレベル
閲覧コンテキスト([HTML] で定義)内のすべての アクティブなポインターについて一意でなければならず、その
識別子は他のトップレベル閲覧
コンテキストの影響を受けてはなりません(つまり、あるトップレベル閲覧コンテキストは、ポインターが
その閲覧コンテキストの外へ移動して別の
トップレベル閲覧コンテキストに入ったとき、そのポインターの pointerId が同一であると
仮定することはできません)。
ユーザーエージェントは、
以前のアクティブなポインターから使用済みとなった pointerId の値を再利用しても
よく、または特定のポインティングデバイスに対して常に同じ pointerId
を再利用してもよいです(たとえば、複数ユーザーの共同作業アプリケーションで、特定のユーザーによる特定のペン/スタイラス
入力を一意に識別するため)。ただし、
後者の場合、異なるページや
ドメイン間でのフィンガープリンティングや追跡の可能性を最小限に抑えるため、pointerId
は、そのページ/セッションの存続期間に限って、その特定のポインティング
デバイスに明示的に関連付けなければならず、その特定のポインティングデバイスが
新しいセッションで再び使用される次の機会には、新しいランダム化された pointerId を選択しなければなりません。
pointerId の選択
アルゴリズムは実装固有です。作者は、その値が、他のすべての
アクティブなポインターとは異なるポインターの識別子であること以外に、何らかの
特定の意味を持つと仮定することはできません。例として、ユーザーエージェントは単に、
アクティブになった順に、0 から始まる番号を
各アクティブポインターに割り当ててもよいですが、これらの値が単調増加することは保証されません。特定の
ポインティングデバイスに同じ pointerId を
再利用するかどうかは各実装に委ねられているため、作者は
これに依存しないことが強く推奨され、代わりに persistentDeviceId
を参照することが推奨されます。
widthポインターの 接触形状の幅(X 軸方向の大きさ)を CSS ピクセル単位で表します([CSS21]
を参照)。
この値は、特定のポインターについてイベントごとに更新されてもかまいません。通常は接触形状を持たない入力
(従来のマウスなど)、および入力の実際の
形状がハードウェアによって検出されない場合、ユーザーエージェントは、デフォルト値 1
を返さなければなりません。
heightポインターの 接触形状の高さ(Y 軸方向の大きさ)を CSS ピクセル単位で表します([CSS21]
を参照)。
この値は、特定のポインターについてイベントごとに更新されてもかまいません。通常は接触形状を持たない入力
(従来のマウスなど)、および入力の実際の
形状がハードウェアによって検出されない場合、ユーザーエージェントは、デフォルト値 1
を返さなければなりません。
pressure[0,1] の範囲で正規化されたポインター入力の圧力です。ここで
0 と 1 は、それぞれハードウェアが
検出可能な最小圧力と最大圧力を表します。圧力をサポートしないハードウェアやプラットフォームでは、
アクティブボタン状態にあるとき値は 0.5 でなければならず、それ以外では 0 でなければなりません。
tangentialPressureポインター入力の正規化された接線圧力(バレル圧力とも呼ばれます)であり、通常は
追加のコントロール(たとえばエアブラシ用スタイラスのフィンガーホイール)によって設定されます。その範囲は
[-1,1] で、0 はコントロールの中立位置です。
一部のハードウェアは [0,1] の範囲の正の値のみをサポートする場合があることに注意してください。
接線圧力をサポートしないハードウェアやプラットフォームでは、値は
0 でなければなりません。
tiltXY-Z 平面と、
トランスデューサー(たとえばペン/スタイラス)の軸および Y 軸の両方を含む平面との間の平面角
(度単位、[-90,90] の範囲)です。正の
tiltX は右方向、すなわち X 値が増加する方向です。
tiltX は tiltY と併用して、デジタイザーに対する
トランスデューサーの法線からの傾きを表すことができます。傾きまたは角度を報告しない
ハードウェアやプラットフォームでは、値は 0 でなければなりません。
tiltX。
tiltYX-Z 平面と、
トランスデューサー(たとえばペン/スタイラス)の軸および X 軸の両方を含む平面との間の平面角
(度単位、[-90,90] の範囲)です。正の
tiltY はユーザーの方向、すなわち Y 値が増加する方向です。
tiltY は tiltX と併用して、デジタイザーに対する
トランスデューサーの法線からの傾きを表すことができます。傾きまたは角度を報告しない
ハードウェアやプラットフォームでは、値は 0 でなければなりません。
tiltY。
twistトランスデューサー
(たとえばペン/スタイラス)が自身の主軸を中心に時計回りに回転した角度
(度単位、[0,359] の範囲)です。twist を報告しないハードウェアやプラットフォームでは、
値は 0 でなければなりません。
altitudeAngleトランスデューサー(たとえばペン/スタイラス)の高度角(ラジアン単位)で、範囲は
[0,π/2] です。ここで 0 は表面(X-Y 平面)と平行、
π/2 は表面に垂直です。傾きまたは角度を
報告しないハードウェアやプラットフォームでは、値は π/2 でなければなりません。
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 でなければなりません。傾きまたは角度を
報告しないハードウェアやプラットフォームでは、値は
0 でなければなりません。
azimuthAngle が
π/6 の例(「4 時」)。pointerTypeイベントを発生させたデバイスタイプ(マウス、ペン、タッチなど)を示します。ユーザー
エージェントが、マウス、
ペン/スタイラス、またはタッチ入力デバイスに対して ポインターイベントを発火する場合、pointerType
の値は
次の表に従わなければなりません。
| ポインターデバイスタイプ | pointerType 値 |
|---|---|
| マウス | mouse |
| ペン/スタイラス | pen |
| タッチ接触 | touch |
ユーザーエージェントがデバイスタイプを検出できない場合、値は空文字列でなければなりません。ユーザーエージェントが上記以外のポインターデバイス
タイプをサポートする場合、異なる
種類のデバイス間で名前が衝突することを避けるため、pointerType の値にはベンダープレフィックスを付けるべきです。将来の仕様では、他のデバイスタイプについて追加の
規範的な値を提供してもかまいません。
pointerType の使用方法の基本的な
例については、例 2を参照してください。また、開発者は、
独自のカスタム pointerType 値を実装している可能性のあるユーザーエージェントや、
pointerType が単に空文字列となる状況に対応するため、
何らかの形式のデフォルト処理を含めるべきであることにも注意してください。
isPrimaryポインターが、この ポインタータイプの プライマリポインターを表すかどうかを示します。
persistentDeviceIdポインティングデバイスの一意の識別子です。ハードウェアが複数のポインターをサポートする場合、
ポインティングデバイスから生成されたポインターイベントは、それらのポインターが
セッション全体を通して一意に識別可能な場合にのみ
persistentDeviceId を取得しなければなりません。
ポインターが一意に識別可能である場合、そのポインティングデバイスに割り当てられた
persistentDeviceId は、セッションの
残りの期間を通して一定のままです。persistentDeviceId の値 0 は、
生成元デバイスを識別できなかったイベントを示すために
予約して使用しなければなりません。pointerId と同様に、異なるページやドメイン間での
フィンガープリンティングや追跡の可能性を最小限にするため、
persistentDeviceId は、そのページ/セッションの存続期間に限って、
その特定のポインティングデバイスに明示的に関連付けなければならず、
その特定のポインティングデバイスが新しいセッションで再び使用される次の機会には、新しい
ランダム化された persistentDeviceId を選択しなければなりません。
persistentDeviceId が利用可能であるとは限りません。
たとえば、pointerdown が
persistentDeviceId を持つのに間に合うように、デバイスがハードウェア ID を
デジタイザーへ報告しない場合があります。この場合、persistentDeviceId は
最初は 0 で、その後有効な値に変化することがあります。
getCoalescedEvents()統合イベントのリストを返すメソッドです。
getPredictedEvents()予測イベントのリストを返すメソッドです。
PointerEventInit 辞書は、信頼されていない(合成された)ポインターイベントを
構築するための仕組みを提供するため、PointerEvent
インターフェイスのコンストラクターによって使用されます。これは MouseEventInit
辞書を継承します。信頼されていないポインターイベントを発火する方法を示す
サンプルコードについては、例を参照してください。
PointerEvent の イベント
構築手順では、
PointerEventInit の coalescedEvents を 統合イベントリストへ複製し、
PointerEventInit の predictedEvents を 予測イベントリストへ複製します。
PointerEvent インターフェイスは MouseEvent を継承します。
また、CSSOM View Module
で提案されている拡張にも注意してください。この拡張では、
小数座標を使用できるように、さまざまな座標プロパティを long
から double に変更します。この提案された拡張をすでに
PointerEvent には実装しているものの、通常の
MouseEvent には実装していないユーザーエージェントには、
click、auxclick、
および contextmenu イベントに関して追加の要件があります。
マルチポインター(たとえばマルチタッチ)のシナリオでは、isPrimary プロパティを使用して、
各ポインタータイプについて アクティブなポインターの集合の中から
主となるポインターを識別します。
pointerType につき 1 つ)がプライマリと見なされます。たとえば、タッチ接触と
マウスカーソルを同時に動かすと、どちらもプライマリと見なされるポインターが生成されます。
isPrimary を
false としてポインターイベントを発火してもかまいません。
e という名前の ポインター
イベントを発火するとは、PointerEvent インターフェイスおよび
属性とデフォルトアクションで定義されるように属性を設定した
PointerEvent を使用して、e という名前の
イベントを発火することを意味します。
イベントが gotpointercapture、lostpointercapture、click、
auxclick、または contextmenu イベントでない場合、この
PointerEvent に対して 保留中のポインターキャプチャーを処理する手順を実行します。
イベントが発火されるターゲットを 決定するには、次のようにします。
targetDocument を、ターゲットの ノード文書とします [DOM]。
イベントが pointerdown、pointermove、または pointerup の場合、イベントの pointerId に対する アクティブ文書を
targetDocument に設定します。
イベントが pointerdown で、関連する
デバイスが直接操作デバイスであり、ターゲットが Element である場合、
暗黙的なポインターキャプチャーで説明されているとおり、この pointerId についてターゲット要素に ポインターキャプチャーを設定します。
このイベントを発火する前に、ユーザーエージェントは、イベント順序を保証するため、
ポインティングデバイスが previousTarget からターゲット上へ移動したかのように
ターゲットを扱うべきです。needsOverEvent フラグが設定されている場合、ターゲット
要素が同じであっても pointerover イベントが必要です。
決定されたターゲットにイベントを発火します。
決定されたターゲットを、指定されたポインターの previousTarget として保存し、
needsOverEvent フラグを false にリセットします。
previousTarget がいずれかの時点で 接続されている状態ではなくなる場合 [DOM]、
previousTarget にイベントをディスパッチすることに対応するイベントパスに従って、
previousTarget を、まだ 接続されている [DOM] 最も近い親へ
更新し、needsOverEvent フラグを true に設定します。
この仕様で定義されているイベントタイプの bubbles および cancelable プロパティと
デフォルトアクションを次の表に示します。各
イベントタイプの詳細は、ポインターイベントの種類で説明します。
| イベントタイプ | バブリング | キャンセル可能 | デフォルトアクション |
|---|---|---|---|
pointerover
|
はい | はい | なし |
pointerenter |
いいえ | いいえ | なし |
pointerdown
|
はい | はい | 場合による: ポインターがプライマリである場合、
mousedown イベントのすべてのデフォルトアクション
このイベントをキャンセルすると、その後の 互換マウスイベントの発火も防止されます。 |
pointermove
|
はい | はい | 場合による: ポインターがプライマリである場合、mousemove のすべてのデフォルトアクション
|
pointerrawupdate |
はい | いいえ | なし |
pointerup |
はい | はい | 場合による: ポインターがプライマリである場合、mouseup のすべてのデフォルトアクション
|
pointercancel |
はい | いいえ | なし |
pointerout
|
はい | はい | なし |
pointerleave |
いいえ | いいえ | なし |
gotpointercapture |
はい | いいえ | なし |
lostpointercapture |
はい | いいえ | なし |
ビューポートの操作(パンおよびズーム)は、一般に 直接操作によるものであり、意図的に
ポインターイベントのデフォルトアクションにはなっていません。つまり、これらの動作(たとえば、タッチスクリーン上で指を動かした結果として
ページをパンすること)は、ポインターイベントをキャンセルしても抑制できません。代わりに作者は touch-action を使用して、
文書内の領域に対する 直接操作の動作を宣言する
必要があります。イベントのキャンセルへのこの依存をなくすことで、
ユーザーエージェントによるパフォーマンス最適化が容易になります。
pointerenter および pointerleave イベントでは、composed
[DOM] 属性は
false であるべきです。上記の表にあるその他すべてのポインターイベントでは、この属性は
true であるべきです。
上記の表にあるすべてのポインターイベントについて、detail 属性は
0 であるべきです。
fromElement および
toElement を公開しています。作者を標準化された代替
(target および relatedTarget)の使用へ移行させるため、これらのユーザー
エージェントが PointerEvents におけるこれらの(継承された)属性の値を
null に設定することを推奨します。
MouseEvent の relatedTarget と同様に、
relatedTarget は、ポインターが直前に境界から離れた要素
(pointerover または
pointerenter イベントの場合)、またはポインターが境界内へ入ろうとしている要素(
pointerout または pointerleave
イベントの場合)に初期化するべきです。その他のポインターイベントでは、
この値はデフォルトで null になります。要素がポインターキャプチャーを受け取った場合、
そのポインターに対する以降のすべてのイベントは、キャプチャーしている
要素の境界内にあるものと見なされることに注意してください。
gotpointercapture
および lostpointercapture
イベントでは、上記の表で定義されたものを除くすべての
属性は、ユーザーエージェントに 保留中のポインターキャプチャーを処理する手順を実行させ、
gotpointercapture
および lostpointercapture
イベントを発火させたポインターイベントと同じであるべきです。
ユーザーエージェントは、
ポインター
キャプチャーを暗黙的に解放する場合、および gotpointercapture または lostpointercapture
ではないポインターイベントを発火する場合、次の手順を実行しなければなりません。
lostpointercapture
という名前のポインターイベントを発火します。
gotpointercapture
という名前のポインターイベントを発火します。
click、
auxclick、および contextmenu イベントの節で定義されているように、lostpointercapture イベントが
ディスパッチされた後であっても、
対応する click、auxclick、または contextmenu
イベントが存在する場合、それは引き続きキャプチャーターゲットにディスパッチされます。
ユーザーエージェントは、
ウェブページが特定の pointerId
を持つポインターイベントを引き続き受信する可能性が低いと検出した場合、
ポインターイベントストリームを抑制しなければなりません。次のいずれの
シナリオもこの条件を満たします(追加のシナリオが存在してもかまいません)。
touch-action CSS
プロパティの節を参照してください。
ユーザーエージェントが ポインターイベント ストリームを抑制してもよいその他のシナリオには、次のものがあります。
これらのシナリオを検出する方法は、この仕様の範囲外です。
ユーザーエージェントは、ポインターイベントストリームを抑制するために、次の手順を実行しなければなりません。
pointercancel
イベントを発火します。pointerout イベントを発火します。
pointerleave イベントを発火します。
画面表面に対して移動した、またはその
プロパティのいずれかに何らかの変化が生じたポインティングデバイスは、ポインターイベントの種類で定義されているさまざまなイベントを発火します。
静止したポインティングデバイス(画面表面に対して移動せず、
どのプロパティにも変化がないもの)については、ポインターの
ヒットテストターゲットに影響を与えるレイアウト変更の後、ユーザーエージェントは
特定の境界イベントを発火しなければなりません。詳細については、pointerover、pointerenter、pointerout、および pointerleave を参照してください。ユーザーエージェントは、パフォーマンス上の
理由(たとえば、過剰なヒットテストや境界イベントリスナーによって引き起こされるレイアウト変更を避けるため)により、
これらの境界イベントの発火を遅延してもかまいません。
pointermove
イベントを発火することはありません。ポインターイベントには、X-Y 平面に対する
トランスデューサーの向きを表すための、相互補完的な 2 組の属性が含まれています。tiltX / tiltY
(元の Pointer Events 仕様で導入)と、azimuthAngle / altitudeAngle
(Touch Events - Level 2
仕様から採用)です。
特定のハードウェアやプラットフォームによっては、ユーザーエージェントが画面平面に対する
トランスデューサーの向きについて受け取る値の組は、tiltX /
tiltY または altitudeAngle / azimuthAngle の
どちらか一方のみである可能性が高いです。ユーザーエージェントは、これらの値を変換するために次のアルゴリズムを使用しなければなりません。
ユーザーエージェントが azimuthAngle
/ altitudeAngle から tiltX / tiltY を計算する場合、最終的な整数値は
Math.round [ECMASCRIPT] の規則を使用して丸めるべきです。
/* tiltX/tiltY と altitudeAngle/azimuthAngle の間の変換 */
function spherical2tilt(altitudeAngle, azimuthAngle) {
const radToDeg = 180/Math.PI;
let tiltXrad = 0;
let tiltYrad = 0;
if (altitudeAngle == 0) {
// ペンは X-Y 平面上にある
if (azimuthAngle == 0 || azimuthAngle == 2*Math.PI) {
// ペンは正の X 軸上にある
tiltXrad = Math.PI/2;
}
if (azimuthAngle == Math.PI/2) {
// ペンは正の Y 軸上にある
tiltYrad = Math.PI/2;
}
if (azimuthAngle == Math.PI) {
// ペンは負の X 軸上にある
tiltXrad = -Math.PI/2;
}
if (azimuthAngle == 3*Math.PI/2) {
// ペンは負の Y 軸上にある
tiltYrad = -Math.PI/2;
}
if (azimuthAngle>0 && azimuthAngle<Math.PI/2) {
tiltXrad = Math.PI/2;
tiltYrad = Math.PI/2;
}
if (azimuthAngle>Math.PI/2 && azimuthAngle<Math.PI) {
tiltXrad = -Math.PI/2;
tiltYrad = Math.PI/2;
}
if (azimuthAngle>Math.PI && azimuthAngle<3*Math.PI/2) {
tiltXrad = -Math.PI/2;
tiltYrad = -Math.PI/2;
}
if (azimuthAngle>3*Math.PI/2 && azimuthAngle<2*Math.PI) {
tiltXrad = Math.PI/2;
tiltYrad = -Math.PI/2;
}
}
if (altitudeAngle != 0) {
const tanAlt = Math.tan(altitudeAngle);
tiltXrad = Math.atan(Math.cos(azimuthAngle) / tanAlt);
tiltYrad = Math.atan(Math.sin(azimuthAngle) / tanAlt);
}
return {"tiltX":tiltXrad*radToDeg, "tiltY":tiltYrad*radToDeg};
}
function tilt2spherical(tiltX, tiltY) {
const tiltXrad = tiltX * Math.PI/180;
const tiltYrad = tiltY * Math.PI/180;
// 方位角を計算する
let azimuthAngle = 0;
if (tiltX == 0) {
if (tiltY > 0) {
azimuthAngle = Math.PI/2;
}
else if (tiltY < 0) {
azimuthAngle = 3*Math.PI/2;
}
} else if (tiltY == 0) {
if (tiltX < 0) {
azimuthAngle = Math.PI;
}
} else if (Math.abs(tiltX) == 90 || Math.abs(tiltY) == 90) {
// 方位角を計算するための情報が不足している
azimuthAngle = 0;
} else {
// 非境界ケース: tiltX も tiltY も 0 または +-90 ではない
const tanX = Math.tan(tiltXrad);
const tanY = Math.tan(tiltYrad);
azimuthAngle = Math.atan2(tanY, tanX);
if (azimuthAngle < 0) {
azimuthAngle += 2*Math.PI;
}
}
// 高度角を計算する
let altitudeAngle = 0;
if (Math.abs(tiltX) == 90 || Math.abs(tiltY) == 90) {
altitudeAngle = 0
} else if (tiltX == 0) {
altitudeAngle = Math.PI/2 - Math.abs(tiltYrad);
} else if (tiltY == 0) {
altitudeAngle = Math.PI/2 - Math.abs(tiltXrad);
} else {
// 非境界ケース: tiltX も tiltY も 0 または +-90 ではない
altitudeAngle = Math.atan(1.0/Math.sqrt(Math.pow(Math.tan(tiltXrad),2) + Math.pow(Math.tan(tiltYrad),2)));
}
return {"altitudeAngle":altitudeAngle, "azimuthAngle":azimuthAngle};
}
PointerEvent を初期化するevent、eventType、eventTarget、bubbles、および cancelable を用いて PointerEvent を初期化するには、次の手順を実行します。
PointerEvent 値に初期化します。
PointerEvent を作成する
eventType、eventTarget、bubbles、および cancelable を用いて
PointerEvent を作成するには、次の手順を実行します。
PointerEvent を使用して
イベントを
作成した結果とします
DOMString としますMouseEvent としますPointerEvent を使用して
イベントを
作成した結果とします
target としますMouseEvent の属性を
mouseevent から event にコピーします
MouseEvent としますTODO.
target としますMouseEvent としますTODO.
target としますMouseEvent としますTODO.
target としますMouseEvent としますTODO.
target としますMouseEvent とします
これは pointermove と pointerrawupdate を送信できますか?それとも 2 つのメソッドが必要ですか?
pointermove イベントがどのように統合されるかを適切に定義するには何が必要ですか?
TODO.
target としますMouseEvent とします
mousedown イベントとは異なり、pointerdown
イベントは、複数のボタンが押された場合でも入れ子になりません。
MouseEvent は、
フィールドを PointerEvent にコピーできるように渡されます。
TODO.
target としますMouseEvent とします
target としますMouseEvent とします
mouseup イベントとは異なり、pointerup イベントは、
複数のボタンが押された場合でも入れ子になりません。MouseEvent は、
フィールドを PointerEvent にコピーできるように渡されます。
TODO.
target とします以下は、この仕様で定義されるイベントタイプです。
プライマリポインターの場合、これらのイベント(gotpointercapture および lostpointercapture を除く)は、互換マウスイベントも発火する場合があります。
| タイプ | pointerover |
|---|---|
| インターフェイス | PointerEvent
|
| バブリング | はい |
| キャンセル可能 | はい |
| 合成 | はい |
| コンテキスト (信頼されたイベント) |
|
ユーザーエージェントは、
次のいずれかが発生した場合、pointerover という名前の ポインターイベントを発火しなければなりません。
pointerdown イベントを発火する前
(pointerdown を参照)。| タイプ | pointerenter |
|---|---|
| インターフェイス | PointerEvent
|
| バブリング | いいえ |
| キャンセル可能 | いいえ |
| 合成 | いいえ |
| コンテキスト (信頼されたイベント) |
|
ユーザーエージェントは、
次のいずれかが発生した場合、pointerenter という名前の ポインターイベントを発火しなければなりません。
pointerdown イベントを発火する前
(pointerdown を参照)。mouseenter イベント、および
[CSS21]
で説明される CSS :hover 疑似クラスには類似点があります。
pointerleave イベントも参照してください。
| タイプ | pointerdown |
|---|---|
| インターフェイス | PointerEvent
|
| バブリング | はい |
| キャンセル可能 | はい |
| 合成 | はい |
| コンテキスト (信頼されたイベント) |
ユーザーエージェントは、
ポインターが アクティブボタン状態になったとき、pointerdown という名前の ポインターイベントを発火しなければなりません。マウスの場合、これは
ボタンが 1 つも押されていない状態から、少なくとも 1 つのボタンが押された状態へ
デバイスが遷移したときです。タッチの場合、これは デジタイザーに物理的に接触したときです。ペンの場合、
ボタンを押さずにペンがデジタイザーに物理的に接触したとき、またはホバー中に
ボタンが 1 つも押されていない状態から少なくとも 1 つのボタンが押された状態へ遷移したときです。
pointerdown および pointerup が、
mousedown および mouseup とまったく同じすべての状況で発火するわけではないことを意味します。詳細については
複数ボタンの同時操作を参照してください。
ホバーをサポートしない
入力デバイスについては、ユーザー
エージェントは、pointerdown
イベントをディスパッチする前に、
pointerover という名前の ポインター
イベントを発火し、続いて pointerenter という名前の
ポインターイベントを発火しなければなりません。
pointerdown
イベントをキャンセルすることで
(isPrimary プロパティが true の場合)、特定の 互換マウスイベントの発火を防止できます。
これにより、ポインターに PREVENT MOUSE EVENT フラグが設定されます。ただし、これは
mouseover、mouseenter、mouseout、または
mouseleave イベントの発火を防止しないことに注意してください。
| タイプ | pointermove |
|---|---|
| インターフェイス | PointerEvent
|
| バブリング | はい |
| キャンセル可能 | はい |
| 合成 | はい |
| コンテキスト (信頼されたイベント) |
ユーザーエージェントは、
ポインターが pointerdown または pointerup イベントを発火させないいずれかの
プロパティを変更したとき、pointermove という名前の ポインターイベントを発火しなければなりません。これには、
座標、圧力、接線圧力、
傾き、回転、接触形状(width および height)、または 複数ボタンの同時操作へのあらゆる変更が含まれます。
ユーザーエージェントは、pointermove イベントのディスパッチを
(たとえばパフォーマンス上の理由で)遅延してもかまいません。
統合イベントの情報は、ディスパッチされた単一の pointermove イベントについて、getCoalescedEvents
メソッドを介して公開されます。
このようなイベントの最終座標を、イベントのターゲットを見つけるために使用するべきです。
| タイプ | pointerrawupdate |
|---|---|
| インターフェイス | PointerEvent
|
| バブリング | はい |
| キャンセル可能 | いいえ |
| 合成 | はい |
| コンテキスト (信頼されたイベント) |
ユーザーエージェントは、
ポインターが pointerdown または pointerup イベントを発火させない
いずれかのプロパティを変更した場合、セキュアコンテキスト内でのみ、
pointerrawupdate という
名前の ポインターイベントを発火しなければなりません。
このようなプロパティの一覧については、pointermove イベントを参照してください。
pointermove とは対照的に、ユーザーエージェントは、
pointerrawupdate イベントを可能な限り早く、
JavaScript がイベントを処理できる限り高い頻度でディスパッチするべきです。
pointerrawupdate イベントの target
は、
pointermove イベントのものと異なる場合があります。
これは、pointermove イベントが
遅延または統合される場合があり、target を見つけるために使用されるイベントの最終位置が、
その統合イベントとは異なる可能性があるためです。
同じ pointerId を持つ別の pointerrawupdate が
イベントループ内でまだ
ディスパッチされていない場合、ユーザーエージェントは、
新しい pointerrawupdate を、新しい
タスクを作成する代わりに
そのイベントと統合してもかまいません。
これにより pointerrawupdate が
統合イベントを持つ場合があり、
イベントが イベントループで処理されるとすぐに、
それらすべてが 1 つの pointerrawupdate イベントの
統合イベントとして配信されます。
詳細については getCoalescedEvents
を参照してください。
pointerrawupdate と pointermove の順序について、
ユーザーエージェントがプラットフォームから、pointerrawupdate と pointermove の両方のイベントを発生させる更新を受信した場合、
ユーザーエージェントは、対応する
pointermove より前に pointerrawupdate イベントをディスパッチしなければなりません。
target を除き、最後の pointermove
イベント以降にディスパッチされたすべての pointerrawupdate イベントの
統合イベントリストを連結したものは、その他のイベント
属性に関して、次の pointermove イベントの統合イベントと同じです。
pointerrawupdate の属性は、
ほとんど pointermove と同じですが、
pointerrawupdate では
cancelable が false でなければならない点が例外です。
ユーザーエージェントは、pointerrawupdate に対して
互換マウスイベントを発火するべきではありません。
pointerrawupdate
イベントのリスナーを追加すると、
ユーザーエージェントの実装によってはウェブページのパフォーマンスに悪影響を与える可能性があります。
ほとんどのユースケースでは、その他の pointerevent タイプで十分です。
JavaScript が高頻度イベントを必要とし、それらを同じくらい高速に処理できる場合にのみ、
pointerrawupdate
リスナーを追加するべきです。
このような場合、他の種類のポインターイベントを監視する必要はおそらくありません。
| タイプ | pointerup |
|---|---|
| インターフェイス | PointerEvent
|
| バブリング | はい |
| キャンセル可能 | はい |
| 合成 | はい |
| コンテキスト (信頼されたイベント) |
ユーザーエージェントは、
ポインターが アクティブボタン状態を離れたとき、pointerup という名前の ポインターイベントを発火しなければなりません。マウスの場合、これは
少なくとも 1 つのボタンが押された状態から、ボタンが 1 つも押されていない状態へ
デバイスが遷移したときです。タッチの場合、これは デジタイザーとの物理的な接触が解除されたときです。ペンの場合、
ボタンが押されていない状態でペンがデジタイザーとの物理的な接触から離れたとき、または
ホバー中に少なくとも 1 つのボタンが押された状態からボタンが 1 つも押されていない状態へ遷移したときです。
ホバーをサポートしない
入力デバイスについては、ユーザー
エージェントは、pointerup イベントをディスパッチした後、
pointerout という名前の ポインター
イベントを発火し、続いて pointerleave という名前の
ポインターイベントを発火しなければなりません。
すべての pointerup イベントでは、pressure
の値は 0 です。
ポインターが現在キャプチャーされている場合、ユーザーエージェントは ポインター キャプチャーを暗黙的に解放しなければなりません。
pointerdown および pointerup が、
mousedown および mouseup とまったく同じすべての状況で発火するわけではないことを意味します。詳細については
複数ボタンの同時操作を参照してください。
| タイプ | pointercancel |
|---|---|
| インターフェイス | PointerEvent
|
| バブリング | はい |
| キャンセル可能 | いいえ |
| 合成 | はい |
| コンテキスト (信頼されたイベント) |
ユーザーエージェントは、
ポインターイベントストリームを抑制するシナリオを検出した場合、
pointercancel という名前の ポインターイベントを発火しなければなりません。
pointercancel イベントの次のプロパティの値は、
同じ pointerId
を持つ最後にディスパッチされたポインターイベントの値と
一致しなければなりません: width、
height、pressure、tangentialPressure、tiltX、
tiltY、twist、altitudeAngle、azimuthAngle、
pointerType、isPrimary、およびマウスイベントから継承された座標。
pointercancel イベントの
coalescedEvents および predictedEvents リストは空でなければならず、イベントの cancelable 属性は
false でなければなりません。
| タイプ | pointerout |
|---|---|
| インターフェイス | PointerEvent
|
| バブリング | はい |
| キャンセル可能 | はい |
| 合成 | はい |
| コンテキスト (信頼されたイベント) |
|
ユーザーエージェントは、
次のいずれかが発生した場合、pointerout という名前の ポインターイベントを発火しなければなりません。
pointerup イベントを
ホバーをサポートしないデバイスに対して発火した後
(pointerup を参照)。
| タイプ | pointerleave |
|---|---|
| インターフェイス | PointerEvent
|
| バブリング | いいえ |
| キャンセル可能 | いいえ |
| 合成 | いいえ |
| コンテキスト (信頼されたイベント) |
|
ユーザーエージェントは、
次のいずれかが発生した場合、pointerleave という名前の ポインターイベントを発火しなければなりません。
pointerup イベントを
ホバーをサポートしないデバイスに対して発火した後
(pointerup を参照)。
mouseleave イベント、および
[CSS21]
で説明される CSS :hover 疑似クラスには類似点があります。
pointerenter イベントも参照してください。
| タイプ | gotpointercapture |
|---|---|
| インターフェイス | PointerEvent
|
| バブリング | はい |
| キャンセル可能 | いいえ |
| 合成 | はい |
| コンテキスト (信頼されたイベント) |
ユーザーエージェントは、
要素がポインターキャプチャーを受け取ったとき、gotpointercapture という名前の
ポインターイベントを発火しなければなりません。このイベントは、ポインター
キャプチャーを受け取る要素で発火します。そのポインターに対する後続のイベントは、この要素で発火します。ポインターキャプチャーの設定および 保留中のポインターキャプチャーを処理する節を参照してください。
| タイプ | lostpointercapture |
|---|---|
| インターフェイス | PointerEvent
|
| バブリング | はい |
| キャンセル可能 | いいえ |
| 合成 | はい |
| コンテキスト (信頼されたイベント) |
ユーザーエージェントは、
ポインターについてポインターキャプチャーが解放された後、lostpointercapture
という名前の ポインターイベントを発火しなければなりません。このイベントは、キャプチャーが解放された後の
ポインターに対する後続のあらゆるイベントより前に発火しなければなりません。
このイベントは、ポインターキャプチャーが削除された要素で発火します。click、auxclick、および
contextmenu イベントを除くポインターに対する後続のすべてのイベントは、
イベントターゲットを決定するために通常のヒットテスト機構(この仕様の範囲外)に従います。ポインター
キャプチャーの解放、ポインターキャプチャーの暗黙的な
解放、および 保留中のポインター
キャプチャーを処理する節を参照してください。
次の節では、ポインターキャプチャーの設定と解放を容易にするための、既存の Element インターフェイスの
拡張について説明します。
WebIDLpartial interface Element {
undefined setPointerCapture (long pointerId);
undefined releasePointerCapture (long pointerId);
boolean hasPointerCapture (long pointerId);
};
setPointerCapture()引数 pointerId によって識別される
ポインターについて、このメソッドが呼び出された要素に ポインターキャプチャーを設定します。そのポインターの後続イベントでは、
ポインターが常にキャプチャーターゲット上にあるかのように、キャプチャーターゲットが
通常のヒットテスト結果の代わりとなり、キャプチャーが
解放されるまで、それらのターゲットは常にこの要素でなければなりません。
このメソッドを有効にするには、ポインターがその アクティブボタン状態になければならず、
そうでない場合は何もせず失敗します。指定されたメソッドの引数が、いずれの
アクティブなポインターとも一致しない場合、"NotFoundError" DOMException を スローします。
releasePointerCapture()引数 pointerId
によって識別されるポインターについて、このメソッドが呼び出された要素から ポインターキャプチャーを解放します。
ポインターの後続イベントでは、イベント
ターゲットを決定するために通常のヒットテスト機構(この仕様の範囲外)に従います。
指定されたメソッドの引数が、いずれの アクティブなポインターとも一致しない場合、"NotFoundError" DOMException を スローします。
hasPointerCaptureこのメソッドが呼び出された要素が、引数 pointerId
によって識別されるポインターについて
ポインター
キャプチャーを持つかどうかを示します。特に、
pointerId に対する
保留中のポインターキャプチャーターゲットの
オーバーライドが、このメソッドが呼び出された要素に設定されている場合は
true を返し、それ以外の場合は false を返します。
setPointerCapture()
を呼び出した直後、
その要素がまだ gotpointercapture イベントを受信していなくても
true を返します。そのため、pointerdown
イベントリスナーの内部から
暗黙的なポインターキャプチャーを検出する場合に有用です。
次の節では、イベントハンドラーの登録を容易にするための、既存の 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 イベントタイプ用の イベント
ハンドラー IDL 属性です。
onpointerenterpointerenter イベントタイプ用の イベント
ハンドラー IDL 属性です。
onpointerdownpointerdown イベントタイプ用の イベント
ハンドラー IDL 属性です。
onpointermovepointermove イベントタイプ用の イベント
ハンドラー IDL 属性です。
onpointerrawupdatepointerrawupdate イベントタイプ用の イベント
ハンドラー IDL 属性です。
onpointeruppointerup イベントタイプ用の イベント
ハンドラー IDL 属性です。
onpointercancelpointercancel イベントタイプ用の イベント
ハンドラー IDL 属性です。
onpointeroutpointerout イベントタイプ用の イベント
ハンドラー IDL 属性です。
onpointerleavepointerleave イベントタイプ用の イベント
ハンドラー IDL 属性です。
ongotpointercapturegotpointercapture
イベントタイプ用の イベント
ハンドラー IDL 属性です。
onlostpointercapturelostpointercapture
イベントタイプ用の イベント
ハンドラー IDL 属性です。
属性とデフォルトアクションで述べたように、ビューポートの
操作(パンおよびズーム)は、ポインターイベントをキャンセルしても抑制できません。代わりに、作者は
touch-action CSS プロパティを使用して、これらの動作のうちどれを許可し、どれを抑制するかを
宣言的に定義しなければなりません。
touch-action CSS プロパティは
タッチ入力のみを対象としているように見えますが、実際にはパンおよびズームのための 直接操作を可能にするあらゆる形式のポインター入力に適用されます。
| 名前: | touch-action |
|---|---|
| 値: | auto | none | [ [ pan-x | pan-left |
pan-right ] || [ pan-y | pan-up |
pan-down ] ] | manipulation
|
| 初期値: | auto |
| 適用対象: | 次を除くすべての要素: 置換されないインライン要素、表の行、行グループ、表の列、 および列グループ |
| 継承: | しない |
| パーセンテージ: | 該当なし |
| メディア: | 視覚 |
| 算出値: | 指定値と同じ |
| 正規順序: | 文法に従う |
| アニメーションタイプ: | アニメーション不可 |
touch-action CSS プロパティは、直接
操作によるインタラクション(プロパティ名に反してタッチに限定されません)が、ユーザーエージェントのパンおよびズーム動作を
引き起こしてもよいかどうかを決定します。touch-action
の値に関する節を参照してください。
パンまたはズームを開始する直前に、次のすべての条件が真である場合、ユーザーエージェントは ポインターイベントストリームを抑制しなければなりません。
pointerdown
イベントが送信されていること、およびpointerdown に続く pointerup または pointercancel イベントがまだ送信されていないこと。touch-action は、埋め込まれた閲覧コンテキストへ適用/カスケードされません。
たとえば、<iframe> に touch-action を適用しても、
<iframe> 自体の内部でのパンおよびズームに対する直接操作インタラクションの動作には
影響しません。
ユーザーが 直接操作ポインター(タッチスクリーン上の
タッチやスタイラスなど)を使用して要素と対話する場合、その入力の効果は、
touch-action プロパティの値、および要素とその祖先のデフォルトの直接操作動作によって、次のように決定されます。
touch-action に適合します。
CSS 変換が適用されている場合、要素の座標空間は画面座標とは異なり、
ここでの適合性に影響する可能性があることに注意してください。たとえば、画面に対して 90 度回転した要素の
X 軸は、画面座標の Y 軸と平行になります。touch-action プロパティに 適合する場合にサポートされます。
document 要素までの各要素の touch-action プロパティに 適合する場合にサポートされます。
touch-action 値の変更は、
その操作の継続中は無視されます。たとえば、pointerdown
ハンドラースクリプトの一部として、
要素の touch-action 値を auto から none へ
プログラムによって変更しても、そのポインターがアクティブである間、
ユーザーエージェントがその入力に対するパンまたはズーム動作を中止または抑制することにはなりません。
pan-* の touch-action 値の場合、
ジェスチャー開始時にユーザーエージェントがジェスチャーを直接処理するかどうかを決定した後は、
同じジェスチャーの方向がその後変化しても、そのポインターがアクティブである間は
ユーザーエージェントによって無視されるべきです。たとえば、要素に
touch-action: pan-y が設定されている(つまり、垂直方向のパンのみを
ユーザーエージェントが処理する)場合、タッチジェスチャーが水平方向に開始され、その後、
指がまだ画面に触れている間にユーザーがジェスチャーの方向を垂直方向に変更しても、垂直方向のパンは発生するべきではありません。
touch-action 値を処理または関連付ける方法は、この仕様の範囲外です。
touch-action プロパティは、ビューポートのパンおよびズームに関連する直接操作動作を対象とします。
テキストの選択/強調表示、リンクやフォームコントロールのアクティブ化など、その他のユーザーエージェントの動作は、
この CSS プロパティの影響を受けてはなりません。
auto または none 値の動作を開始するためのインタラクションまたはジェスチャーを
定義することは、この仕様の範囲外です。pan-x または pan-y)、パンの途中で軸を変更することはできません。touch-action 値は [COMPAT] で定義されています。touch-action プロパティは、CSS の
width および height プロパティの両方をサポートする要素にのみ適用されます
([CSS21]
を参照)。
この制限は、低遅延の 直接操作によるパンおよびズームについて、
ユーザーエージェントの最適化を容易にするために設計されています。デフォルトではサポートされない要素、
たとえば置換されないインライン
要素である <span> については、作者は display CSS プロパティを、
width および height をサポートする block などの値に設定できます。
将来の仕様では、この API をすべての要素に拡張できる可能性があります。
方向固有のパン値は、一部のオーバースクロール動作をカスタマイズするのに役立ちます。
たとえば、単純なプル・トゥ・リフレッシュ効果を実装するには、スクロール位置が
0 のときは文書の touch-action を pan-x pan-down に設定し、
それ以外では pan-x pan-y に設定できます。
これにより、ポインターイベントハンドラーは、文書の先頭から開始する上方向へのパン/スクロールの
動作を定義できます。
方向固有のパン値は、ネイティブにスクロールする要素内で、
ポインターイベント処理によるカスタムパンを実装するコンポーネントを構成する場合
(またはその逆)にも使用できます。
たとえば、画像カルーセルでは pan-y を使用することで、文書の垂直方向のパンを妨げずに、
水平方向のパン操作について確実にポインターイベントを受信できます。
カルーセルが右端に達したとき、touch-action を
pan-y pan-right に変更することで、その範囲を超える後続のスクロール操作によって、
可能であればビューポート内の文書をスクロールできるようにすることができます。
パン/スクロール操作の実行中にその動作を変更することはできません。
auto では、
ユーザーエージェントは通常、ダブルタップジェスチャーを処理できるように、
click の前に 300ms の遅延を追加します。このような場合、touch-action: none または
touch-action: manipulation を明示的に設定すると、この遅延がなくなります。
タップまたはダブルタップジェスチャーを判定する方法は、この仕様の範囲外であることに注意してください。
<div style="touch-action: none;">
この要素は、通常であればパンまたはズームにつながるすべての直接操作インタラクションについてポインターイベントを受信します。
</div>
<div style="touch-action: pan-x;">
この要素は、水平方向にパンしていないときにポインターイベントを受信します。
</div>
<div style="overflow: auto;">
<div style="touch-action: none;">
この要素は、通常であればパンまたはズームにつながるすべての直接操作インタラクションについてポインターイベントを受信します。
</div>
<div>
この要素上の直接操作インタラクションは、親を操作するために消費されてもよいです。
</div>
</div>
<div style="overflow: auto;">
<div style="touch-action: pan-y;">
<div style="touch-action: pan-x;">
この要素は、すべての直接操作インタラクションについてポインターイベントを受信します。これは、
この要素が水平方向のパンのみを許可する一方、中間の祖先
(この要素とスクロール可能な要素の間)が垂直方向のパンのみを許可するためです。
したがって、パン/ズームの直接操作動作は
ユーザーエージェントによって処理されません。
</div>
</div>
</div>
<div style="overflow: auto;">
<div style="touch-action: pan-y pan-left;">
<div style="touch-action: pan-x;">
この要素は、左方向へパンしていないときにポインターイベントを受信します。
</div>
</div>
</div>
この節は非規範的です。
ポインターキャプチャーにより、特定のポインターのイベント(あらゆる 互換マウスイベントを含む)を、ポインター位置の通常の ヒットテスト結果とは異なる特定の要素へ再ターゲットできます。これは、
カスタムスライダーコントロール(たとえば [HTML] の
<input type="range"> コントロールに似たもの)のようなシナリオで役立ちます。ポインターキャプチャーをスライダーのつまみ
要素に設定することで、ポインターがつまみから外れた場合でも、ユーザーはコントロールを前後にスライドできます。
pointerdown が発生した後、ポインターキャプチャーを
使用することで、ポインターがつまみから外れた場合でもユーザーがつまみをスライドできるようにできます。
element.setPointerCapture(pointerId) メソッドを呼び出すことで、Element 型の
element にポインターキャプチャーを設定します。
このメソッドが呼び出されたとき、ユーザーエージェントは、次の手順を実行しなければなりません。
pointerId が、いずれの アクティブなポインターとも一致しない場合、"NotFoundError" DOMException を スローします。pointerId によって指定される アクティブなポインターとします。
InvalidStateError" DOMException を スローします。pointerLockElement)
がある間にこのメソッドが呼び出された場合、"InvalidStateError" DOMException を スローします。
pointerId について、保留中のポインターキャプチャーターゲットのオーバーライドを、このメソッドが
呼び出された Element に設定します。pointerdown リスナーで解放しようとして失敗した場合にも当てはまります。element.releasePointerCapture(pointerId) メソッドを呼び出すことで、要素上のポインターキャプチャーを明示的に解放します。
このメソッドが呼び出されたとき、ユーザーエージェントは、次の手順を実行しなければなりません。
pointerId が、いずれの アクティブなポインターにも一致せず、かつこれらの手順が
ポインターキャプチャの暗黙的な
解放の結果として呼び出されているのではない場合、"NotFoundError" DOMException をスローします。
pointerId を持つ Element に対して hasPointerCapture が false の場合、これらの
手順を終了します。
pointerId について、設定されている場合は 保留中のポインターキャプチャ対象の
上書きをクリアします。パンおよびズームのための直接操作インタラクションを実装する入力
(タッチスクリーン上のタッチやスタイラスなど)は、任意の pointerdown
リスナーが呼び出される直前に、対象要素で setPointerCapture が呼び出された場合と
まったく同じように動作するべきです。hasPointerCapture
API は、これが
発生したかどうかを判定するために使用できます(たとえば、pointerdown
リスナー内で)。次のポインターイベントが発火する前に、
そのポインターに対して releasePointerCapture が
呼び出されなかった場合、キャプチャが有効であることを示す gotpointercapture イベントが(通常どおり)
対象にディスパッチされます。
pointerup または pointercancel イベントを発火した直後、
ユーザーエージェントは、
直前にディスパッチされた pointerup または pointercancel イベントの pointerId について、保留中のポインターキャプチャーターゲットの
オーバーライドをクリアしなければならず、
その後、必要に応じて lostpointercapture
を発火するため、保留中のポインターキャプチャーを処理する手順を実行します。
保留中のポインターキャプチャーを処理する手順を実行した後、
ポインターがホバーをサポートする場合、ユーザーエージェントは、キャプチャーされていない
ポインターの現在位置を反映するために必要な対応する境界イベントも
送信しなければなりません。
ポインターキャプチャーターゲットのオーバーライドが、もはや 接続されていない場合 [DOM]、 ポインターキャプチャーターゲットのオーバーライドは 文書に設定されるべきです。
保留中のポインターキャプチャーターゲットの オーバーライドが、もはや 接続されていない場合 [DOM]、 保留中のポインターキャプチャーターゲットの オーバーライドノードはクリアされるべきです。
lostpointercapture イベントが
文書で発火します。
要素にポインターロック [PointerLock] が正常に適用されたとき、いずれかの要素が
キャプチャーされるよう設定されている、またはキャプチャー保留中に設定されている場合、ユーザーエージェントは、releasePointerCapture メソッドが
呼び出されたかのように手順を実行しなければなりません。
パフォーマンス上の理由から、ユーザーエージェントは、ポインターの 測定可能なプロパティ
(座標、圧力、接線圧力、傾き、回転、接触形状など)が更新されるたびに pointermove
イベントを送信しないことを選択する場合があります。代わりに、複数の変更を統合(結合/マージ)して
単一の pointermove または pointerrawupdate イベントにする場合があります。この
方法は、ユーザーエージェントが実行しなければならない
イベント処理の量を減らすのに役立ちますが、
ポインター位置を追跡する際の粒度と忠実度は当然低下し、
特に高速かつ大きな移動では顕著になります。
getCoalescedEvents メソッドを使用すると、
アプリケーションは生の未統合の位置変化にアクセスできます。これにより、
ポインター移動データをより正確に処理できます。たとえば描画
アプリケーションでは、未統合のイベントを使用して、ポインターの実際の動きに
より密接に一致する滑らかな曲線を描画できます。
pointermove イベントの統合された
座標(灰色の点)のみを使用すると、曲線は明らかに
角ばってぎざぎざになります。同じ線を getCoalescedEvents() が提供する
より細粒度の点(赤い円)を使用して描くと、ポインター移動をより滑らかに近似できます。PointerEvent には、関連付けられた 統合
イベントリスト(0 個以上の
PointerEvent のリスト)があります。信頼された pointermove および
pointerrawupdate イベントでは、このリストは
このイベントへ統合されたすべての PointerEvent のシーケンスです。
「親」の信頼された pointermove および
pointerrawupdate イベントは、これらの統合イベントの
集積を表しますが、追加の処理(たとえばディスプレイのリフレッシュレートに合わせるため)が
行われる場合があります。その結果、これらのイベントの統合イベントリストには常に少なくとも 1 つのイベントが含まれます。
その他すべての信頼されたイベントタイプでは、空のリストです。信頼されていないイベントでは、その
統合イベントリストが、コンストラクターに渡された値で初期化されます。
isTrusted ビットを
false に設定しますが、統合
イベントリスト内の同じビットは、元の true 値から変更されません。
信頼されたイベントの統合イベントリスト内のイベントは、次のものを持ちます。
timeStamp 値
[DOM] — すべての統合イベントは、
getPredictedEvents メソッドが
呼び出されたディスパッチ済みポインターイベントの timeStamp 以下の
timeStamp を持ちます。
統合イベントリストは
timeStamp
によって時系列順に並べられなければならないため、最初の
イベントが最小の timeStamp を持ちます。
pointerId、pointerType、
および isPrimary。<style>
/* ユーザーエージェント固有の直接操作動作(パンやズームなど)を無効にし、
代わりに canvas 要素上のすべてのイベントがアプリケーションへ渡されるようにする。 */
canvas { touch-action: none; }
</style>
<canvas id="drawSurface" width="500px" height="500px" style="border:1px solid black;"></canvas>
<script>
const canvas = document.getElementById("drawSurface"),
context = canvas.getContext("2d");
canvas.addEventListener("pointermove", (e)=> {
if (e.getCoalescedEvents) {
for (let coalesced_event of e.getCoalescedEvents()) {
paint(coalesced_event); // すべての生の/未統合の点を描画する
}
} else {
paint(e); // 最終的な統合された点を描画する
}
});
function paint(event) {
if (event.buttons>0) {
context.fillRect(event.clientX, event.clientY, 5, 5);
}
}
</script>
ディスパッチされたこれらすべてのイベントの順序は、元のイベントの実際の順序と一致しなければなりません。
たとえば、pointerdown イベントによって
統合された pointermove イベントのディスパッチが発生する場合、ユーザーエージェントはまず、
ある pointerId の
それらすべての統合イベントを持つ 1 つの pointermove
イベントをディスパッチし、その後に pointerdown イベントをディスパッチしなければなりません。
以下は、timeStamp
値が増加する実際のイベントと、
ユーザーエージェントによってディスパッチされる
イベントの例です。
| 実際のイベント | ディスパッチされるイベント |
|---|---|
ポインター(pointerId=2)
の座標変更 |
pointerrawupdate(pointerId=2)、1 つの
統合イベント付き |
ポインター(pointerId=1)
の座標変更 |
pointerrawupdate(pointerId=1)、1 つの
統合イベント付き |
ポインター(pointerId=2)
の座標変更 |
pointerrawupdate(pointerId=2)、1 つの
統合イベント付き |
ポインター(pointerId=2)
の座標変更 |
pointerrawupdate(pointerId=2)、1 つの
統合イベント付き |
ポインター(pointerId=1)
の座標変更 |
pointerrawupdate(pointerId=1)、1 つの
統合イベント付き |
ポインター(pointerId=2)
の座標変更 |
pointerrawupdate(pointerId=2)、1 つの
統合イベント付き |
ポインター(pointerId=1)のボタン
押下 |
pointermove
(pointerId=1)、2 つの
統合イベント付きpointermove
(pointerId=2)、4 つの
統合イベント付きpointerdown
(pointerId=1)、統合イベント
なし |
ポインター(pointerId=2)
の座標変更 |
pointerrawupdate(pointerId=2)、1 つの
統合イベント付き |
ポインター(pointerId=2)
の座標変更 |
pointerrawupdate(pointerId=2)、1 つの
統合イベント付き |
ポインター(pointerId=1)のボタン
解放 |
pointermove
(pointerId=2)、2 つの
統合イベント付きpointerup(pointerId=1)、統合イベント
なし |
一部のユーザーエージェントには、確認済みの一連のポインター移動の後に、
現在のジェスチャーにおける先行イベントと移動の速度/軌道に基づいて、
将来のポインター移動位置がどこになる可能性があるかを予測できる組み込みアルゴリズムがあります。
アプリケーションは getPredictedEvents
メソッドでこの情報を使用し、
知覚される遅延を減らすため、予測位置まで投機的に「先描き」し、
実際の点を受信した時点でこれらの予測点を破棄できます。
pointermove イベントの統合された座標を使用し、ユーザー
エージェントが予測した将来の点(灰色の円)を示しています。PointerEvent には、関連付けられた 予測
イベントリスト(0 個以上の
PointerEvent のリスト)があります。信頼された pointermove イベントでは、ユーザーエージェントが
将来そのイベントに続くと予測する PointerEvent のシーケンスです。
その他すべての信頼されたイベントタイプでは、空のリストです。
信頼されていないイベントでは、その 予測イベントリストが、
コンストラクターに渡された値で初期化されます。
isTrusted ビットを
false に設定しますが、予測
イベントリスト内の同じビットは、元の true 値から変更されません。
リスト内のイベント数と、現在のタイムスタンプからどの程度先までのものかは、 ユーザーエージェントと、それが使用する予測アルゴリズムによって決定されます。
信頼されたイベントの予測イベントリスト内のイベントは、次のものを持ちます。
timeStamp 値
[DOM] — すべての予測イベントは、
getPredictedEvents メソッドが
呼び出されたディスパッチ済みポインターイベントの timeStamp 以上の
timeStamp を持ちます。
予測イベントリストは
timeStamp
によって時系列順に並べられなければならないため、最初の
イベントが最小の 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 が作成されたとき、ユーザーエージェントは、
統合イベントリストおよび 予測イベントリスト内の各イベントについて、次の手順を実行するべきです。
pointerId、
pointerType、
isPrimary および isTrusted を、
「親」ポインターイベントの対応するプロパティと一致するように設定します。
cancelable および bubbles を false に設定します
(これらのイベントが単独で
ディスパッチされることはないため)。PointerEvent 値に初期化します。
信頼された PointerEvent の target が変更されたとき、ユーザーエージェントは
統合イベントリストおよび 予測イベントリスト内の各イベントについて、次のようにするべきです。
現在存在するウェブコンテンツの大多数は、マウスイベントのみを対象としてコードが記述されています。以下では、 このコンテンツとの互換性のために、ユーザー エージェントが汎用的なポインター入力をマウスイベントにマッピングしてもよい方法の アルゴリズムについて説明します。
マウスイベントとの互換性マッピングは、この 仕様の任意の機能です。既存のレガシー コンテンツとの最良の互換性を得るため、ユーザーエージェントはこの機能をサポートすることが推奨されます。
大まかに言えば、互換マウスイベントは、それぞれに対応する ポインターイベントと「交互に挿入」されることを意図しています。ただし、この特定の順序は必須ではなく、 互換マウスイベントを実装するユーザーエージェントは、それらの相対的な順序が一貫している限り、 マウスイベントのディスパッチを遅延またはグループ化することを選択してもかまいません。
特にタッチスクリーン入力の場合、ユーザーエージェントは、ジェスチャー認識のために
追加のヒューリスティクスを適用してもかまいません(作者が を介して明示的に抑制した場合を除く)。
touch-actionpointerdown イベントと pointerup イベントの間の一連のイベントでは、ジェスチャー認識が
ジェスチャーを検出または無視するために pointerup
イベントまで待つ必要がある場合があります。
その結果、ユーザーエージェントがインタラクションが特定のジェスチャーを意図したものではないと判断した場合、
シーケンス全体の互換マウスイベントが、最後の pointerup イベントの後にまとめて
ディスパッチされる場合があります。ユーザーエージェントによるジェスチャー認識のこれらの詳細は
この仕様では定義されておらず、実装によって異なる場合があります。
互換マウスイベントをサポートするかどうかに関係なく、ユーザーエージェントは
click、auxclick、および contextmenu イベントを常にサポートしなければなりません。これらのイベントは PointerEvent 型であり、したがって 互換マウスイベントではないためです。
ポインターイベント中に preventDefault を呼び出しても、
click、auxclick、または contextmenu が発火するかどうかに
影響してはなりません。
これらの高レベルイベントの一部(contextmenu、focus、blur など)とポインター
イベントとの相対的な順序は未定義であり、ユーザーエージェントによって異なります。たとえば、一部のユーザーエージェントでは
contextmenu が pointerup
の後に発生することが多い一方、別のユーザーエージェントでは
pointerup または pointercancel より前に発生することが多く、また状況によっては
対応するポインターイベントがなくても発火する場合があります(たとえば、キーボード
操作の結果として)。
さらに、ユーザーエージェントは、
click、auxclick、または contextmenu イベントを発火するかどうかを判断するために、
独自のヒューリスティクスを適用する場合があります。一部の
ユーザーエージェントは、同じタイプの他の(非プライマリ)ポインター、または異なるタイプの他のプライマリポインターが存在する場合、
これらのイベントを発火しないことを選択する場合があります。ユーザーエージェントは、特定の
操作が「明確な」タップ、クリック、または長押しではなかったと判断し(たとえば、タッチ
スクリーン上で指による操作中、指が画面に接触している間に動きすぎた場合)、
click、auxclick、または
contextmenu イベントを発火しないことを決定する場合があります。ユーザーエージェント動作のこれらの側面は、この
仕様では定義されておらず、実装によって異なる場合があります。
特に記載がない限り、マッピングされたマウスイベントのターゲットは、ターゲットがその
ownerDocument のツリーに参加しなくなっていない限り、対応するポインターイベントと同じ
ターゲットであるべきです。参加しなくなった場合、マウスイベントは、元のターゲットが
ツリーから削除された時点で、その ownerDocument のツリーにまだ参加している最も近い
祖先ノードで発火するべきです。これは、マウスイベント用に
(新しいターゲットノードに基づく)新しいイベントパスが構築されることを意味します。
作者は、pointerdown イベントをキャンセルすることで、特定の互換マウスイベントの
生成を防止できます。
マウスイベントを防止できるのは、ポインターが押下状態にある場合のみです。ホバーしているポインター(たとえばボタンが 押されていないマウス)のマウスイベントを防止することはできません。
mouseover、mouseout、mouseenter、および mouseleave
イベントは、決して防止されません(ポインターが押下状態にある場合でも)。
ポインターイベントの EventListener が
passive
に設定されている場合、互換マウスイベントを防止することはできません
[DOM]。
プライマリポインターのみが互換マウスイベントを生成できますが、複数のプライマリポインターが同時にアクティブになり、それぞれが
独自の互換マウスイベントを生成する場合があります。MouseEvents に依存するスクリプトとの互換性のため、
マウス遷移イベント(mouseover、mouseout、mouseenter、および
mouseleave)は、単一の
従来のマウス入力の動きをシミュレートするべきです。
これは、各イベントターゲットの進入/退出状態が有効であることを意味します。ユーザーエージェントは、
文書内の 従来のマウスポインターの有効位置を次のように維持することで、
これを保証するべきです。
pointerdown、pointerup、または pointermove イベント、あるいは window での pointerleave イベントを発火する直前に、ユーザーエージェントは
次の手順を実行するべきです。
pointerdown、pointerup、または pointermove イベントのターゲットとします。pointerleave イベントの場合、T を未設定にします。
mouseover、mouseout、mouseenter、および
mouseleave イベントをディスパッチします。現在の 従来のマウスポインターの
有効位置または T のいずれかが未設定の場合、それをウィンドウ外のマウス位置と見なします。
従来の
マウスポインターの有効位置は、ポインター遷移イベント
(pointerover、pointerout、
pointerenter
および pointerleave)から対応する従来のマウス遷移イベント
(mouseover、
mouseout、mouseenter、および mouseleave)へ常に直接
マッピングできるわけではないという事実をモデル化します。次の
アニメーションは、単一の従来のマウス入力を使用して 2 つのプライマリポインターを
調整するために、ユーザーエージェントがポインター遷移イベントより多くの従来のマウス遷移イベントを
ディスパッチする必要がある場合を示しています。
このアニメーションでは、マウスクリックとタッチによるタップの間の時間に注目してください。ボタン 1 は
pointerout イベントを受信しません(「実際の」マウスポインターがこの期間中に
ボタンの矩形から離れていないため)が、タッチによるタップで 従来の
マウスポインターの有効位置がボタン 2 に移動すると、ボタン 1 は mouseout イベントを受信します。同様に、タッチによる
タップからマウスがボタン 1 を離れる直前までの期間では、同じ理由によりボタン 1 は
pointerover イベントを受信しませんが、従来のマウスポインターの
有効位置がボタン 1 の内側へ戻ると、ボタン 1 は mouseover イベントを受信します。
ユーザーエージェントがホバーをサポートするデバイスのポインターイベントをディスパッチするときは常に、 次の手順を実行するべきです。
isPrimary プロパティが false
の場合、ポインターイベントをディスパッチしてこれらの手順を終了します。pointerdown、pointerup、または pointermove イベント、あるいは window での pointerleave イベントである場合、従来の
マウスポインターの有効位置の追跡で説明されているように、互換マウス遷移イベントをディスパッチします。pointerdown であり、イベントの キャンセル済みフラグが設定されている場合、この
pointerType に対して PREVENT MOUSE EVENT フラグを設定します。
pointerType に対して PREVENT MOUSE EVENT フラグが
設定されておらず、ディスパッチしたポインターイベントが次の場合:
pointerdown の場合、
mousedown イベントを発火します。
pointermove の場合、
mousemove イベントを発火します。
pointerup の場合、
mouseup イベントを発火します。
pointercancel
の場合、window で mouseup イベントを発火します。pointerup または pointercancel の場合、この
pointerType に対する PREVENT MOUSE EVENT フラグをクリアします。
ほとんどのタッチスクリーンなど、一部のデバイスは、アクティブ状態でない間に座標(または座標の集合)上を ホバーすることをサポートしません。マウスイベントを対象に記述された既存コンテンツの多くは、 マウスがイベントを生成しているものと仮定しており、そのため一般に次のような特性が成り立つと想定しています。
mousemove イベントを生成する可能性が高いです。
そのため、ユーザーエージェントはこれらの種類の入力デバイスについて異なるマッピングを提供する必要があります。 ユーザーエージェントが ホバーをサポートしないデバイスのポインターイベントをディスパッチするときは常に、 次の手順を実行するべきです。
isPrimary プロパティが false
の場合、ポインターイベントをディスパッチしてこれらの手順を終了します。pointerover であり、そのポインターについて
pointerdown イベントがまだディスパッチされていない場合、
mousemove イベントを発火します(従来の
マウス固有コードとの互換性のため)。
pointerdown、pointerup、または pointermove イベント、あるいは window での pointerleave イベントである場合、従来の
マウスポインターの有効位置の追跡で説明されているように、互換マウス遷移イベントをディスパッチします。pointerdown であり、イベントの キャンセル済みフラグが設定されている場合、この
pointerType に対して PREVENT MOUSE EVENT フラグを設定します。
pointerType に対して 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] で示される フォールバック マウスイベントの両方を生成してはなりません。
ホバーをサポートしないプライマリポインター
(たとえばタッチスクリーン上の 1 本の指)による要素のアクティブ化(click)では、通常、
次のイベントシーケンスが生成されます。
mousemovepointeroverpointerentermouseovermouseenterpointerdownmousedownpointermove および
mousemove イベント
pointerupmouseuppointeroutpointerleavemouseoutmouseleaveclickただし、このインタラクション中に pointerdown イベントの キャンセル済みフラグが
設定された場合、イベントのシーケンスは次のようになります。
mousemovepointeroverpointerentermouseovermouseenterpointerdownpointermove イベント
pointeruppointeroutpointerleavemouseoutmouseleaveclickマウスイベントモジュールは、[HTML401] の onclick、
ondblclick、onmousedown、onmouseup、onmouseover、
onmousemove、および onmouseout 属性に由来します。このイベントモジュールは、
マウスやトラックボールなどのポインティング入力デバイスで使用するために特別に設計されています。
DOM Level 2 で導入され、この仕様で変更されています。
MouseEvent インターフェイスは、マウスイベントに関連付けられた固有の
コンテキスト情報を提供します。
要素が入れ子になっている場合、マウスイベントは常に最も深く入れ子になった要素をターゲットとします。
ターゲット要素の祖先は、イベントバブリングを使用して、 その子孫要素内で発生したマウスイベントの通知を取得できます。
MouseEvent インターフェイスのインスタンスを作成するには、
任意の MouseEventInit 辞書を渡して、MouseEvent コンストラクターを使用します。
initMouseEvent を使用して MouseEvent オブジェクトを初期化するとき、
実装はクライアント座標 clientX および clientY を、他の座標
(DOM Level 0 実装で公開されるターゲット座標や、その他の独自属性、
たとえば pageX)の計算に使用できます。
WebIDLdictionary MouseEventInit : EventModifierInit {
long screenX = 0;
long screenY = 0;
long clientX = 0;
long clientY = 0;
short button = 0;
unsigned short buttons = 0;
};
[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;
boolean getModifierState(DOMString keyArg);
};
screenX画面座標系の原点を基準としてイベントが発生した水平方向の座標です。
この属性の 未初期化値は
0 でなければなりません。
screenY画面座標系の原点を基準としてイベントが発生した垂直方向の座標です。
この属性の 未初期化値は
0 でなければなりません。
clientXイベントに関連付けられたビューポートを基準として、イベントが発生した水平方向の座標です。
この属性の 未初期化値は
0 でなければなりません。
clientYイベントに関連付けられたビューポートを基準として、イベントが発生した垂直方向の座標です。
この属性の 未初期化値は
0 でなければなりません。
layerX
積層コンテキストであるか、位置指定されているか、または 積層コンテキストを 描画する際に位置指定フェーズで描画される、最も近い 祖先要素からの水平方向のオフセットです。
この属性の 未初期化値は
0 でなければなりません。
layerY
積層コンテキストであるか、位置指定されているか、または 積層コンテキストを 描画する際に位置指定フェーズで描画される、最も近い 祖先要素からの垂直方向のオフセットです。
この属性の 未初期化値は
0 でなければなりません。
ctrlKeyKeyboardEvent の ctrlKey
属性を参照してください。
この属性の 未初期化値は
false でなければなりません。
shiftKeyKeyboardEvent の shiftKey
属性を参照してください。
この属性の 未初期化値は
false でなければなりません。
altKey
KeyboardEvent の altKey
属性を参照してください。
この属性の 未初期化値は
false でなければなりません。
metaKeyKeyboardEvent の metaKey
属性を参照してください。
この属性の 未初期化値は
false でなければなりません。
button
マウスボタンの押下または解放によって発生したマウスイベントでは、button を使用して、
どのポインターデバイスのボタンの状態が変化したかを示さなければなりません。
button 属性の値は
次のようでなければなりません。
0 は、デバイスのプライマリボタン(一般には
左ボタン、または 1 ボタンデバイスの唯一のボタンで、ユーザーインターフェイスコントロールを
アクティブ化したりテキストを選択したりするために使用されるもの)または未初期化値を示さなければなりません。1 は、補助ボタン(一般には
中央ボタンで、多くの場合マウスホイールと組み合わされるもの)を示さなければなりません。2 は、セカンダリボタン(一般には
右ボタンで、多くの場合コンテキストメニューを表示するために使用されるもの)を示さなければなりません。3 は X1(戻る)ボタンを示さなければなりません。4 は X2(進む)ボタンを示さなければなりません。一部のポインティングデバイスは、さらに多くのボタン状態を提供またはシミュレートし、そのようなボタンを表すために
2 より大きい値または 0 より小さい値を使用してもかまいません。
button の値は、
マウスボタンの押下/解放によって発生したものではないイベントでは
更新されません。このような状況では、値 0 を左ボタンと解釈せず、
デフォルト値として解釈するよう注意してください。
mousedown や mouseup などのイベントに関連する一部の デフォルトアクションは、
使用されている特定のマウスボタンに依存します。
この属性の 未初期化値は
0 でなければなりません。
buttonsあらゆるマウスイベント中、buttons を使用して、
現在どの組み合わせのマウスボタンが押されているかをビットマスクとして示さなければなりません。
buttons 属性はビットフィールドです。
ビットフィールドの値にマスク値 1 を適用して真になる場合、プライマリ
マウスボタンが押されています。ビット
フィールドの値にマスク値 2 を適用して真になる場合、右マウスボタンが押されています。
ビットフィールドの値にマスク値 4 を適用して真になる場合、補助/中央ボタンが押されています。
名前は似ていますが、buttons 属性と button 属性の値は大きく
異なります。button の値は、
mousedown / mouseup イベントハンドラー中に有効であると想定される一方、buttons 属性は、
「現在アクティブなボタンがない」状態(0)を表すことができるため、信頼された任意の MouseEvent オブジェクトについて
(ディスパッチ中の)マウスボタンの状態を反映します。
buttons 属性の値は
次のようでなければなりません。
0 は現在アクティブなボタンがないことを示さなければなりません。1 はデバイスのプライマリボタン(一般には
左ボタン、または 1 ボタンデバイスの唯一のボタンで、ユーザーインターフェイスコントロールを
アクティブ化したりテキストを選択したりするために使用されるもの)を示さなければなりません。2 は、存在する場合、セカンダリボタン(一般には
右ボタンで、多くの場合コンテキストメニューを表示するために使用されるもの)を示さなければなりません。4 は補助ボタン(一般には
中央ボタンで、多くの場合マウスホイールと組み合わされるもの)を示さなければなりません。一部のポインティングデバイスは、さらに多くのボタンを提供またはシミュレートします。そのようなボタンを表すには、
後続するボタンごとに値を 2 倍にしなければなりません(二進系列
8、16、32、...)。
任意のボタン値の集合の合計は一意の数になるため、コンテンツ作者は
ビット演算を使用して、デバイス上の任意の数のマウスボタンについて、
現在いくつのボタンが押されているか、およびどのボタンが押されているかを判定できます。たとえば、
値 3 は左ボタンと右ボタンの両方が現在押されていることを示し、
値 5 は左ボタンと中央ボタンの両方が現在
押されていることを示します。
mousedown や mouseup などのイベントに関連する一部の デフォルトアクションは、
使用されている特定のマウスボタンに依存します。
この属性の 未初期化値は
0 でなければなりません。
relatedTargetイベントの種類に応じて、UI
イベントに関連するセカンダリ EventTarget を識別するために使用されます。
この属性の 未初期化値は
null でなければなりません。
relatedTarget は、
マウスポインターが直前に境界から離れた要素(mouseover または mouseenter イベントの場合)、または
マウスポインターが境界内へ入ろうとしている要素(mouseout、mouseleave、または focusout イベントの場合)に
初期化するべきです。その他のイベントでは、この値を割り当てる必要はありません
(デフォルトで null になります)。
getModifierState(keyArg)キー値を使用して修飾キーの状態を問い合わせます。
それが修飾キーであり、その修飾キーがアクティブ化されている場合は true を返し、
それ以外の場合は false を返します。
DOMString keyArg
KeyboardEvent の getModifierState()
メソッドを参照してください。実装は、マウスイベントを生成するとき、現在のクリック 回数を維持しなければなりません。これは、特定の時間内にポインティングデバイスのボタンが 連続してクリックされた回数を示す非負整数でなければなりません。 カウントがリセットされるまでの遅延は、環境設定に固有です。
この節のアルゴリズムでは、ネイティブプラットフォーム OS が次のものを提供すると仮定します。
これらのイベントについて、OS は次の情報を提供できます。
この節は改訂する必要があります。
一般に、Event インターフェイス、または Event インターフェイスを継承するインターフェイスの
コンストラクターが呼び出された場合、[DOM] で説明されている手順に従うべきです。ただし、MouseEvent インターフェイスは、Event オブジェクトのキー
修飾子の内部状態を初期化するための追加の辞書メンバーを提供します。具体的には、getModifierState()
メソッドを使用して問い合わせる内部状態です。この節では、これらの任意の修飾子
状態を使用して新しい MouseEvent オブジェクトを初期化するための [DOM]
の手順を補足します。
以下のアルゴリズムを使用して MouseEvent、またはこれらのオブジェクトから派生したオブジェクトを
構築する目的では、すべての MouseEvent および派生
オブジェクトは、[UIEvents-Key] の 修飾キー表で説明される キー修飾子名を使用して設定および取得できる
内部キー修飾子状態を持ちます。
次の手順は、[DOM] で定義されるイベント構築アルゴリズムを補足します。
Event が MouseEvent オブジェクトまたはそれから派生する
オブジェクトであり、EventModifierInit
引数がコンストラクターに指定された場合、次のサブ手順を実行します。
EventModifierInit
引数について、辞書メンバーが文字列 "modifier" で始まる場合、キー修飾子名を、接頭辞
"modifier" を除いた辞書メンバーの名前とし、Event オブジェクトの 内部キー
修飾子状態のうち、キー修飾子名と一致するものを、対応する
値に設定します。
この節は改訂する必要があります。
UA は、ユーザーエージェント全体で共有される次の値を維持しなければなりません。
マウス ボタンの現在の状態を追跡する マウスボタンビットマスク。
UA は、Window で共有される次の値を維持しなければなりません。
MouseEvent を最後に送信した Element を追跡する
最後の
マウス要素値(初期値は undefined)。
最新のマウス
イベントが送信された時点での 最後のマウス要素の祖先 Element
のスナップショットを含む
最後の
マウス DOM パス値(初期値は空)。
この節は改訂する必要があります。
MouseEvent には、さまざまな修飾キーの状態を
追跡するために使用される次の内部フラグがあります。
shift フラグ、
control
フラグ、
alt フラグ、
altgraph
フラグ、
および meta フラグ。
これらのフラグは、マウスイベントの時点で対応する修飾キーが押されていた場合に設定されます。
この節は改訂する必要があります。
elementFromPoint()
(pos にある最前面の DOM 要素)を返します
inert または disabled
要素を考慮するため、これは elementsFromPoint()
を呼び出し、無効な要素を除外するべきです。
MouseEvent を初期化するこの節は改訂する必要があります。
event、eventType、eventTarget、bubbles、および cancelable を用いて MouseEvent を初期化するには、次の手順を実行します。
screenX を、デスクトップの原点を
基準としてイベントが発生した位置の x 座標に設定します
screenY を、デスクトップの原点を
基準としてイベントが発生した位置の y 座標に設定します
clientX を、ビューポートの原点を基準として
イベントが発生した位置の x 座標に設定します
clientY を、ビューポートの原点を基準として
イベントが発生した位置の y 座標に設定します
button を 0 に設定します
buttons を マウスボタンビットマスクに設定します
ここにハードコードする代わりに、PointerLock 用のフックを提供するべきです。
この節は改訂する必要があります。
MouseEvent とします
shiftKey を true に設定し、それ以外の場合は false
に設定しますctrlKey を true に設定し、それ以外の場合は false
に設定しますaltKey を true
に設定し、それ以外の場合は
false に設定しますmetaKey を true に設定し、それ以外の場合は false
に設定しますこの節は改訂する必要があります。
MouseEvent タイプを含む
DOMString としますEventTarget とします
MouseEvent を使用して イベントを作成した結果としますこの節は改訂する必要があります。
MouseEvent タイプを含む
DOMString としますEventTarget とします
MouseEvent を使用して イベントを作成した結果としますこの節は改訂する必要があります。
MouseEvent とします
TODO.
type が [
mousedown, mouseup ] のいずれかである場合、
button を、
mbutton を用いて MouseEvent の button
属性を計算した結果に設定します
この節は改訂する必要があります。
その他のボタンは 0x08 から追加できます。
この節は改訂する必要があります。
mousedown と mouseup の間に、その他のマウスイベントが発生する場合があります。
この節は改訂する必要があります。
プラットフォームは、クリックを生成する mouseup について、ネイティブのマウスアップを処理するの直後にこれを呼び出すべきです。
この節は改訂する必要があります。
EventTarget とします
screenX
が整数値でない場合、丸めます。screenY
が整数値でない場合、丸めます。PointerEvents と丸められた座標を使用するブラウザーについての情報は、 pointerevents/100 を参照してください。
あらゆる「デフォルトアクション」は、ディスパッチ中にターゲットの アクティブ化 動作 アルゴリズムをトリガーすることで処理されます。そのため、ここで処理する必要はありません。 ただし、既存の仕様が disabled/css-pointer-events/inert/... を処理していることを確認する必要があります。
HTMLelement.click() を処理するには、native =
null、target = HTMLelement としてこのアルゴリズムを呼び出します。
キーボードによって開始されたクリックを処理するには、native = null、 target = 現在フォーカスされている要素としてこのアルゴリズムを呼び出します。
この節は改訂する必要があります。
ダブルクリックを生成するマウスクリックについて、ネイティブのマウスクリックを処理した直後に これを呼び出すべきです。
screenX が整数値でない場合、
丸めます。screenY が整数値でない場合、
丸めます。この節は改訂する必要があります。
このアルゴリズムは、PointerEvents のディスパッチについて、現在明示的に 規定されていないため、いくつかの仮定を置いています。pointerevents/285 が 解決された後、これを更新する必要がある場合があります。
TODO: native から mouseout の属性を設定する。+CSSOM 属性。
キャンセルされた場合の動作を確認する(影響はないように見える)。
element が削除されている場合を処理する。 また、移動されている場合も処理する。DOM の変更によって mouseleave イベントが発火するべきだったか?今送信するべきか?破棄するべきか? 現在のブラウザーが何を行うか確認する必要がある。
Event.composed
= false に設定します
互換性を確認: event.composed の値。仕様では false。Chrome/Linux = true。Firefox/Linux = false。
TODO: native から mouseout の属性を設定する。+CSSOM 属性。
キャンセルされた場合の動作を確認する必要がある(影響はないように見える)。
element が削除または移動されている場合を処理する。
Event.composed
= false に設定します
互換性を確認: event.composed の値。仕様では false。 Chrome/Linux = true。 Firefox/Linux = false。
Shadow DOM 要素の互換性を確認する。Chrome/Linux は、この イベントを要素と shadow root で発火する。
この仕様で定義されている特定のマウスイベントは、互いに対して定められた順序で発生しなければなりません。 次に、ポインティングデバイスのカーソルが要素上へ移動したときに発生しなければならない イベントシーケンスを示します。
| # | イベントタイプ | 要素 | 注記 |
|---|---|---|---|
| 1 | mousemove |
||
| ポインティングデバイスが要素 A 内へ移動する... | |||
| 2 | mouseover |
A | |
| 3 | mouseenter |
A | |
| 4 | mousemove |
A | 複数の mousemove イベント |
| ポインティングデバイスが要素 A の外へ移動する... | |||
| 5 | mouseout |
A | |
| 6 | mouseleave |
A |
ポインティングデバイスが要素 A 内へ移動し、次に入れ子になった要素 B 内へ移動してから再び外へ戻る場合、次のイベントシーケンスが発生しなければなりません。
| イベントタイプ | 要素 | 注記 | |
|---|---|---|---|
| 1 | mousemove |
||
| ポインティングデバイスが要素 A 内へ移動する... | |||
| 2 | mouseover |
A | |
| 3 | mouseenter |
A | |
| 4 | mousemove |
A | 複数の mousemove イベント |
| ポインティングデバイスが入れ子になった要素 B 内へ移動する... | |||
| 5 | mouseout |
A | |
| 6 | mouseover |
B | |
| 7 | mouseenter |
B | |
| 8 | mousemove |
B | 複数の mousemove イベント |
| ポインティングデバイスが要素 B から A 内へ移動する... | |||
| 9 | mouseout |
B | |
| 10 | mouseleave |
B | |
| 11 | mouseover |
A | |
| 12 | mousemove |
A | 複数の mousemove イベント |
| ポインティングデバイスが要素 A の外へ移動する... | |||
| 13 | mouseout |
A | |
| 14 | mouseleave |
A |
CSS を使用すると、要素が視覚的に重なり合う場合があります。次の例では、A、B、C とラベル付けされた 3 つの要素が、 ウェブページ上でいずれも同じ寸法と絶対位置を持っています。DOM では、要素 C は B の子であり、B は A の子です。
ポインティングデバイスが要素の積み重なりの外側から C とラベル付けされた要素へ移動し、その後再び 外へ移動した場合、次の一連のイベントが発生しなければなりません。
| イベントタイプ | 要素 | 注記 | |
|---|---|---|---|
| 1 | mousemove
|
||
| ポインティングデバイスが、積み重なりの最上部にある要素 C 内へ移動する | |||
| 2 | mouseover
|
C | |
| 3 | mouseenter
|
A | |
| 4 | mouseenter
|
B | |
| 5 | mouseenter
|
C | |
| 6 | mousemove
|
C | 複数の mousemove イベント
|
| ポインティングデバイスが要素 C の外へ移動する... | |||
| 7 | mouseout
|
C | |
| 8 | mouseleave
|
C | |
| 9 | mouseleave
|
B | |
| 10 | mouseleave
|
A |
mouseover/mouseout イベントは 1 回だけ発火しますが、mouseenter/mouseleave イベントは 3 回
(各要素に 1 回ずつ)発火します。
次は、ポインティングデバイスに関連付けられたボタン(たとえば、 マウスボタンやトラックパッド)が要素上で押されて解放された場合の典型的なイベントシーケンスです。
| イベントタイプ | 注記 | |
|---|---|---|
| 1 | mousedown
|
|
| 2 | mousemove
|
任意、複数のイベント、一定の制限あり |
| 3 | mouseup
|
|
| 4 | click
|
|
| 5 | mousemove
|
任意、複数のイベント、一定の制限あり |
| 6 | mousedown
|
|
| 7 | mousemove
|
任意、複数のイベント、一定の制限あり |
| 8 | mouseup
|
|
| 9 | click
|
|
| 10 | dblclick
|
click または dblclick
イベントを引き続き発火しながら、mousedown と mouseup イベントの間に許容される遅延時間、程度、距離、および
mousemove イベント数は、
実装、デバイス、およびプラットフォームに固有です。この許容範囲は、
手が不安定であるなどの身体障害があるユーザーがポインティングデバイスを操作する際の助けになります。
各実装は適切な ヒステリシス
許容範囲を決定しますが、一般には、関連する mousedown
および
mouseup イベントのイベントターゲットが同じ要素であり、間に mouseout または
mouseleave イベントがない場合、click および dblclick
イベントを発火するべきです。
また、関連する mousedown と mouseup
のイベントターゲットが異なる場合は、
最も近い共通の包含祖先で click および
dblclick イベントを発火するべきです。
mousedown イベントのターゲットが HTML 文書の body
要素であり、対応する mouseup イベントのターゲットが
文書要素である場合、
click イベントは
最も近い共通の包含祖先である 文書
要素へディスパッチされます。
マウスイベントシーケンス中に ターゲット (たとえばターゲット要素)が DOM から削除された場合、 シーケンスの残りのイベントはその要素で発火してはなりません。
mousedown イベントの結果としてターゲット要素が DOM から削除された場合、
その要素について mouseup、click、または dblclick のイベントも、
デフォルトのアクティブ化イベントもディスパッチされません。ただし、mouseup イベントは、
最初のターゲット要素が削除された後にマウスに対して公開される要素上で引き続き
ディスパッチされます。同様に、mouseup イベントの
ディスパッチ中にターゲット要素が DOM から削除された場合、
click および後続のイベントはディスパッチされません。
マウスイベントの種類を以下に示します。要素が入れ子になっている場合、 マウスイベントの種類は常に最も深く入れ子になった要素をターゲットとします。 ターゲット要素の祖先は、バブリングを使用して、その子孫要素内で発生する マウスイベントの通知を取得してもかまいません。
| タイプ | auxclick
|
|---|---|
| インターフェイス | PointerEvent
|
| バブリング | はい |
| キャンセル可能 | はい |
| 合成 | はい |
| コンテキスト (信頼されたイベント) |
ユーザーが非プライマリポインターボタンを押して
解放したとき、またはそのような操作をシミュレートする方法で
ポインターをアクティブ化したとき、auxclick イベントタイプは、ポインターによって示された 最上位の
イベントターゲットでディスパッチされなければなりません。マウスボタンの作動
方法はポインターデバイスおよび
環境設定に依存します。たとえば、画面上の
位置や、ポインティング
デバイスのボタンを押してから解放するまでの遅延に依存してもかまいません。
auxclick イベントは、非プライマリポインター
ボタンに対してのみ発火するべきです(すなわち、button 値が 0 ではなく、
buttons 値が
1 より大きい場合)。プライマリボタン
(標準的なマウスの左ボタンなど)は、
auxclick イベントを発火してはなりません。プライマリボタンに
関連付けられた対応するイベントについては、click を参照してください。
auxclick イベントの前に、同じ要素上で mousedown および
mouseup イベントが発生してもかまいません。その他の
ノードタイプ(たとえばテキストノード)間の変更は無視します。環境
設定によっては、ポインティングデバイスのボタンを押してから
解放するまでの間に、mouseover、
mousemove、および mouseout のイベントタイプのうち 1 つ以上が発生した場合でも、
auxclick イベントが
ディスパッチされてもかまいません。
auxclick イベントタイプの デフォルトアクションは、
イベントの ターゲットおよび
button または buttons 属性の値に応じて異なります。
auxclick イベントタイプの典型的な
デフォルトアクションは次のとおりです。
myLink.addEventListener("auxclick", function(e) {
if (e.button === 1) {
// たとえばリンクを中央クリックしたときに新しいタブを開くという
// デフォルト動作を、これによって防止できる。
e.preventDefault();
// リンクまたはリンクではないボタンを新しいタブで開く処理など、
// アプリに適した方法で中央ボタンのクリックを処理するための
// 別の処理を行う。タブストリップでタブを閉じるなど、クリック操作時に
// 行うべきその他の操作もここで実行できる。
}
});
右ボタンの場合、auxclick イベントは、
あらゆる contextmenu イベントの後に
ディスパッチされます。一部のユーザー
エージェントは、コンテキストメニューが表示されている間、すべての入力
イベントを破棄するため、そのようなシナリオでは auxclick をアプリケーションで
利用できない場合があることに注意してください。
詳細については、例 10を参照してください。
myDiv.addEventListener("contextmenu", function(e) {
// この呼び出しによってコンテキストメニューが表示されず、
// ページによるイベント受信を妨げないようにする。
e.preventDefault();
});
myDiv.addEventListener("auxclick", function(e) {
if (e.button === 2) {
// アプリ内でカスタムコンテキストメニューを開くなど、
// 右ボタンクリックを処理するための別の処理を行う。
}
});
| タイプ | click
|
|---|---|
| インターフェイス | PointerEvent
|
| バブリング | はい |
| キャンセル可能 | はい |
| 合成 | はい |
| コンテキスト (信頼されたイベント) |
ユーザーがプライマリポインターボタンを押して
解放したとき、またはそのような操作をシミュレートする方法で
ポインターをアクティブ化したとき、click イベントタイプは、ポインターによって示された 最上位の
イベントターゲットでディスパッチされなければなりません。マウスボタンの作動
方法はポインターデバイスおよび
環境設定に依存します。たとえば、画面上の
位置や、ポインティング
デバイスのボタンを押してから解放するまでの遅延に依存してもかまいません。
click イベントは、プライマリポインター
ボタンに対してのみ発火するべきです(すなわち、button 値が 0、
buttons 値が 1 の場合)。
セカンダリボタン
(標準的なマウスの中央ボタンや右ボタンなど)は、
click イベントを発火してはなりません。非プライマリボタンに
関連付けられた対応するイベントについては、auxclick を参照してください。
click イベントの前に、同じ要素上で mousedown および
mouseup イベントが発生してもかまいません。その他の
ノードタイプ(たとえばテキストノード)間の変更は無視します。環境
設定によっては、ポインティングデバイスのボタンを押してから
解放するまでの間に、mouseover、
mousemove、および mouseout のイベントタイプのうち 1 つ以上が発生した場合でも、
click イベントが
ディスパッチされてもかまいません。また、click イベントの後に
dblclick イベントが続いてもかまいません。
ユーザーが、大きな
line-height が指定された <p> 要素の子であるテキストノード上でマウスボタンを押し、
マウスをわずかに移動して、テキストを含む領域上から外れたものの、
その <p> 要素の包含
ブロック内には留まり(すなわち、ポインターは
同じテキストブロックの行間にあるが、テキストノード自体の
上にはない)、その後マウスボタンを離した場合、通常の時間的な
ヒステリシスの範囲内であれば、click に対して
click イベントが引き続き発生する可能性が高いです。これは、
ユーザーが同じ要素の範囲内に
留まっているためです。ユーザーエージェントによって生成される
マウスイベントはテキストノード上ではディスパッチされないことに注意してください。
ポインターデバイスに関連付けられることに加えて、
click イベントタイプは、要素の
アクティブ化の一部としてディスパッチされなければなりません。
アクセシビリティを最大限に高めるため、コンテンツ作者には、
カスタム
コントロールのアクティブ化動作を定義する際、よりデバイス固有である
mousedown や mouseup などの他のポインティングデバイスイベントタイプではなく、
click イベントタイプを使用することが推奨されます。
click イベントタイプはポインター
デバイス(たとえばマウス)に由来しますが、その後の実装上の拡張により
この関連付けを超えて拡張されており、要素のアクティブ化のための
デバイス非依存のイベントタイプと見なすことができます。
click イベントタイプの デフォルトアクションは、
イベントの ターゲットおよび
button または buttons 属性の値に応じて異なります。
click イベントタイプの典型的な
デフォルトアクションは次のとおりです。
| タイプ | dblclick |
|---|---|
| インターフェイス | MouseEvent |
| バブリング | はい |
| キャンセル可能 | はい |
| 合成 | はい |
| コンテキスト (信頼されたイベント) |
ユーザーエージェントは、
ポインティングデバイスのプライマリボタンが要素上で 2 回クリックされたとき、
このイベントをディスパッチしなければなりません。ダブルクリックの
定義は環境
設定に依存します。ただし、mousedown、mouseup、および dblclick の間で、イベントターゲットは同じでなければなりません。クリックと
ダブルクリックが同時に発生した場合、このイベント
タイプはイベントタイプ click の後にディスパッチされなければならず、
それ以外の場合はイベントタイプ
mouseup の後にディスパッチされなければなりません。
click イベントと同様に、dblclick イベントは、
プライマリポインターボタンに対してのみ発火するべきです。セカンダリボタンは
dblclick イベントを発火してはなりません。
click イベントタイプと同様に、dblclick イベントタイプの デフォルトアクションは、
イベントの ターゲットおよび
button
または buttons 属性の値に応じて異なります。
dblclick イベントタイプの典型的な
デフォルトアクションは、
click イベントタイプのものと同じです。
| タイプ | mousedown
|
|---|---|
| インターフェイス | MouseEvent |
| バブリング | はい |
| キャンセル可能 | はい |
| 合成 | はい |
| コンテキスト (信頼されたイベント) |
ユーザーエージェントは、 ポインティングデバイスの ボタンが要素上で押されたとき、このイベントをディスパッチしなければなりません。
多くの実装は、mousedown イベントを使用して、
コンテキストに依存するさまざまな デフォルトアクションを開始します。これらの
デフォルトアクションは、このイベントをキャンセルすると防止できます。そのような
デフォルトアクションには、画像またはリンクとのドラッグ&ドロップ
インタラクションの開始、テキスト選択の開始などが含まれる場合があります。
さらに、一部の実装では、mousedown イベントが
ディスパッチされた時点で中央マウスボタンが押されている場合にアクティブ化される、マウスによるパン
機能を提供します。
| タイプ | mouseenter
|
|---|---|
| インターフェイス | MouseEvent |
| バブリング | いいえ |
| キャンセル可能 | いいえ |
| 合成 | いいえ |
| コンテキスト (信頼されたイベント) |
|
ユーザーエージェントは、
ポインティングデバイスが要素またはその子孫
要素の境界上へ移動したとき、このイベントをディスパッチしなければなりません。また、ユーザーエージェントは、
要素またはその子孫のいずれかがプライマリ
ポインティングデバイスの下へ移動したときにも、このイベントをディスパッチしなければなりません。
このイベントタイプは mouseover と似ていますが、
バブリングしない点、およびポインターデバイスが要素からその子孫要素の
1 つの境界上へ移動したときにディスパッチされてはならない点が
異なります。
このイベントタイプと CSS の
:hover 疑似クラス [CSS2]
には類似点があります。
mouseleave イベントタイプも参照してください。
| タイプ | mouseleave
|
|---|---|
| インターフェイス | MouseEvent |
| バブリング | いいえ |
| キャンセル可能 | いいえ |
| 合成 | いいえ |
| コンテキスト (信頼されたイベント) |
|
ユーザーエージェントは、
ポインティングデバイスが要素およびそのすべての
子孫要素の境界から外へ移動したとき、このイベントをディスパッチしなければなりません。また、ユーザー
エージェントは、要素またはその子孫のいずれかが
プライマリポインティングデバイスの下から外れるように移動したときにも、このイベントを
ディスパッチしなければなりません。このイベントタイプは mouseout
と似ていますが、
バブリングしない点、およびポインティングデバイスが
要素の境界とそのすべての子の境界から離れるまでディスパッチされてはならない点が異なります。
このイベントタイプと CSS の
:hover 疑似クラス [CSS2]
には類似点があります。
mouseenter イベントタイプも参照してください。
| タイプ | mousemove
|
|---|---|
| インターフェイス | MouseEvent |
| バブリング | はい |
| キャンセル可能 | はい |
| 合成 | はい |
| コンテキスト (信頼されたイベント) |
ユーザーエージェントは、
ポインティングデバイスが要素上にある間に
移動したとき、このイベントをディスパッチしなければなりません。ポインティングデバイスの移動中のイベントの
発生頻度は実装、デバイス、および
プラットフォームに固有ですが、ポインターデバイスが継続的に移動している場合、マウス移動の各発生ごとに
単一のイベントを発火するのではなく、複数の連続した mousemove イベントを
発火するべきです。実装には、
応答性とパフォーマンスのバランスを取るための最適な発生頻度を決定することが
推奨されます。
ブラウザーなど一部の実装環境では、
ユーザーがドラッグ操作を開始し
(たとえばマウスボタンが押されている)、ポインティング
デバイスがユーザーエージェントの境界外へ移動した場合でも、mousemove
イベントが発火し続けることがあります。
このイベントは以前、DOM Level 2 Events ではキャンセル不可能と規定されていましたが、ユーザーエージェント間の 既存の相互運用性を反映するために変更されました。
| タイプ | mouseout
|
|---|---|
| インターフェイス | MouseEvent |
| バブリング | はい |
| キャンセル可能 | はい |
| 合成 | はい |
| コンテキスト (信頼されたイベント) |
|
ユーザーエージェントは、
ポインティングデバイスが要素の境界から外へ移動したとき、または要素が
プライマリポインティングデバイスの下から外れるように移動したとき、
このイベントをディスパッチしなければなりません。
このイベントタイプは mouseleave と似ていますが、
バブリングする点、およびポインターデバイスが
要素からその子孫要素の 1 つの境界上へ移動したときにディスパッチされなければならない点が異なります。
mouseover イベントタイプも参照してください。
| タイプ | mouseover
|
|---|---|
| インターフェイス | MouseEvent |
| バブリング | はい |
| キャンセル可能 | はい |
| 合成 | はい |
| コンテキスト (信頼されたイベント) |
|
ユーザーエージェントは、
ポインティングデバイスが要素の境界上へ移動したとき、または要素が
プライマリポインティングデバイスの下へ移動したとき、
このイベントをディスパッチしなければなりません。
このイベントタイプは mouseenter と似ていますが、
バブリングする点、および祖先要素が同じ イベントリスナーインスタンスの ターゲットである要素の
境界上へポインターデバイスが移動したときにディスパッチされなければならない点が異なります。
mouseout イベントタイプも参照してください。
| タイプ | mouseup
|
|---|---|
| インターフェイス | MouseEvent |
| バブリング | はい |
| キャンセル可能 | はい |
| 合成 | はい |
| コンテキスト (信頼されたイベント) |
ユーザーエージェントは、 ポインティングデバイスの ボタンが要素上で解放されたとき、このイベントをディスパッチしなければなりません。
ブラウザーなど一部の実装環境では、たとえばユーザーが
マウスボタンを押したままドラッグ操作を開始した場合、ポインティングデバイスが
ユーザーエージェントの境界外へ移動していても、mouseup
イベントがディスパッチされることがあります。
ホイールは、1 つ以上の空間次元で回転でき、ポインターデバイスに関連付けることができるデバイスです。 座標系は環境設定によって異なります。
ユーザーの環境は、垂直スクロールを y 軸方向の回転、 水平スクロールを x 軸方向の回転、 ズームを z 軸方向の回転に関連付けるよう設定されている場合があります。
WheelEvent
オブジェクトの deltaX、deltaY、および deltaZ 属性は、
それぞれの軸に沿った測定値をピクセル、行、または
ページ単位で示します。報告される測定値は、環境固有の
アルゴリズムによってホイールデバイスの実際の回転/移動が
適切な値と単位へ変換された後に提供されます。
ユーザーの環境設定は、ホイールデバイスの実際の回転/移動を
異なる方法で解釈するようカスタマイズできます。
一般的なノッチ付き
マウスホイールを 1 回動かすと、162 ピクセルの測定値が生成される場合があります
(162 は単なる例示値であり、実際の値はユーザーエージェントの現在の画面
寸法に依存する場合があります)。
しかし、ユーザーはデフォルトの環境設定を変更してマウスホイールを高速化し、
この数値を増加させることができます。
さらに、一部のマウスホイールソフトウェアは加速(ホイールをより速く
回転/移動するほど、各測定の デルタが大きくなる)や、サブピクセルの 回転
測定さえサポートする場合があります。
このため、作者は、あるユーザーエージェントでの特定の 回転量が、
すべてのユーザーエージェントで同じ デルタ値を生成すると仮定することはできません。
deltaX、deltaY、および deltaZ 属性の値の符号(正または負)は、
実際のホイールデバイスが同じ方向へ回転/移動している間、
wheel イベントを複数回ディスパッチしても
一貫していなければなりません。
ユーザーエージェントが wheel イベントのデフォルトアクションとして
スクロールする場合、デルタの符号は、
正の X、Y、および Z 軸がそれぞれ文書の右端、下端、および最も遠い
奥行き(ユーザーから離れる方向)へ向かう右手座標系によって与えられるべきです。
個々のユーザーエージェントは(その環境およびハードウェア設定に応じて)、 ホイール上での同じ物理的なユーザー操作を異なる方法で解釈できます。 たとえば、トラックパッドの端を上から下へ垂直にスワイプする操作は、 ページを下へスクロールする、またはページを上へパンすることを意図した ホイール操作として解釈される場合があります(すなわち、それぞれ正または負の deltaY 値になります)。
ユーザーエージェントは、最初の ホイールイベントが発火されたときに ホイールイベントトランザクションを作成しなければならず、これにより実装固有の一定 時間内の後続するすべてのホイールイベントを同じ要素をターゲットにできます。ホイールイベントトランザクションとは、単一の ユーザージェスチャーに関連付けられた一連のホイールイベントです。 ホイールイベントトランザクションには、そのグループの最初のホイールイベントが 発生した時点の 最上位のイベントターゲットであるイベントターゲットが関連付けられていなければなりません。
スクロール可能な要素をターゲットとする一連のホイールイベントが子要素の上方で始まった場合、 同じユーザージェスチャーに対する後続のイベントは、その子要素上で発生する場合があります。
WheelEvent インターフェイスは、wheel イベントに関連付けられた固有の
コンテキスト情報を提供します。
WheelEvent インターフェイスのインスタンスを作成するには、
任意の WheelEventInit 辞書を渡して、WheelEvent コンストラクターを使用します。
WebIDLdictionary WheelEventInit : MouseEventInit {
double deltaX = 0.0;
double deltaY = 0.0;
double deltaZ = 0.0;
unsigned long deltaMode = 0;
boolean momentum = false;
};
[Exposed=Window]
interface WheelEvent : MouseEvent {
constructor(DOMString type, optional WheelEventInit eventInitDict = {});
// DeltaModeCode
const unsigned long DOM_DELTA_PIXEL = 0x00;
const unsigned long DOM_DELTA_LINE = 0x01;
const unsigned long DOM_DELTA_PAGE = 0x02;
readonly attribute double deltaX;
readonly attribute double deltaY;
readonly attribute double deltaZ;
readonly attribute unsigned long deltaMode;
readonly attribute boolean momentum;
};
DOM_DELTA_PIXELDOM_DELTA_LINEDOM_DELTA_PAGEdeltaX
wheel
イベントのデフォルトアクションがスクロールであるユーザーエージェントでは、イベントが
キャンセルされなかった場合にスクロールする x 軸方向の
測定値(ピクセル、行、またはページ単位)でなければなりません。
それ以外の場合、これはホイールデバイスの x 軸周りの移動に対する
実装固有の測定値(ピクセル、行、またはページ単位)
です。
この属性の 未初期化値は
0.0 でなければなりません。
deltaY
wheel
イベントのデフォルトアクションがスクロールであるユーザーエージェントでは、イベントが
キャンセルされなかった場合にスクロールする y 軸方向の
測定値(ピクセル、行、またはページ単位)でなければなりません。
それ以外の場合、これはホイールデバイスの y 軸周りの移動に対する
実装固有の測定値(ピクセル、行、またはページ単位)
です。
この属性の 未初期化値は
0.0 でなければなりません。
deltaZ
wheel
イベントのデフォルトアクションがスクロールであるユーザーエージェントでは、イベントが
キャンセルされなかった場合にスクロールする z 軸方向の
測定値(ピクセル、行、またはページ単位)でなければなりません。
それ以外の場合、これはホイールデバイスの z 軸周りの移動に対する
実装固有の測定値(ピクセル、行、またはページ単位)
です。
この属性の 未初期化値は
0.0 でなければなりません。
deltaZ 属性を WheelEvent
オブジェクト上で初期化します。この属性(および
deltaX および deltaY 属性)の相対的な正の値は、
X、Y、および Z 軸がそれぞれ文書の右端、下端、
および最も遠い奥行き(ユーザーから離れる方向)へ向かう
右手座標系によって与えられます。
負の相対値は、それぞれ反対方向を表します。
deltaModedeltaMode 属性は、
デルタ値の測定単位を示します。
デフォルト値は DOM_DELTA_PIXEL(ピクセル)です。
この属性は、デルタ値の測定単位を示すため、 DOM_DELTA 定数のいずれかに設定されなければなりません。 正確な測定値は、デバイス、オペレーティングシステム、 およびアプリケーションの設定に固有です。
この属性の 未初期化値は
0 でなければなりません。
momentumユーザーが物理的なスクロール操作を終了した後
(たとえばフリング後にトラックパッドから指を離した後)にスクロール慣性を
シミュレートするため、プラットフォームによってこのイベントが合成された場合、
この属性は true でなければならず、それ以外の場合は
false でなければなりません。
この属性の 未初期化値は
false でなければなりません。
| タイプ | wheel |
|---|---|
| インターフェイス | WheelEvent |
| バブリング | はい |
| キャンセル可能 | 場合による |
| 合成 | はい |
| コンテキスト (信頼されたイベント) |
|
ユーザーエージェントは、
マウスホイールがいずれかの軸を中心に
回転した場合、または同等の入力デバイス
(マウスボール、特定のタブレットやタッチパッドなど)が
そのような操作をエミュレートした場合、このイベントをディスパッチしなければなりません。
プラットフォームおよび入力デバイスによっては、斜め方向のホイール デルタは、非ゼロの軸を複数持つ単一の
wheel イベントとして、または各非ゼロ軸について個別の
wheel イベントとして配信されてもかまいません。
wheel イベントタイプの典型的な デフォルト
アクションは、
示された量だけ文書をスクロール(または場合によってはズーム)することです。
このイベントがキャンセルされた場合、実装は文書をスクロールまたはズームしてはなりません(または、このイベント
タイプに関連付けられたその他の実装固有のデフォルトアクションを
実行してはなりません)。
一部の ユーザーエージェント、または 一部の入力デバイスでは、ホイールを回した 速度が デルタ値に影響し、 より速い速度ではより大きい デルタ値が生成される場合があります。
ホイールイベントで preventDefault を呼び出すと、
スクロールを防止または中断できます。スクロール性能を最大限に高めるため、
ユーザーエージェントは、スクロールに関連付けられた各ホイールイベントが
キャンセルされるかどうかを確認するため、その処理を待たない場合があります。そのような場合、ユーザー
エージェントは cancelable プロパティが false の
wheel イベントを生成するべきであり、これは
preventDefault を使用してスクロールを防止または中断
できないことを示します。それ以外の場合、cancelable は true になります。
特に、ユーザーエージェントは、イベントについて
非 passive リスナーが
存在しないことを監視した場合、キャンセル不可能な
wheel イベントのみを生成するべきです。
この節は非規範的です。
以下は、この仕様の一部の API を作者がどのように使用できるかを示す基本的な例です。 さらに具体的な例は、この文書の関連する節で提供されています。
/* Pointer Events または従来のタッチ/マウスのいずれかにバインドする */
if (window.PointerEvent) {
// Pointer Events がサポートされている場合、ポインターイベントのみを監視する
target.addEventListener("pointerdown", function(e) {
// 必要に応じて、e.pointerType に基づいて個別のロジックを適用し
// タッチ/ペン/マウスごとに異なる動作を行う
...
});
...
} else {
// 従来のタッチ/マウスイベントハンドラー
target.addEventListener('touchstart', function(e) {
// 互換マウスイベントと click を防止する
e.preventDefault();
...
});
...
target.addEventListener('mousedown', ...);
...
}
// キーボード処理用の追加イベントリスナー
...
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);
<div style="position:absolute; top:0px; left:0px; width:100px;height:100px;"></div>
<script>
window.addEventListener("pointerdown", assignPenColor);
window.addEventListener("pointermove", assignPenColor);
const colorMap = new Map();
function assignPenColor(event) {
const uniqueId = event.persistentDeviceId;
// 一意の ID が存在するか確認する。
if (uniqueId == 0) {
return;
}
// デバイスに色が割り当てられているか確認する。
if (map.has(uniqueId)) {
return;
}
// デバイスに色を割り当てる。
let newColor = getNewColor();
map.set(uniqueId, newColor);
return newColor;
}
function getNewColor() {
/* 何らかの色の値を返す */
}
</script>
この付録では、Pointer Events 実装におけるセキュリティとプライバシーに関する考慮事項について説明します。 議論は、この仕様で定義されたイベント モデル、API、およびイベントの実装から直接生じるセキュリティとプライバシーの問題に限定されます。
この仕様で定義されるイベントタイプの多くは、ユーザー操作に応答してディスパッチされます。これにより、 悪意のあるイベントリスナーが、ユーザーが通常機密と考える情報、たとえば、 ページを操作している間のユーザーのマウス/スタイラス/指の正確な経路/動きにアクセスできるようになります。
ポインターイベントには、(ユーザーのデバイスがサポートしている場合)ペン入力を保持している角度や 傾き、接触面の形状、スタイラスまたはタッチ スクリーンに加えられた圧力などの追加情報が含まれます。角度、傾き、形状、および圧力に関する情報は、 ユーザーのデバイス上のセンサーに直接関係するため、この仕様はオリジンがこれらのセンサーへアクセスすることを可能にします。
このセンサーデータ、および使用された入力機構(マウス、タッチ、ペン)の種類を判定する能力は、 ユーザー、またはユーザーのデバイスや環境の特性を推測するために使用される場合があります。こうして推測された 特性やデバイス/環境情報自体が機微な情報である場合があります。たとえば、 悪意のあるサイトがユーザーが支援技術を使用しているかどうかをさらに推測できる可能性があります。この情報はまた、 ユーザープロファイルを構築したり、特定のユーザーを「フィンガープリント」して追跡しようとしたりする 目的に使用される可能性があります。
緩和策として、ユーザーエージェントは、ユーザーが特定の センサーデータ(角度、傾き、圧力など)へのアクセスを無効にできる機能、および/または ユーザーが明示的にオプトインした後にのみ利用可能にする機能を含めることを検討できます。
この仕様は、作者が「予測イベント」にアクセスできる方法を定義します。この仕様自体は、 ユーザーエージェントが予測に使用するべきアルゴリズムを定義しません。仕様の 作者は、アルゴリズムがユーザーが現在実行しているジェスチャーに関連する先行ポインターイベントのみに 依存することを想定しています。ユーザーエージェントには、その具体的な予測アルゴリズムの実装が、 異なるサイトにわたるユーザーの完全な操作履歴などの追加データに依存せず、 ユーザーに関する機微な情報を明らかにしたり、ユーザーを「フィンガープリント」して 追跡したりするために使用されないようにする責任があります。
これらの考慮事項に加えて、ワーキンググループは、この仕様について次のように考えています。
この節は非規範的です。
buttons プロパティがゼロ以外の値を持つ状態です。マウスの場合、これは
デバイス上で少なくとも 1 つのボタンが押されている状態です。タッチの場合、デジタイザーと物理的に接触
している状態です。ペンの場合、ペンがデジタイザーと物理的に接触しているか、
ホバー中に少なくとも 1 つのボタンが押されている状態です。pointerId で識別)が
文書内で追加のイベントを生成する可能性がある場合、そのポインターは引き続きアクティブと見なされます。例:
WheelEvent インターフェイスをサポートする入力デバイス
(マウスホイールやタッチパッドなど)の物理的な移動に応答して、ユーザーエージェントが
ページをスクロールまたはズームする推定量(ピクセル、行、またはページ単位)です。デルタの値(たとえば deltaX、deltaY、または deltaZ 属性)は、現在の
deltaMode プロパティのコンテキストで解釈されます。
ホイール(またはその他のデバイス)の物理的な移動と、デルタが正か負かの関係は、
環境とデバイスに依存します。ただし、ユーザーエージェントが デフォルトアクションとしてスクロールする場合、デルタの符号は、
正の X、Y、および Z 軸が、それぞれ 文書の右端、下端、
および最も遠い奥行き(ユーザーから離れる方向)へ向かう右手座標系によって
与えられます。
測定可能なプロパティは、実数または
大きな定義域の整数を使用して表現される、連続的なポインターセンサーデータに関する値を表します。
ポインターイベントでは、width、height、pressure、
tangentialPressure、tiltX、tiltY、twist、
altitudeAngle、azimuthAngle、およびマウスイベントモデルのプロパティ
screenX、screenY、clientX、clientY は
測定可能なプロパティです。
これに対して、pointerId、pointerType、
isPrimary、および
マウスイベントモデルのプロパティ button、buttons、ctrlKey、
shiftKey、altKey、および metaKey は測定可能な
プロパティとは見なされません。
これらはセンサーデータに関係しないためです。
WheelEvent インターフェイスを使用する入力デバイス上の増分変化を示します。一部のデバイスでは
これは文字どおりホイールの回転であってもかまいませんが、他のデバイスでは、
平面上の移動、または特定のボタンへの圧力であってもかまいません。ヒットテスト機能を使用して ターゲットを決定します。ヒットテストおよび積層順序に関する具体的な詳細については、ホスト言語を参照してください。
この節は規範的です。 以下の機能は廃止されており、レガシーソフトウェアとの互換性を必要とする ユーザーエージェントのみが実装するべきです。 [UIEvents] の レガシーイベント初期化子も参照してください。
WebIDLpartial interface MouseEvent {
};
initMouseEvent(typeArg)MouseEvent オブジェクトの属性を初期化します。この
メソッドは UIEvent.initUIEvent() と同じ動作をします。
initMouseEvent メソッドは非推奨ですが、
広く普及した実装との後方互換性のために
サポートされています。
initEvent()
メソッドを参照してください。
initEvent()
メソッドを参照してください。
initEvent()
メソッドを参照してください。
view を指定します。この
値は null でもかまいません。
detail
を指定します。
screenX を指定します。
screenY を指定します。
clientX を指定します。
clientY を指定します。
ctrlKey を指定します。
altKey を指定します。
shiftKey を指定します。
metaKey を指定します。
button を指定します。
relatedTarget を指定します。この値は
null でもかまいません。
多くの方々から提案や推奨事項をいただき、その一部は この文書に取り入れられています。グループの議長は、以下の過去および現在のグループ メンバーと参加者による貢献に感謝します。 Mustaq Ahmed, Arthur Barstow, Ben Boyle, Matt Brubeck, Rick Byers, Marcos Cáceres, Cathy Chan, Bo Cupp, Domenic Denicola, Ted Dinklocker, Adam Ettenberger, Robert Flack, Dave Fleck, Mike Fraser, Ella Ge, Olga Gerchikov, Scott González, Kartikaya Gupta, Dominique Hazael-Massieux, Philippe Le Hégaret, Hayato Ito, Patrick Kettner, Patrick H. Lauke, Scott Low, Sangwhan Moon, Masayuki Nakano, Olli Pettay, Addison Phillips, Alan Pyne, Antoine Quint, Jacob Rossi, Kagami Sascha Rosylight, Doug Schepers, Ming-Chou Shih, Brenton Simpson, Dave Tapuska, Liviu Tinta, Asir Vedamuthu, Lan Wei, Jeffrey Yasskin, Navid Zolghadr.
過去にマウスイベントおよびホイールイベントを担当した方々にも感謝します。 Gary Kacmarcik, Travis Leithead、および長年にわたる さまざまな 貢献者。
特に、このモデルの初版を開拓するのに尽力した次の方々に感謝します: Charu Chandiram, Peter Freiling, Nathan Furtwangler, Thomas Olsen, Matt Rakow, Ramu Ramanathan, Justin Rogers, Jacob Rossi, Reed Townsend and Steve Wright.
この節は非規範的です。
以下は、[PointerEvents3] 仕様を基準とした、 この仕様の公開版間における実質的かつ主要な編集上の変更の非規範的な要約です。 この仕様の編集者草案の 完全な 改訂履歴を参照してください。
WebIDLdictionary PointerEventInit : MouseEventInit {
long pointerId = 0;
double width = 1;
double height = 1;
float pressure = 0;
float tangentialPressure = 0;
long tiltX;
long tiltY;
long twist = 0;
double altitudeAngle;
double azimuthAngle;
DOMString pointerType = "";
boolean isPrimary = false;
long persistentDeviceId = 0;
sequence<PointerEvent> coalescedEvents = [];
sequence<PointerEvent> predictedEvents = [];
};
[Exposed=Window]
interface PointerEvent : MouseEvent {
constructor(DOMString type, optional PointerEventInit eventInitDict = {});
readonly attribute long pointerId;
readonly attribute double width;
readonly attribute double height;
readonly attribute float pressure;
readonly attribute float tangentialPressure;
readonly attribute long tiltX;
readonly attribute long tiltY;
readonly attribute long twist;
readonly attribute double altitudeAngle;
readonly attribute double azimuthAngle;
readonly attribute DOMString pointerType;
readonly attribute boolean isPrimary;
readonly attribute long persistentDeviceId;
[SecureContext] sequence<PointerEvent> getCoalescedEvents();
sequence<PointerEvent> getPredictedEvents();
};
partial interface Element {
undefined setPointerCapture (long pointerId);
undefined releasePointerCapture (long pointerId);
boolean hasPointerCapture (long pointerId);
};
partial interface mixin GlobalEventHandlers {
attribute EventHandler onpointerover;
attribute EventHandler onpointerenter;
attribute EventHandler onpointerdown;
attribute EventHandler onpointermove;
[SecureContext] attribute EventHandler onpointerrawupdate;
attribute EventHandler onpointerup;
attribute EventHandler onpointercancel;
attribute EventHandler onpointerout;
attribute EventHandler onpointerleave;
attribute EventHandler ongotpointercapture;
attribute EventHandler onlostpointercapture;
};
partial interface Navigator {
readonly attribute long maxTouchPoints;
};
dictionary MouseEventInit : EventModifierInit {
long screenX = 0;
long screenY = 0;
long clientX = 0;
long clientY = 0;
short button = 0;
unsigned short buttons = 0;
EventTarget? relatedTarget = null;
};
[Exposed=Window]
interface MouseEvent : UIEvent {
constructor(DOMString type, optional MouseEventInit eventInitDict = {});
readonly attribute long screenX;
readonly attribute long screenY;
readonly attribute long clientX;
readonly attribute long clientY;
readonly attribute long layerX;
readonly attribute long layerY;
readonly attribute boolean ctrlKey;
readonly attribute boolean shiftKey;
readonly attribute boolean altKey;
readonly attribute boolean metaKey;
readonly attribute short button;
readonly attribute unsigned short buttons;
readonly attribute EventTarget? relatedTarget;
boolean getModifierState(DOMString keyArg);
};
dictionary WheelEventInit : MouseEventInit {
double deltaX = 0.0;
double deltaY = 0.0;
double deltaZ = 0.0;
unsigned long deltaMode = 0;
boolean momentum = false;
};
[Exposed=Window]
interface WheelEvent : MouseEvent {
constructor(DOMString type, optional WheelEventInit eventInitDict = {});
// DeltaModeCode
const unsigned long DOM_DELTA_PIXEL = 0x00;
const unsigned long DOM_DELTA_LINE = 0x01;
const unsigned long DOM_DELTA_PAGE = 0x02;
readonly attribute double deltaX;
readonly attribute double deltaY;
readonly attribute double deltaZ;
readonly attribute unsigned long deltaMode;
readonly attribute boolean momentum;
};
partial interface MouseEvent {
// Deprecated in this specification
undefined initMouseEvent(DOMString typeArg,
optional boolean bubblesArg = false,
optional boolean cancelableArg = false,
optional Window? viewArg = null,
optional long detailArg = 0,
optional long screenXArg = 0,
optional long screenYArg = 0,
optional long clientXArg = 0,
optional long clientYArg = 0,
optional boolean ctrlKeyArg = false,
optional boolean altKeyArg = false,
optional boolean shiftKeyArg = false,
optional boolean metaKeyArg = false,
optional short buttonArg = 0,
optional EventTarget? relatedTargetArg = null);
};
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:
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: