SVGコンテンツは、SVG言語の以下の機能を利用することでインタラクティブ(すなわち、ユーザーが起こすイベントに反応)にすることができます:
本章では以下について説明します:
関連情報は他の章にも記載されています:
SVG 2要件: | アンカー変更イベントをサポートすること。 |
---|---|
決定: | SVG 2は、HTMLドキュメント全体のイベント(hashchangeを含む)を、意味のある場合SVGドキュメントにも適用することを検討する。 |
目的: | 著者がHTMLのbodyやルート要素と同様に、ルートSVG要素上でも同じイベントリスナー属性を使用できるようにすること。 |
担当者: | Cameron (ACTION-3278) |
SVG 2要件: | 適切なインターフェイスにイベントリスナー属性を持たせること。 |
---|---|
決定: | SVG 2は、HTMLの移行と同様に、すべてのイベントリスナー属性をElementに移動する。 |
目的: | HTMLとの整合性を取るため。 |
担当者: | Cameron (ACTION-3283) |
SVG 2要件: | イベントハンドラ内でeventの別名としてevtを導入すること。 |
---|---|
決定: | ISSUE-2176の解決策として、イベントハンドラ内でeventの別名としてevtを導入することを決定。 |
目的: | HTMLとの整合性を取るため。 |
担当者: | Cameron (ACTION-3093) |
SVG 2要件: | ドラッグ&ドロップ機能をサポートすること。 |
---|---|
決定: | SVG 2ではドラッグ&ドロップ機能が必要となる可能性があり、HTML5の機能も調査する。 |
目的: | SVGでドラッグ&ドロップを容易にし、HTMLとの整合性を取るため。 |
担当者: | Erik (ACTION-3328) |
SVGの以下の側面はイベントによって影響を受けます:
SVG 1.1で定義されていた複数のイベント(SVGLoad、SVGErrorなど)は、UI EVENTSやHTMLで定義されている同等のプレフィックスなしイベントに置き換えられました。
SVGのイベント使用に関して、より現代的な例(例えばタッチイベントとその仕様への参照など)が必要です。 デバイスの向き(orientation)イベントも参考になるかもしれません。
次の表は、この仕様で定義されているイベント、または他仕様と比較して追加要件や説明のあるイベントを示します。
最初の列のイベント名は、SVGのアニメーション要素内でアニメーションの開始・終了イベント定義に使用します。2列目のUIイベント名は、DOMイベントリスナー([DOM]、3.6節)を定義するときに使用します。
表に記載されていないHTMLやUI Eventsで定義されたイベントについては、SVGのアニメーション要素で使用するイベントタイプ名は、各仕様のevent typeになります。
表の要件で「イベントがバブルするか」「キャンセル可能か」は、ユーザーエージェントによって生成・発行されたイベントにのみ適用されます。DocumentインターフェイスのcreateEvent
メソッドを使ってスクリプトから生成されたイベントの場合は、initEventメソッドでバブルやキャンセル可能にできます。
イベント名・説明 | UIイベント名 | イベントカテゴリ | イベント属性名 |
---|---|---|---|
load loadイベントは、構造的外部要素とWindowにのみ、対応する外部リソースの読み込みが完了した時に発行されます。SVG要素のイベントハンドラ属性とWindowとの関係により、‘svg’要素のloadイベントは、ドキュメント内のすべてのリソースが完全に読み込まれた時のみ発行されます。 構造的外部要素のloadイベントとerrorイベントは排他的で、いずれか一方のみが、その要素処理時に発行されます。 loadイベントはバブルせず、キャンセルできません。 従来のSVG仕様ではloadイベントはSVGLoadと呼ばれ、要素のパース直後、関連リソースの完全読込前にも発行可能でした。 |
(同じ) | なし | onload |
unload 最上位svg要素にのみ適用されます。unloadイベントは、DOM実装がウィンドウやフレームからドキュメントを削除した時に発生します。 unloadイベントはバブルせず、キャンセルできません。 |
(同じ) | なし | onunload |
error errorイベントは、構造的外部要素が正しく読み込まれない場合や、スクリプト実行時にエラーが発生した場合に発生します。 errorイベントはバブルしますが、キャンセルできません。 |
(同じ) | なし | onerror |
beginEvent アニメーション要素が開始した時に発生します。詳細はSMIL Animation仕様のInterface TimeEventの説明を参照してください。 |
なし | なし | onbegin |
endEvent アニメーション要素が終了した時に発生します。詳細はSMIL Animation仕様のInterface TimeEventの説明を参照してください。 |
なし | なし | onend |
repeatEvent アニメーション要素が繰り返し再生された時に発生します。最初の繰り返し後、繰り返し毎に発生します。詳細はSMIL Animation仕様のInterface TimeEventの説明を参照してください。 |
なし | なし | onrepeat |
UIイベント型のイベントリスナーに渡されるパラメータの詳細は、([uievents])や([DOM])仕様を参照してください。他のイベント型については、この仕様の他の箇所で説明されています。
同様に、event-valueタイミング指定子は、アニメーション要素の‘begin’属性や‘end’属性で使用され、バブルまたはターゲットフェーズのイベントが要素に発行された時のみ具体的な時刻に解決されます。
SVG DOMは、UI Eventsで定義されているすべてのインターフェイスおよびイベント型、Clipboard API and eventsで定義されているイベント型と互換性があります([uievents]、[clipboard-apis])。
SVG名前空間のすべての要素は、これらのイベントのイベント属性をサポートしています。対応するIDLプロパティは、基底SVGElementインターフェイスに、GlobalEventHandlersと DocumentAndElementEventHandlers ミックスインを通じてそれぞれ含まれています。
SVG
DOMのサポートの一環として、適合SVGソフトウェアは、これらの仕様で定義されているすべての(非廃止・非非推奨)イベント型を、関連イベントがソフトウェアの利用状況で発生する可能性がある場合にサポートしなければなりません。
ユーザー操作をサポートしないSVGソフトウェアでも、load
やerror
など、操作なしで発火可能なイベントは実装しておくべきです。
SVGアニメーション要素(SVG Animations Level 2仕様で定義)は、追加のイベントおよびイベント属性をサポートします。 次のイベント型はアニメーションの状態変化によって発火します。
これらアニメーションイベント用のイベント属性は、他の要素には効果がありません。
インタラクティビティをサポートするユーザーエージェントでは、著者がSVGドキュメントをユーザーインターフェイスイベントに反応するよう定義することが一般的です。ユーザーイベントにはポインターイベント、キーボードイベント、ドキュメントイベントなどがあります。
UIイベントに応じて、著者はアニメーションの開始、他のWebページへのリンク、ドキュメントの一部の強調(例:ポインター下のグラフィック要素の色変更)、ロールオーバー(例:ポインター付近に隠れていたグラフィック要素を表示)、リモートデータベースと通信するスクリプトの起動などを行うことができます。
ユーザーがポインターデバイス上で行った操作によって発生するユーザーインターフェイスイベントは、ポインターイベントと呼ばれます。
多くのシステムはマウスやトラックボールなどのポインターデバイスをサポートしています。マウスを使用するシステムでは、ポインターイベントにはマウス移動やクリックなどの操作が含まれます。別のポインターデバイスの場合でも、ボタン押下などマウスクリック相当の操作を提供することで、マウスの動作をエミュレートすることが多いです。
各ポインターイベントごとに、SVGユーザーエージェントはそのイベントのターゲット要素を決定します。ターゲット要素は、イベント発生時にポインターの下にある、最上位のグラフィック要素の関連グラフィック内容です。(どの要素の関連グラフィック内容がポインターの下にあるか、またどの状況でそのグラフィック要素がポインターイベントのターゲット要素となるかの詳細は、pointer-eventsプロパティの説明を参照してください。)要素が表示されていない場合(すなわち、その要素または祖先のdisplayプロパティがnoneの場合)、その要素はポインターイベントのターゲットにはなりません。
ポインターイベントのターゲット要素が存在する場合、イベントは通常のイベントフロー([uievents]、3.1節)に従って、その要素へ配信されます。 ‘use’要素やスクリプトで生成されたシャドウツリーの場合、イベントはDispatching Events [dom] に従う必要があります。
ポインターイベントのターゲット要素が存在しない場合、そのイベントは無視されます。
ポインターデバイスと要素(または領域)のインタラクションには、次の2つの側面があります:
ポインターイベントによるヒットテストが陽性になるかどうかは、ポインターの位置、グラフィック要素のサイズと形状、およびその要素のpointer-eventsプロパティの計算値によって決まります。pointer-eventsプロパティの定義は、各種グラフィック要素のどの領域がポインターイベントに対して反応するかの詳細を説明します。
なお、‘svg’要素はグラフィック要素ではなく、適合SVG単独ファイルにおいては、最上位svg要素がポインターイベントのターゲットになることはありません(ただしイベントがこの要素までバブルすることはあります)。 ポインターイベントがグラフィック要素のヒットテストに陽性とならなかった場合は、ユーザーエージェント固有のウィンドウ動作(例:コンテキストメニュー表示やSVGドキュメント断片のズーム・パン制御など)が発生することがあります。
この仕様は、別のドキュメント内に参照または包含されて埋め込まれたSVG画像の最上位svg要素に対するポインターイベントの動作は定義しません(例:HTMLドキュメントに埋め込まれた最上位svg要素がマウスクリックイベントを受け取るかどうか)。将来の仕様でこの動作が定義される可能性はありますが、本仕様では実装依存とします。
ユーザーインターフェイスイベントのターゲットとなった要素は、要素の種類や、スクリプトイベントリスナー・CSS疑似クラス・イベントベースタイミングの宣言型アニメーションなど明示的なインタラクションがあるかどうかによって、特有のインタラクション動作を持つ場合があります。ターゲット要素へのDOMイベント配信後のユーザーインターフェイスイベント処理アルゴリズムとその順序は以下の通りです:
preventDefault()
DOMメソッドを呼び出した場合、この要素への処理はそれ以上行われず、イベントはイベント配信およびDOMイベントフロー処理([uievents])に従います;:hover
、:active
、:focus
)に一致する場合は、関連クラスのプロパティが適用されます([CSS2]、5.11節);状況に応じて、著者は特定のグラフィック要素がポインターイベントのターゲットになる条件を制御したい場合があります。たとえば、著者は特定の要素がポインターの位置が図形のストロークされた輪郭上にあるときだけポインターイベントを受け取るようにしたいことがあります。別の場合、著者は特定の要素がすべての状況でポインターイベントを無視し、その下にあるグラフィック要素がポインターイベントのターゲットになるようにしたい場合があります。
マスクとクリッピングの効果はpointer-eventsに関して異なります。クリップパスは幾何学的な境界であり、ある点がその境界の内側か外側か明確です。したがって、クリップされた要素のレンダリング領域上では通常通りポインターイベントを捕捉し、クリップされた領域上ではイベントを捕捉しない必要があります(clipping pathsの定義参照)。一方、マスクは二値的な遷移ではなくピクセル操作であり、完全に透明な場合とほぼ透明な場合で挙動が恣意的になりやすいです。そのため、マスクが適用された要素では、マスクがゼロ不透明度の領域でもポインターイベントを受け取る必要があります。マスクの透明部分で下の要素にポインターイベントを通したい場合は、マスクとクリッピングの組み合わせを使うことができます。
filterプロパティはポインターイベント処理に影響せず、この文脈ではfilterが指定されていないものとして扱います。
例えば、strokeがred(赤いアウトライン)で、fillがnone(内部は塗りなし)の円が、fillがblueの長方形の真上に描画されているとします。著者は、ポインターが円の輪郭上にあるときだけ円がポインターイベントのターゲットとなるようにしたいことがあります。円の内部にポインターがある場合は、下の長方形がポインターイベントのターゲット要素となるようにしたいかもしれません。
pointer-eventsプロパティは、どの条件下で要素がポインターイベントのターゲット要素となるかを指定します。これは、以下の状況での処理に影響します:
名前: | pointer-events |
---|---|
値: | bounding-box | visiblePainted | visibleFill | visibleStroke | visible | painted | fill | stroke | all | none |
初期値: | visiblePainted |
適用対象: | コンテナ要素、グラフィック要素、および‘use’ |
継承: | はい |
パーセンテージ: | 該当なし |
メディア: | ビジュアル |
算出値: | 指定通り |
アニメーション可能: | はい |
テキスト要素の場合、ヒットテストは文字セル単位で行われます:
ラスタ画像の場合、ヒットテストは画像全体(矩形領域)単位か、ピクセル単位(ポインター下のピクセルのアルファ値による判定)で行われます:
ラスタ画像の場合、opacity、fill-opacity、stroke-opacity、fill、strokeの各プロパティ値はイベント処理に影響しません。
SVG 2要件: | 詳細度制御(Level of Detail control)をサポートすること。 |
---|---|
決定: | SVG 2では詳細度制御をサポートする。 |
目的: | ズームレベルに応じて要素の可視性を制御(例:地図で有用)。 |
担当者: | Doug(アクションなし) |
備考: | SVG 1.2 Tinyのタイリング・レイヤリングモジュール参照。 |
拡大(Magnification)はSVG文書片全体に一様な変換を施す操作であり、拡大操作はすべてのグラフィック要素を同じ倍率でスケーリングします。拡大操作は、SVG文書片の最外層(すなわち、最上位svg要素の外側)に補助的なスケールおよび移動(translate)変換を追加する効果があります。
パン操作(Panning)は、ユーザーインターフェイス操作に応じてSVG文書片に平行移動(シフト)変換を行うものです。
インタラクション機能を持つユーザー環境で動作するSVGユーザーエージェントは、拡大・パン操作の機能をサポートする必要があります。
SVG文書片の最上位svg要素には、属性‘zoomAndPan’があり、値はdisableとmagnifyが指定可能で、デフォルトはmagnifyです。
zoomAndPan属性は非推奨のリスクがあり、既知の実装はなく、今後も実装される可能性が低いです。 Github issue #56参照。
名前 | 値 | 初期値 | アニメーション可能 |
---|---|---|---|
zoomAndPan | [ disable | magnify ] | disable | 不可 |
disableの場合、ユーザーエージェントは拡大・パン操作のコントロールを無効化し、当該文書片で拡大・パンの操作を許可しません。
magnifyの場合、インタラクティブな環境ではユーザーエージェントが拡大操作のコントロールを提供し、文書片に対して拡大操作を行えるようにします。
‘zoomAndPan’属性が内部の‘svg’要素に指定された場合、内部の‘zoomAndPan’設定はSVGユーザーエージェントには影響しません。
SVGは、HTMLと同じフォーカスモデルを採用しており、本節でSVG向けの修正点を説明します。 文書内で同時にフォーカスされる要素は最大1つだけです。文書全体がシステムフォーカスを持つ場合、この要素がすべてのキーボードイベントのターゲットとなります。
要素がフォーカスされると、その要素はCSS
:focus
疑似クラスに一致します。
インタラクティブなユーザーエージェントは、キーボードや他の非ポインティングデバイスによるユーザー入力イベントでフォーカスが変化したときに(通常はアウトラインなどで)視覚的にフォーカスを示す必要があり、常時フォーカスを示しても構いません。
著者は:focus
疑似クラスを使って、グラフィックに適した表示(例:図形のストローク)に変更できますが、視覚的なフォーカス表示を完全に削除するべきではありません。
次のSVG要素はインタラクティブな文書でフォーカス可能です。 use要素シャドウツリー内のこうした要素のいずれのインスタンスもフォーカス可能です。 HTMLのフォーカスモデルにおいて、インタラクティブなユーザーエージェントは、これらをフォーカス可能領域として扱い、tabindexフォーカスフラグを設定する必要があります:
ユーザーエージェントがコントロールを提供する場合、要素ごとに複数のフォーカス可能領域を持つことがあります。
さらに、有効なリンクであるすべての‘a’要素はフォーカス可能であり、そのtabindexフォーカスフラグは、ユーザーエージェントがリンクのキーボード移動に代替手段を通常提供しない限り設定されなければなりません。
SVG Tiny 1.2のfocusable属性を使ったコンテンツとの互換性のため、ユーザーエージェントはこの属性値がtrueの場合は要素をフォーカス可能として扱うべきです。 新しいコンテンツでは、focusable属性は省略するか、対応するtabindex値0と組み合わせてのみ使用してください。
ユーザーエージェントは他の要素もフォーカス可能として扱う場合があります。特にキーボード操作が唯一または主要なユーザー入力手段の場合です。 例えば、キーボードフォーカスを使って‘title’要素のテキストをツールチップとして表示したり、マウス・ポインター・フォーカスイベントのリスナーが割り当てられた要素にフォーカスを移動できるようにすることがあります。 著者はこの挙動に依存してはいけません。すべてのインタラクティブ要素は直接キーボード操作をサポートすべきです。
フォーカスの順序は、すべてのフォーカス可能要素の集合から生成され、SVG要素の‘tabindex’属性は、HTML要素のtabindex属性と同じ方法で処理されます。 use要素シャドウツリー内のコンテンツは、‘use’要素の子コンテンツとして扱う形でフォーカス順序に挿入されます。
ユーザーエージェントがSVG文書のスクロールやパン操作に対応しており、フォーカスがSVGビューポート外の要素に移動した場合、ユーザーエージェントはフォーカスされた要素がSVGビューポート内に収まるまで文書をスクロールまたはパンすべきです。
HTMLと同様に、フォーカス可能なSVG要素で明確なアクティベーション動作が定義されていない場合、アクティベーション動作は何もしません(ただしスクリプトがそれに反応する場合を除く)。
これは、‘tabindex’属性だけでフォーカス可能になっている要素は、非マウスアクティベーション(例:Enterキー押下時)でclick
イベントが発火することを意味します。
インラインHTMLとSVGが混在する文書の場合、フォーカスは文書全体で処理され(連続的なフォーカス順序)、各インラインSVGやHTML断片ごとに個別のサブドキュメントとして扱われるわけではありません。
例えば、次の文書では、Tabキーを押すとA、B、Cの順でフォーカスが巡回します。
<!DOCTYPE html> <button id="A" tabindex="1">First thing</button> <button id="C" tabindex="2">Third thing</button> <svg width="200" height="200"> <text id="B" tabindex="1" x="100" y="100">Second thing</text> </svg>
SVG要素には、HTMLのaccesskey属性に相当するものはありません。
ユーザーエージェントが対応するイベント型ごとに、SVGは同様にイベント属性としてサポートします。要件はevent handler content attributes [HTML] と同じです。 イベント属性はすべてのSVG要素で利用できます。
イベント属性の内容は常にECMAScriptとして解釈され、'application/ecmascript'メディアタイプで処理されるものとします。 [rfc2046][rfc4329]
イベント属性はアニメーション可能ではありません。
実装者はイベント属性の設定を、EventListenerをEventTargetに作成・登録するものとみなしても構いません。こうしたイベントリスナーは
"bubbling" および "at target" フェーズのみ呼び出され、addEventListener
の useCapture
引数が false
であるかのように動作します。このEventListenerは、他のEventTargetに登録されうるものと同様に動作します。
イベントリスナーを表す属性が変更された場合、それは以前登録されていたEventListenerの削除と新しいものの登録とみなしても構いません。また、イベント属性が他のEventListenerより先にイベントを受け取る順序については規定されていません。
ECMAScriptでは、イベントリスナーを定義して addEventListener
メソッドに渡す方法があります:
function myAction1(evt) { // イベントを処理 } // ... 後で ... myElement.addEventListener("click", myAction1, false)
ECMAScriptでは、イベント属性の文字データ内容は、イベント応答時に呼び出されるECMAScript関数の定義となります。他のECMAScriptイベントリスナー関数と同様、この関数はEventオブジェクトをパラメータとして受け取り、Eventオブジェクトの名前はevtです。例えば、以下のように記述できます:
<rect onclick="MyClickHandler(evt)" .../>
これにより、Eventオブジェクトevtが
MyClickHandler
関数に渡されます。
以下はアニメーションイベント属性の定義です。 これらはアニメーション要素で指定できます。
属性定義:
名前 | 値 | 初期値 | アニメーション可能 |
---|---|---|---|
onbegin, onend, onrepeat | (下記参照) | (なし) | 不可 |
SVG 2要件: | ‘script’にasync/deferを許可するか検討すること。 |
---|---|
決定: | SVG 2では‘script’でasync/deferを許可する。 |
目的: | HTMLとの整合性。 |
担当者: | Cameron (ACTION-3280) |
SVG 2要件: | SVG Tiny 1.2のスクリプト処理モデルを組み込むこと。 |
---|---|
決定: | SVG 2では、HTML5と互換性のある方法でインラインスクリプト可能コンテンツの処理を定義する。 |
目的: | HTMLとSVG間で一貫したスクリプト実行挙動を持たせるため。 |
担当者: | Cameron (ACTION-3282) |
‘script’要素はHTMLの‘script’と同等であり、スクリプト(例:ECMAScript)を記述する場所です。いずれかの‘script’要素内で定義された関数は現在の文書全体で「グローバル」スコープを持ちます。
スクリプトのテキスト内容は直接レンダリングされることはありません。 ‘script’要素のdisplay値は、ユーザーエージェントスタイルシートにより常にnoneに設定されなければならず、この宣言は他のCSSルールやプレゼンテーション属性よりも優先されます。
‘script’要素を実行しようとする前に、‘type’の解決済みメディアタイプ値を確認する必要があります。 SVGユーザーエージェントがスクリプト言語をサポートしない場合、‘script’要素は実行されてはなりません。
この例では、circle_click
関数を定義し、‘onclick’イベント属性によって‘circle’要素で呼び出されます。左側の図が初期画像、右側は円をクリックした後の結果を示します。
<?xml version="1.0" standalone="no"?> <svg width="6cm" height="5cm" viewBox="0 0 600 500" xmlns="http://www.w3.org/2000/svg"> <desc>Example script01 - invoke an ECMAScript function from an onclick event </desc> <!-- ECMAScript to change the radius with each click --> <script type="application/ecmascript"> <![CDATA[ function circle_click(evt) { var circle = evt.target; var currentRadius = circle.getAttribute("r"); if (currentRadius == 100) circle.setAttribute("r", currentRadius*2); else circle.setAttribute("r", currentRadius*0.5); } ]]> </script> <!-- Outline the drawing area with a blue line --> <rect x="1" y="1" width="598" height="498" fill="none" stroke="blue"/> <!-- Act on each click event --> <circle onclick="circle_click(evt)" cx="300" cy="225" r="100" fill="red"/> <text x="300" y="480" font-family="Verdana" font-size="35" text-anchor="middle"> Click on circle to change its size </text> </svg>
![]() ![]() |
属性定義:
名前 | 値 | 初期値 | アニメーション可能 |
---|---|---|---|
crossorigin | [ anonymous | use-credentials ]? | (HTML属性の定義参照) | はい |
crossorigin属性はCORS設定属性であり、特に規定がない限りHTMLと同じ処理ルールに従います [HTML]。
名前 | 値 | 初期値 | アニメーション可能 |
---|---|---|---|
type | (下記参照) | application/ecmascript | 不可 |
名前 | 値 | 初期値 | アニメーション可能 |
---|---|---|---|
href | URL [URL] | (なし) | 不可 |
URLは処理され、リソースはリンク章で説明される通りに取得されます。
SVGScriptElementオブジェクトは、DOM内の‘script’要素を表します。
[Exposed=Window] interface SVGScriptElement : SVGElement { attribute DOMString type; attribute DOMString? crossOrigin; }; SVGScriptElement includes SVGURIReference;
type IDL属性は、 ‘type’コンテンツ属性を反映します。
crossOrigin IDL属性は ‘crossorigin’コンテンツ属性を反映します。