Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
この仕様は、Scalable Vector Graphics (SVG) バージョン 2 の機能と構文を定義する。SVG は XML に基づく言語であり、 2 次元のベクターグラフィックス、およびベクターとラスターが混在するグラフィックスを記述する。SVG コンテンツはスタイルを適用でき、 異なる表示解像度に合わせて拡大縮小でき、単独で表示することも、 HTML コンテンツと混在させることも、XML 名前空間を使用して他の XML 言語内に埋め込むこともできる。 SVG は動的な変更にも対応しており、スクリプトを使用して対話的な文書を作成でき、 宣言的なアニメーション機能またはスクリプトを使用してアニメーションを実行できる。
この節では、この文書の公開時点における位置付けについて説明する。 現在の W3C 公開文書の一覧およびこの技術報告書の最新版は、 W3C 標準および草案の索引にある。
この文書は、2026 年 10 月 06 日付の SVG 2 の勧告候補スナップショットである。この SVG のバージョンは、 SVG 1.1 第 2 版 を基礎として、言語の使いやすさを改善し、著者から一般的に 要望されてきた新機能を追加している。変更点の付録には、 SVG 1.1 第 2 版以降に行われたすべての変更が一覧されている。
この勧告候補スナップショットに対するコメントを歓迎する。
フィードバックおよびエラー報告は、Github
issues を使用して提出できる。その他のコメントは www-svg@w3.org、
Web 上のベクターグラフィックスに関連する問題を扱う公開メーリングリストへ送信できる。このリストは
アーカイブされており、
送信者は最初の投稿から自分のメッセージが公開アーカイブされることに
同意しなければならない。購読するには、
www-svg-request@w3.org に、
件名に subscribe という語を入れてメールを送信する。
この仕様には、ワーキンググループが SVG の機能について特定の決定が行われた会議の議事録や決議へのリンクを記録するために使用している 多数の注釈が含まれている。また、仕様の各節の 成熟度を示すために異なる背景色が使用されている。
この勧告候補スナップショットでは、既定では、節の成熟度を示す背景色は 非表示になっており、要件収集作業の一環として SVG 2 に対する特定の 要件を記録する注釈だけが 表示される。節の成熟度を示す背景色および追加の 注釈を表示するには、「All annotations」代替スタイルシートを使用できる。
この文書は、SVG ワーキンググループにより、 勧告トラックを使用して勧告候補スナップショットとして公開された。
勧告候補としての公開は、W3C およびその会員による承認を意味するものではない。 勧告候補スナップショットは広範なレビューを受けており、 実装経験を収集することを目的としており、ワーキンググループのメンバーから、実装に対するロイヤリティフリーのライセンスを 提供する確約を得ている。
この勧告候補は、早くても 2026 年 12 月 01 日以降に勧告へ進む予定である。
この文書は、 W3C 特許方針の下で活動するグループによって作成された。 W3C は、このグループの成果物に関連して行われた特許 開示の公開一覧を管理しており、 そのページには特許を開示するための 手順も含まれている。個人が、 必須クレームを含むと考える特許について 実際に知っている場合は、 W3C 特許方針の第 6 節に従ってその情報を開示しなければならない。
この文書には、 2025 年 8 月 18 日付 W3C プロセス 文書が適用される。
この仕様のすべての機能は、ブラウザー またはオーサリングツールへの実装に依存する。ある機能が確実に実装されるとはいえない場合、その 機能を「リスクあり」と定義する。リスクありの機能は現在の 仕様から削除され、将来の仕様のバージョンに含まれる可能性がある。 リスクありの機能が SVG の著者にとって特に重要である場合、それらの著者は その優先度について実装者へフィードバックすることが推奨される。 次の機能はリスクがあり、CR 期間中に削除される可能性がある。
SVG ワーキンググループは、以下の方々に、 パッチによる貢献、または文書の変更につながった議論への参加を通じて、 この仕様に貢献していただいたことに感謝する。 David Dailey, Eric Eastwood, Jarek Foksa, Daniel Holbert, Paul LeBeau, Robert Longson, Henri Manson, Ms2ger, Kari Pihkala, Philip Rogers, David Zbarsky.
さらに、SVG ワーキンググループは、 SVG の以前のバージョンの編集者および著者による貢献にも 謝意を表する。この文書のテキストの多くが、これらの 以前の仕様に由来しているためである。以下の方々が含まれる。
最後に、SVG ワーキンググループは、 SVG ワーキンググループの外部で SVG 仕様の 開発プロセスを支援してくださった非常に多くの方々にも謝意を表する。これらの方々は 個別に列挙するには多すぎる。これには、以下に限られないが、 SVG 1.0 および 1.1 言語の初期の実装者( ビューアー、オーサリングツール、サーバー側トランスコーダーを含む)、SVG コンテンツの開発者、www-svg@w3.org および svg-developers@yahoogroups.com メーリングリストに貢献した人々、W3C の他のワーキンググループ、 および W3C チームが含まれる。SVG 1.1 は、真に SVG ワーキンググループ、W3C の他の組織、および一般の人々による共同作業であり、 初期の実装者およびコンテンツ 開発者による先駆的な取り組み、一般からのフィードバック、および W3C チームの支援から大きな恩恵を受けている。
この仕様は、以下の機能と構文を定義する。 スケーラブル・ベクター・グラフィックス (SVG)。
SVG は 2 次元グラフィックスを記述するための言語である。 スタンドアロン形式として、または他の XML と混在する場合には、 XML 構文 [xml] を使用する。 HTML 文書内で使用される SVG コードは HTML 構文 [HTML] を使用する。 SVG では 3 種類のグラフィックオブジェクトを使用できる。すなわち、ベクターグラフィック 図形(例えば、直線と曲線からなるパス)、 画像、およびテキストである。グラフィックオブジェクトはグループ化、スタイル付け、 変換、および合成できる。 機能セットには、入れ子になった変換、クリッピング パス、アルファマスク、フィルター効果、およびテンプレートオブジェクトが含まれる。
SVG 描画はインタラクティブかつ 動的にできる。アニメーションは、 宣言的に(すなわち、SVG アニメーション要素を SVG コンテンツに埋め込むことによって)、またはスクリプトを介して定義および起動できる。
SVG の高度な応用は、 SVG 文書オブジェクトモデル (DOM) にアクセスする補助的なスクリプト言語を使用することで可能になり、この DOM は すべての要素、属性、および プロパティへの完全なアクセスを提供する。豊富なイベントハンドラーのセットを 任意の SVG グラフィックオブジェクトに割り当てることができる。 Web ページ内では、同じスクリプトが HTML 要素と SVG 要素の両方を操作できる。 スクリプティング。
SVG は、多数の 正しく使用すればアクセシビリティを実現する機能を含め、情報を豊かなグラフィックスとして提示するのに有用であり、 コンテンツを可能な限り幅広い利用者が利用できるようにする。しかし、可能な場合には、 ソースデータへの直接のリンクが、 提供されたコンテンツを理解するうえで多くの人に役立つ。
SVG は、以下に説明するように、他の W3C 仕様 および標準化活動を活用し、それらと統合する。
この仕様では、キーワード "MUST"、"MUST NOT"、 "REQUIRED"、"SHALL"、"SHALL NOT"、"SHOULD"、"SHOULD NOT"、 "RECOMMENDED"、"MAY"、および "OPTIONAL" は、 要件レベルを示すために RFC で使用する キーワードに記述されているとおりに解釈される [rfc2119]。 ただし、読みやすさのため、この仕様ではこれらの語が必ずしも すべて大文字で表記されるわけではない。
この仕様では場合によって、 著者およびユーザーエージェントに対する優れた慣行を推奨する。
SVG で定義されたグラフィックスには、さまざまな用途がある。 その結果、SVG を使用するすべてのソフトウェアが同じ機能を備えるわけではない。 したがって、SVG 仕様への適合は二者択一ではなく、 ソフトウェアは制限された機能セット内で適合している場合がある。
さらに、SVG は他の種類の文書に統合されるよう設計されており、 統合の種類によっては、限定された機能セットのみが適切な場合がある。 SVG 文書フラグメントが他の文書から 参照されたり、他の文書に含まれたりし、それによって ユーザーエージェントによって処理される方法はさまざまである。SVG 文書は、 主文書として直接表示することもできる。 SVG 文書フラグメントを使用できるそれぞれの異なる方法は、 SVG 文書 フラグメントをどのように処理しなければならないかについて、一定の要件セットを伴う。
したがって、この章では、 処理モードをいくつか定義し、 文書内で有効または無効にできる機能の 異なる組み合わせを網羅する。 さらに、SVG 文書が他の SVG 文書を参照または埋め込む場合に、 どの処理モードを使用しなければならないかについて規範要件を指定する。 同じ処理モードのセットは、他の仕様から参照して、 SVG 文書をどのように処理すべきかを記述するためにも使用できる。
この文書は、 HTML やさまざまな CSS 仕様など、SVG 文書を参照または含めることができる 他の仕様に規範要件を課すものではない。意図しているのは、これらの他の 仕様が、この文書の適切な処理モードを 規範的に参照することである。
この章では、 さまざまな種類の SVG コンテンツ、 および SVG を使用または作成するさまざまなクラスのソフトウェアに対する具体的な適合要件についても概説する。
この節では、SVG 文書用の標準的な処理モードのセットを定義する。 各処理モードは、特定の高レベル SVG 機能を有効にするかどうかを指定する。
処理モードに応じて有効または無効にできる 機能は次のとおりである。
宣言的アニメーションには、SVG のアニメーション要素、 ‘animate’、 ‘animateMotion’、 ‘animateTransform’ および ‘set’ と、CSS Transitions および Animations の両方が含まれる (詳細についてはアニメーションの付録を参照)。 SVG 文書で宣言的アニメーションが無効になっている場合、 アニメーション要素、CSS Transitions、Animations は適用または実行してはならない。
これは、文書時間 0 秒で文書のアニメーション状態を 一時停止することとは異なる。アニメーションが 0 秒で開始するよう定義されていても、 それでも適用されない。
外部リソースへの参照とは、 文書内で使用されるマークアップ、スタイルプロパティ、スクリプト、またはその他の Web プラットフォーム機能によって行われる URL 参照 またはネットワークアクセス要求であり、以下を除く。
SVG 文書で外部参照が無効になっている場合、 外部参照を通じて文書を取得しようとする試みは、代わりに ネットワークエラーが発生し、データを受信しなかったものとして扱わなければならない。
外部参照が有効になっている場合、 インターネットからの外部ファイル要求をサポートするユーザーエージェントは、 リンクの章で概説されているように、クロスオリジンリソース取得の制限に従わなければならない。
スクリプト実行とは、SVG の ‘script’ 要素、 イベント属性内にあるスクリプト(例えば SVG 要素の ‘onclick’)、 または文書内で使用される他の Web プラットフォーム機能によって定義されるその他のスクリプト、 例えば HTML の ‘script’ 要素の実行をいう。 SVG 文書でスクリプト実行が無効になっている場合、 文書内のいかなるスクリプトも実行してはならない。
インタラクションとは、DOM Events の配信、またはテキスト選択、フォーカス変更、 リンクのたどり、アニメーションやトランジションの起動など、 マウスやキーボード操作などのユーザー入力に 応答して行われるユーザーエージェント固有の UI 動作の呼び出しを指す。 SVG 文書でインタラクションが無効になっている場合、その文書または 文書内の要素を対象とするあらゆるユーザー入力イベントは 効果を持ってはならない。
この処理モードは、 SVG 言語のいかなる機能にも制限を課さない。
| 動的インタラクティブ機能 | |
|---|---|
| スクリプト実行 | はい |
| 外部参照 | はい |
| 宣言的アニメーション | はい |
| インタラクティビティ | はい |
この処理モードは、 SVG 文書を、外部参照の解決が許可される アニメーション画像として使用するが、 インタラクティブな文書として使用することを意図しない場合を対象としている。
| アニメーション機能 | |
|---|---|
| スクリプト実行 | いいえ |
| 外部参照 | はい |
| 宣言的アニメーション | はい |
| インタラクティビティ | いいえ |
この処理モードは、 SVG 文書を、外部参照の解決が許可されない アニメーション画像として使用し、 インタラクティブな文書として使用することを意図しない場合を対象としている。このモードは、 画像サポートが従来ラスター画像(JPEG、PNG、 GIF など)に限定されてきた場合に使用されることがある。
| セキュアアニメーション機能 | |
|---|---|
| スクリプト実行 | いいえ |
| 外部参照 | いいえ |
| 宣言的アニメーション | はい |
| インタラクティビティ | いいえ |
この処理モードは、 SVG 文書を、外部参照の解決が許可される 非アニメーション画像として使用するが、 インタラクティブな文書として使用することを意図しない場合を対象としている。 例えば、 印刷文書に含めるためにグラフィックスを処理する SVG ビューアーは、 静的モードを使用する可能性が高い。
| 静的機能 | |
|---|---|
| スクリプト実行 | いいえ |
| 外部参照 | はい |
| 宣言的アニメーション | いいえ |
| インタラクティビティ | いいえ |
この処理モードは、 SVG 文書を、外部参照の解決が許可されない 非アニメーション画像として使用し、 インタラクティブな文書として使用することを意図しない場合を対象としている。このモードは、 画像サポートが従来、非アニメーションのラスター画像(JPEG や PNG など)に限定されてきた場合に使用されることがある。
| セキュア静的機能 | |
|---|---|
| スクリプト実行 | いいえ |
| 外部参照 | いいえ |
| 宣言的アニメーション | いいえ |
| インタラクティビティ | いいえ |
SVG 文書を直接表示する場合、 ユーザーエージェントがサポートする最も包括的な 処理モードを使用して表示されることが期待される。 ただし、SVG が サブリソースまたは埋め込み文書として処理される場合、 次の制限を適用しなければならない。
‘image’ 要素内に埋め込まれた SVG は、 埋め込み文書が宣言的アニメーションをサポートする場合、 セキュアアニメーションモードで処理しなければならず、 それ以外の場合はセキュア静的モードで処理しなければならない。
SVG がラスター画像の代わりに使用される他の場合にも、 同じ処理モードが使用されることが期待される。 例えば、HTML の ‘img’ 要素や、 <image> データ型を取る 任意の CSS プロパティなどである。 これは、画像ソースが 「ページ化もスクリプト化もされていない、非インタラクティブで、任意にアニメーション可能な画像リソース」を参照しなければならないという HTML の要件と 一致する [HTML]
'href'
参照SVG 文書が ‘use’ 要素の参照、 またはペイントサーバー要素の相互参照を通じて読み込まれる場合、 セキュア静的モードで処理しなければならない。
サブリソース文書を処理している間はアニメーションが実行されないことに注意すること。 これはパフォーマンス上の理由と、リソース文書が 参照するタイムラインのコンテキストが現在定義されていないためである。 ただし、‘use’ 要素の参照 またはペイントサーバーの相互参照により、サブリソース文書の要素が 現在の文書に複製される場合、 複製された要素インスタンスは use 要素のシャドウツリー内のアニメーションで説明されているように、 現在の文書のタイムライン内でアニメーションでき、 追加のサブリソースファイルの読み込みを起動する場合がある。
SVG 文書が、 文書内の特定の要素を対象とするスタイルプロパティ参照 (画像形式としての SVG とは異なる)を通じて読み込まれる場合、 セキュア静的モードで処理しなければならない。
サブリソース文書内ではアニメーションが実行されないことに注意すること。 これはパフォーマンス上の理由と、リソース文書が 参照するタイムラインのコンテキストが現在定義されていないためである。
一部のスタイルプロパティは、特定の要素 または画像ファイル全体のいずれかを参照できる。 前者の場合、処理モードはより制限される。 例えば、SVG の ‘mask’ 要素への参照は アニメーションされないが、 画像マスクとして使用される SVG ファイル全体はアニメーションできる。
SVG ファイルがフォント参照の一部として処理される場合、 アニメーション付きグリフがサポートされていれば セキュアアニメーションモードを使用し、 それ以外の場合はセキュア静的モードを使用しなければならない。
これらの制限は、 "SVG" テーブルから文書を処理するための OpenType 仕様に含まれている。 OpenType はさらに、 テキストおよび外部オブジェクトのレンダリングを防止するユーザーエージェントスタイルシートの形式で、 追加の制限も適用する [OPENTYPE]。
ホスト文書内にインラインで含まれる SVG 文書フラグメントは、 ホスト文書のものと一致する処理モードを使用しなければならない。 SVG の ‘foreignObject’ 要素の子として含まれる SVG 文書フラグメントは、 周囲の SVG 文書の処理モードを使用しなければならず、 SVG 以外の外部コンテンツは同等の制限で処理しなければならない。
例えば、SVG 文書が HTML の ‘img’ または SVG の ‘image’ 要素から参照されることにより、 セキュアアニメーションモードで使用されている場合、 ‘foreignObject’ 要素内のあらゆるコンテンツでは、 スクリプト、インタラクティビティ、および外部ファイル参照を無効にしなければならないが、 宣言的アニメーションは有効にすべきである。
以下に、HTML ページへ SVG を参照によって埋め込む さまざまな方法と、 それぞれに期待される処理モード および許可される機能を示す。
「実例」行の各セルには、黄色い スマイリーフェイスが表示されるはずである。 以下の各例では、目をクリックするとリンクの 移動がテストされ、 顔をクリックすると宣言的インタラクティビティ およびスクリプト実行がテストされる。 リンクは画像を青い 正方形に置き換えるはずである(クリックすると元の画像に戻る)。 宣言的インタラクティビティでは、 ‘set’ 要素を使用して顔を黄色系の色から緑色系の色に変更し、 CSS 疑似クラスを使用してインタラクティブな要素にストロークを追加する。 スクリプトは笑顔を描画するはずである。 左目がウィンクしており(‘animate’ 要素を使用)、 かつ目が濃い青色で定期的に明るい青色に点滅している(CSS キーフレームアニメーションを使用)場合、 時間ベースの(インタラクティビティベースではない)宣言的アニメーションがサポートされている。
ここで概説した期待される処理モードと機能は、 対応する HTML または CSS 仕様の今後の変更の影響を受ける。
| 埋め込み方法 | サンドボックスなしの object | img | CSS 背景 | |
|---|---|---|---|---|
| 期待される処理モード | 動的インタラクティブ | 動的インタラクティブ、制限あり | セキュアアニメーション | セキュアアニメーション |
| 宣言的な時間ベースのアニメーション (左目のウィンク、両方の 目の色変化) |
許可 | 許可 | 許可 | 許可 |
| 宣言的なインタラクティブアニメーションとスタイル変更 (クリック時に顔の色が変化し、 ホバーまたはフォーカス時に顔/目に輪郭が付く) |
許可 | 許可 | 無効 | 無効 |
| 同じ閲覧コンテキスト内で同じドメインへのリンクナビゲーション (目をクリックすると画像が変化) |
許可 | 許可 | 無効 | 無効 |
| スクリプトによるインタラクション (顔をクリックすると笑顔が広がる) |
許可 | 無効(サンドボックスのため) | 無効 | 無効 |
| 実例 |
|
SVG は特定のファイル形式や文書型ではなく、 文書オブジェクトモデル (DOM) の観点から定義される。 したがって、SVG コンテンツについては、 この仕様への適合性は、 コンテンツが適合 DOM であるか、適合 DOM を生成できるかによって定義される。 以下の適合クラスの一部は、コンテンツが 整形式 XML [xml] であるかどうかに依存する。
指定された要素をルートとする DOM ノードツリーまたはサブツリーは、 この文書で説明される仕様 (Scalable Vector Graphics (SVG) 仕様)に従う SVG 文書フラグメントを形成する場合、 適合 SVG DOM サブツリーである。 具体的には、次の条件を満たす。
SVG 文書フラグメントは、 XML の名前空間 [xml-names] で説明されている XML 名前空間機能を使用して親 XML 文書内に含めることができる。 ただし、適合 SVG DOM サブツリーは ‘svg’ 要素をルートとして持たなければならないため、 SVG 名前空間の個別の非 ‘svg’ 要素を使用することは許可されない。したがって、次の文書の SVG 部分は 適合していない。
<?xml version="1.0" standalone="no"?>
<!DOCTYPE SomeParentXMLGrammar PUBLIC "-//SomeParent" "http://SomeParentXMLGrammar.dtd">
<ParentXML>
<!-- ParentXML の要素をここに置く -->
<!-- 以下は適合していない -->
<z:rect xmlns:z="http://www.w3.org/2000/svg"
x="0" y="0" width="10" height="10" />
<!-- ParentXML のその他の要素をここに置く -->
</ParentXML>
代わりに、SVG 部分を適合 SVG DOM サブツリーにするため、 ファイルを次のように変更できる。
<?xml version="1.0" standalone="no"?>
<!DOCTYPE SomeParentXMLGrammar PUBLIC "-//SomeParent" "http://SomeParentXMLGrammar.dtd">
<ParentXML>
<!-- ParentXML の要素をここに置く -->
<!-- 以下は適合している -->
<z:svg xmlns:z="http://www.w3.org/2000/svg"
width="100px" height="100px">
<z:rect x="0" y="0" width="10" height="10"/>
</z:svg>
<!-- ParentXML のその他の要素をここに置く -->
</ParentXML>
SVG 言語およびこれらの適合基準は、 SVG コンテンツのいかなる側面にも指定されたサイズ制限を設けない。 要素数、文字データ量、または 属性値内の文字数に最大値はない。
文書または文書の一部は、 文書の MIME 型に適したパーサーによって (ネットワークエラー以外の)エラーなしで解析され、 適合 SVG DOM サブツリーを形成でき、 さらに次の条件を満たす場合、適合 SVG マークアップフラグメントである。
適合 SVG マークアップフラグメントは、 次の条件も満たす場合、 適合 XML 互換 SVG マークアップフラグメントでもある。
<?xml-stylesheet?> 処理命令が
XML 文書へのスタイルシートの
関連付け
[xml-stylesheet] に適合する。
指定された要素をルートとする DOM ノードツリーまたはサブツリーは、 XML にシリアライズしたときに 適合 XML 互換 SVG マークアップ フラグメントを形成できる場合、 適合 XML 互換 SVG DOM サブツリーである。
DOM サブツリーを変更せずに適合 XML にシリアライズできない場合、 例えば ‘id’ 値が 有効な XML 名でない場合や、 Comment ノードのデータに 部分文字列 "--" が含まれる場合、そのサブツリーは 適合 XML 互換 SVG DOM サブツリーではない。
文書は、次の条件を満たす場合、適合 SVG スタンドアロンファイルである。
SVG 文書フラグメントが技術的にエラー状態となる さまざまなシナリオがある。
動的文書は時間の経過とともにエラー状態になったり、そこから回復したりすることがある。例えば、 SVG DOM または アニメーションによる文書の変更により、 文書がエラー状態になり、その後の変更によって 文書が再び正しい状態になることがある。
他の節で特定のエラー 型を処理するためのより具体的な規則が定義されていない限り、文書がエラー状態であるときはいつでも、 ユーザーエージェントは次のエラー処理規則を使用しなければならない。
スクリプトによる一連の変更によって、 特定の SVG 文書フラグメントがエラー状態になったり そこから回復したりすることがあるため、ユーザーエージェントは文書の 表示(例えば表示デバイスへのレンダリング)が 更新される時点でのみエラー処理を適用すべきである。
ソフトウェアについては、適合要件は プログラムのカテゴリによって異なる。
ユーザーエージェントの一般的な定義は、 テキスト、グラフィックス、音声、動画、画像、およびその他のコンテンツ型を含む Web コンテンツを取得してレンダリングするアプリケーションである。 ユーザーエージェントは、一部の種類のコンテンツを処理する 追加のユーザーエージェントを必要とする場合がある。例えば、ブラウザーは 音声または動画をレンダリングするために、別の プログラムまたはプラグインを実行する場合がある。ユーザー エージェントには、グラフィカルなデスクトップブラウザー、マルチメディア プレーヤー、テキストブラウザー、音声ブラウザー、およびスクリーンリーダー、拡大鏡、 音声合成装置、オンスクリーンキーボード、音声入力 ソフトウェアなどの支援技術が含まれる。
一般的な意味では、 「ユーザーエージェント」は SVG コンテンツを取得して レンダリングする能力を持つ場合も持たない場合もある。 ただし、文脈上別の解釈が必要でない限り、 この仕様における「ユーザーエージェント」へのすべての言及は、 SVG コンテンツを取得してレンダリングするSVG ユーザーエージェントへの言及であるとみなされる。
多くのプログラムは複数のソフトウェアクラスに該当する。 例えば、SVG ファイルをインポートして表示し、 ユーザーがそれを変更でき、 変更後のグラフィックをファイルへエクスポートできるグラフィカルエディターは、 SVG インタープリター、 SVG ビューアー、 SVG オーサリングツール、 および SVG ジェネレーターである。
適合 SVG ジェネレーターとは、 次の条件を満たすSVG ジェネレーターである。
SVG ジェネレーターには、 既定で Unicode 文字エンコーディングを使用し、 World Wide Web の文字モデルの その他のガイドラインに従うことが強く推奨される [UNICODE] [charmod]。
高精度データを扱う SVG ジェネレーターには、 高精度ジオメトリの生成に関する注記の節の ガイドラインに従うことが推奨される。
オーサリングツールアクセシビリティ ガイドライン 2.0で定義される オーサリングツールは、 適合 SVG ジェネレーターであり、 さらに同文書の関連するすべてのレベル A 要件に適合する場合、 適合 SVG オーサリングツールである [atag20]。 レベル AA およびレベル AAA の要件は 推奨されるが、適合のために必須ではない。
適合 SVG サーバーは、適合 SVG
ジェネレーターのすべての要件を満たさなければならない。さらに、HTTP または
Internet Media type を使用するその他のプロトコルを使用する適合 SVG
サーバーは、SVG スタンドアロンファイルをメディア
タイプ "image/svg+xml" で提供しなければならない。
また、SVG ファイルが gzip または deflate で圧縮されている場合、適合 SVG サーバーはプロトコルがサポートする内容に応じて、適切なヘッダーでこれを示さなければならない。 具体的には、転送の直前にサーバーによって圧縮されたコンテンツについて、 サーバーは必要に応じて "Transfer-Encoding: gzip" または "Transfer-Encoding: deflate" ヘッダーを使用しなければならない。 サーバー上に圧縮形式で保存されているコンテンツ(例えばファイル拡張子 .svgz)については、 サーバーは必要に応じて "Content-Encoding: gzip" または "Content-Encoding: deflate" ヘッダーを使用しなければならない。
HTTP では、保存されたコンテンツ(「エンティティ」)の圧縮は、 HTTP/1.1 の TE/ Transfer Encoding で定義される メッセージ本文の自動圧縮とは異なる ([rfc2616]、14.39 節および 14.41 節)。 これが正しく設定されておらず、 HTTP ヘッダーで指定された圧縮が実際に使用される値と一致しない場合、 SVG ユーザーエージェントは文書をエラー状態として 扱う必要がある。
SVG ファイルと SVGZ ファイルの両方を処理するようサーバーを設定するには、 両方の種類のファイルに同じメディアタイプを割り当てられる必要があるが、 圧縮ヘッダーは異ならなければならない。 一般的に使用される一部のサーバーでは、 圧縮動作がメディアタイプに基づいて設定されるため、 この構成を容易または効率的にサポートしていない。
最新の Web サーバーの多くでは、SVGZ ファイルの代わりに非圧縮 SVG ファイルをアップロードする方が簡単な場合が多い。 そのうえで、サーバーに転送用のファイル圧縮を任せ、 将来の要求用にキャッシュさせ、 HTML など他のテキストベースのファイル形式と同じサーバー命令を使用する。 これにより、ファイルを要求するユーザーエージェントがサポートしている場合、 サーバーはより新しい圧縮方式を使用することもできる。
別の方法として、事前圧縮された SVGZ ファイルを 最初に .svg.gz 複合ファイル拡張子を使用するよう名前変更すれば、 Web サーバーが正しく処理できる場合がある。 それでもサーバーは静的 gzip 圧縮ファイルをサポートするよう設定する必要がある。
SVG インタープリターとは、SVG 文書フラグメントを解析および 処理できるプログラムである。SVG インタープリターの例には、 サーバー側のトランスコードツールまたは最適化ツール(例えば SVG コンテンツを変更された SVG コンテンツへ変換するツール)、あるいは解析ツール(例えば、 SVG コンテンツからテキストコンテンツを抽出する ツール、または妥当性チェッカー)がある。 SVG から別のグラフィックス 表現へ変換するトランスコーダー、例えば SVG からラスターへのトランスコーダーは、 ビューアーに該当するため、ビューアーの適合基準も適用される。
適合 SVG インタープリターは、 XML 1.0 [xml] および XML の名前空間 [xml-names] で定義されるすべての XML 構造を解析および処理できなければならない。
適合 SVG インタープリターは、 任意の適合 XML 互換 SVG マークアップフラグメントを、 コンテンツの DOM 構造 (要素、属性、テキストコンテンツ、コメントなど)を正しく尊重する方法で解析しなければならない。 インタープリターは、すべての 機能のセマンティクスを正しく解釈する必要はない。
SVG インタープリターが非 XML 構文(HTML など)をサポートする場合、 その構文内の任意の適合 SVG マークアップフラグメントを正しく解析しなければならない。
SVG インタープリターが SVG コンテンツを処理した結果として スクリプトを実行したり外部リソースファイルを取得したりする場合、 SVG サブリソース文書の処理モード およびリンクの章で ユーザーエージェントについて説明された制限に従わなければならない。
| アクション: | パフォーマンスクラスの
要件を確認し、項目を削除するか一般要件へ移すかを決定する。
(heycam)
CTM の計算では 倍精度を使用すべきことを仕様化する。 (stakagi) |
|---|---|
| 決議: | SVG 2 からパフォーマンスクラスの 要件を削除する。 ( ConformingHighQualitySVGViewers ) |
| 目的: | 製図およびマッピングのユースケースにおける数値精度と、 ユーザーエージェントのパフォーマンスとのトレードオフを調整するため。 |
| 担当者: | heycam, stakagi |
SVG ビューアーとは、SVG 文書フラグメントを解析および処理し、 文書の内容をディスプレイ、プリンター、彫刻機などの何らかの グラフィカル出力媒体にレンダリングできるプログラムである。 したがって、SVG ビューアーは SVG インタープリターでもある (SVG 文書フラグメントを解析および処理できるという点で)が、 正しくレンダリングするという追加要件がある。
適合 SVG ビューアーは、 適合 SVG インタープリターでなければならず、 この章で定義される処理モードの少なくとも 1 つで レンダリング出力をサポートできなければならない。
適合 SVG ビューアーは、その処理モードでサポートされるすべての機能について、 この仕様でユーザーエージェントに示される すべての規範要件を満たさなければならない。
すべての適合 SVG ビューアーに適用しなければならない具体的な基準は次のとおりである。
image/svg+xml の場合、
処理されるためには、整形式の完全な SVG 文書でなければならない。
ビューアーがセキュア処理モードのみをサポートする場合でも、 data URL 参照を処理するために、 これらの画像形式をサポートする必要がある。
低解像度の表示デバイスでは、 アンチエイリアスまたはその他の平滑化方法のサポートが強く推奨される。 これは適合高品質 SVG ビューアーの要件である。
$$
(single)
{\large \rm CTM} =
(single)
\left(
(double)
\left[
\begin{matrix}
a_1 & c_1 & e_1 \\
b_1 & d_1 & f_1 \\
0 & 0 & 1
\end{matrix}
\right]
\cdot
(double)
\left[
\begin{matrix}
a_2 & c_2 & e_2 \\
b_2 & d_2 & f_2 \\
0 & 0 & 1
\end{matrix}
\right]
\right)
$$
$$
(single)
\left[
\begin{matrix}
x_{\rm viewport} \\
y_{\rm viewport} \\
1
\end{matrix}
\right]
=
{\large \rm CTM} \cdot (single)
\left[
\begin{matrix}
x_{\rm userspace} \\
y_{\rm userspace} \\
1
\end{matrix}
\right]
$$
インタラクションを含む 処理モードをサポートする 適合 SVG ビューアーは、次の追加機能をサポートしなければならない。
スクリプト実行を含む 処理モードをサポートする 適合 SVG ビューアーは、次の追加 機能をサポートしなければならない。
ユーザーエージェントが HTML または XHTML の表示 機能を含むか、XML 文書に CSS スタイルプロパティを適用できる場合、 適合 SVG ビューアーは、 HTML または XHTML の ‘img’ 要素や、 ラスター画像リソースを参照できる CSS プロパティ(例えば ‘background-image’)など、 ラスター画像の外部リソースを使用できるあらゆる場所で MIME 型 "image/svg+xml" のリソースをサポートしなければならない。
表示デバイス上のズームと 印刷の両方をサポートするユーザーエージェントについては、 既定の印刷オプションが、 現在の SVG 文書 フラグメントの表示デバイス上の現在の表示を反映した印刷出力を生成することが推奨される (メディア固有のスタイル付けがないと仮定する)。これには、 ユーザーによって行われたズームおよびパン、 アニメーションの現在の状態、および DOM とスクリプティングによるあらゆる文書変更を考慮する。
したがって、ユーザーが表示デバイス上で地図の 特定の領域へズームし、その後ハードコピーを要求した場合、 ハードコピーは表示デバイス上に現れるものと同じ地図の表示を示すべきである。 ユーザーがアニメーションを一時停止して印刷した場合、 ハードコピーは表示デバイス上で現在 一時停止している画像と同じグラフィックスを示すべきである。スクリプティングによって文書から 要素が追加または削除された場合、ハードコピーには 表示に反映されるものと同じ変更が 反映されるべきである。
SVG のアニメーションおよび スクリプティング機能をサポートしないプリンターなどの静的専用デバイスで SVG 文書がレンダリングされる場合、ユーザーエージェントは文書内の すべてのアニメーション要素およびスクリプティング要素を無視し、 残りのグラフィックス要素をこの 仕様の規則に従ってレンダリングしなければならない。
適合 SVG ビューアーが 適合高品質 SVG ビューアーとみなされるためには、 次の追加機能をサポートしなければならない。
スクリプト実行、宣言的アニメーション、またはインタラクションを含む 処理モードをサポートする 適合高品質 SVG ビューアーは、 次の追加機能をサポートしなければならない。
インタラクションを含む 処理モードをサポートする 適合高品質 SVG ビューアーは、 次の追加機能をサポートしなければならない。
SVG 2 のレンダリングモデルは、Compositing and Blending 仕様で定義された規則に従う。
決議: Seattle/Paris 2012 F2F 第 3 日。
担当者: Nikos (Action 3332)。
状態: 完了。
SVG の実装は、この 章で説明されるレンダリングモデルを実装しなければならない。ただし、実装が逸脱してもよい 状況を説明する適合 要件の付録による変更を受ける。 実際には、出力デバイスの制限 (例えば、限られた範囲の色のみがサポートされる場合がある)および正確な数学モデルの実装における実際上の 制限(例えば、現実的な パフォーマンスを得るため曲線を直線で近似する場合、その近似は 適合要件を満たすのに十分な精度であればよい)に基づくばらつきが許容される。
適合 要件の付録は、実際の 実装がこの説明からどの程度逸脱してよいかを説明する。実際には、 実際の実装は、出力デバイスの 制限(例えば、限られた範囲の 色のみがサポートされる場合がある)および正確な数学モデルを実装する上での実際的な制限 (例えば、 現実的なパフォーマンスを得るため曲線を直線で近似する場合、その近似は 適合要件を満たすのに十分な精度であればよい)により、 わずかに逸脱してもよい。
SVG 文書の最終的にレンダリングされた表現の構成要素は、 基礎となる文書モデル内の 要素と一対一の関係にはない。 代わりに、グラフィックの外観は、 一部の要素が除外され、他の要素が反復される並行した構造、 すなわちレンダリングツリーを反映する。
SVG 名前空間内の多くの要素は、 グラフィカル文書の構成要素を直接表現しない。 代わりに、それらはグラフィカル効果、メタデータ、 他の要素を表現するために使用されるコンテンツ、 または特定の条件下で表示される代替コンテンツを定義する。 動的文書では、グラフィックの特定の構成要素が、 インタラクションまたはアニメーションに応じてレンダリングされたりされなかったりすることがある。 これらのレンダリングされない要素は、 レンダリングツリーに直接含まれない。
SVG はグラフィカルなサブコンポーネントの再利用をサポートするため、 一部の要素は複数回レンダリングされる。 個々のレンダリングにはコンテキスト依存のスタイルが適用される場合があり、 異なるスケールまたは変換でラスタライズされる場合がある。
レンダリングツリーとは、 SVG 文書フラグメント内でレンダリングされる要素の集合である。 これは文書ツリーから、 レンダリングされない要素を除外し、 再利用される グラフィックス用の追加フラグメントを挿入することで生成される。 グラフィックスはレンダリングツリーの順序で描画および合成されるが、 paint-order プロパティに基づく 並べ替えの影響を受ける。 視覚的なペイントを持たない要素もレンダリングツリー内に存在する場合があることに注意すること。
現在の文書の レンダリングツリー内に直接の表現を持つ要素。 use 要素のシャドウツリー内の要素の、レンダリングされたインスタンスを含む。 再利用されるグラフィックスのソース定義としてレンダリングに影響を与えるが、 それ自体は直接レンダリングされない 要素は含まない。 レンダリングされる要素とレンダリングされない要素を参照
現在の文書の レンダリングツリー内に直接の表現を持たない要素。 それでも、再利用されるグラフィックス またはグラフィカル効果としてレンダリングツリーに影響を与える場合がある。 レンダリングされる要素とレンダリングされない要素を参照。
レンダリングツリーに含まれるが、 文書モデル内に単一の直接対応する要素を 持たないグラフィカル構成要素。 これらはシャドウ DOM 要素を通じて表現される場合があり (‘use’ 要素で再利用されるグラフィックスの場合など)、 またはグラフィカル効果の一部として生成される画像フラグメントとして (パターンやマスクの場合など)表現される場合がある。
コンテキストや display スタイル 値にかかわらず、決して直接レンダリングされない任意の要素型。 これには次の要素が含まれる。 ‘clipPath’、 ‘defs’、‘desc’、‘linearGradient’、‘marker’、 ‘mask’、 ‘metadata’、 ‘pattern’、 ‘radialGradient’、‘script’、 ‘style’ および ‘title’。 また、use 要素のシャドウツリーのインスタンスルートではない ‘symbol’ 要素も含まれる。
グラフィック、コンテナー、テキスト、音声、またはアニメーションとして、 レンダリングツリー内に直接の表現を持つことができる 任意の要素型。 これには次の要素が含まれる。 ‘a’、‘circle’、‘ellipse’、 ‘foreignObject’、‘g’、‘image’、‘line’、‘path’、‘polygon’、 ‘polyline’、 ‘rect’、‘svg’、‘switch’、‘text’、‘textPath’、 ‘tspan’ および ‘use’。 また、use 要素のシャドウツリーのインスタンスルートである ‘symbol’ 要素も含まれる。
レンダリング可能な要素は、特定の文書または時点で レンダリングされる場合も、されない場合もある。
任意の時点で、すべての SVG 要素 (またはuse 要素のシャドウツリー内の要素インスタンス)は、 レンダリングされるか、レンダリングされないかのいずれかである。 要素が現在レンダリングされているかどうかは、 その視覚的表示だけでなく、インタラクティビティ および幾何学的計算にも影響する。
要素は、次の 5 つの状況のいずれかではレンダリングされない。
none である要素
レンダリングされない要素は、
レンダリングされない要素は、文書のアクセシビリティツリーに表現されない。 それでも文書モデルの一部として残り、 スタイルの継承とカスケードに参加する。
SVG は、通常レンダリングされる要素の可視表示を切り替えるために 2 つのプロパティを使用する。 display と visibility である。 静的文書では同様の視覚的効果を持つものの、 概念的には異なる。
display および visibility の定義については CSS 2.1 仕様を参照。 [CSS2]
display を none に設定すると、 その要素はレンダリングされなくなる。 通常レンダリングされる グラフィックス要素、 テキストコンテンツ要素、 およびコンテナー要素に適用した場合、 display を none に設定すると、 その要素(およびそのすべての子孫)は レンダリングツリーの一部にならない。 display は継承されるプロパティではないことに注意すること。
none 以外の display 値を持つ 要素は通常どおりレンダリングされる。
display プロパティは、
レンダリング可能な要素にのみ適用される。
決して直接レンダリングされない
要素、または条件付き処理に基づいてレンダリングされない要素に
display: none を設定しても
効果はない。
display プロパティは、指定された要素の直接の 処理には影響するが、 他の要素から参照されることを妨げない。 例えば、 ‘path’ 要素に display: none を設定すると、 その要素がキャンバスに直接レンダリングされることはなくなるが、 ‘path’ 要素は引き続き ‘textPath’ 要素から参照でき、 そのジオメトリは パス上のテキスト処理で使用される。
グラフィックス要素または ‘use’ 要素に適用した場合、 visibility を hidden または collapse に設定すると、 その要素は描画されない。 ただし、それでもレンダリングツリーの一部である。 ポインターイベントに反応する場合があり (pointer-events の値による)、 フォーカスを受け取る場合があり(‘tabindex’ の値による)、 境界ボックス計算とクリッピングパスに寄与し、 テキストレイアウトにも影響する。
visibility プロパティがレンダリングに直接影響するのは、 グラフィックス要素、テキスト コンテンツ要素、および テキストコンテンツ要素の子である場合の ‘a’ 要素だけである。 ただし、visibility は継承されるプロパティであるため、 ‘use’ 要素またはコンテナー要素自体には影響しない場合でも、 その継承値は子孫要素に影響することがある。
文書の一部 (または別の文書)で定義されたグラフィカルコンテンツを、 他の要素のレンダリングに使用できる。 レンダリングの観点から、再利用されるグラフィックスには 2 種類ある。
シャドウ DOM 要素は通常の要素と同じ方法でレンダリングされる。 すなわち、ホスト要素(例えば ‘use’ 要素)が コンテナーであり、シャドウコンテンツがその子孫であるかのように扱われる。 シャドウ DOM 要素上のスタイルおよびジオメトリプロパティは、 参照される文書サブツリー内の ソース要素のものとは独立して解決される。 display プロパティは、 ‘symbol’ 要素に適用される特別な規則を除き、 シャドウ要素に通常どおり効果を及ぼす。
ブレンドの目的では、‘use’ 要素は非分離グループを形成する。
これに対し、 グラフィカル効果要素は自己完結した SVG フラグメントを生成し、 スタッキングコンテキスト および分離 グループとして独立にレンダリングされる。 このフラグメントのキャンバスはスケーリングされる グラフィカル効果要素の子コンテンツは、 このキャンバスにレンダリングおよび合成される。 平坦化されたキャンバス全体は、 他のペイントレイヤーとの合成およびブレンド時にベクター画像として扱われる
グラフィカル効果要素の子コンテンツ上の
display プロパティは、
none に設定された場合に通常どおり効果を持ち、
そのサブツリーがレンダリングに使用されないよう除外する。
ただし、グラフィカル効果要素または祖先上の
display: none の値によって
グラフィカル効果自体が変更されることはない。
SVG はレンダリングに「ペインターモデル」を使用する。ペイントは、 連続する操作によって出力デバイスに適用され、 各操作が出力デバイスのある領域に描画し、 以前に描画されたペイントを覆い隠す場合がある。 各オブジェクトまたはグループが描画された後、 次の描画操作の背景の一部となる。 SVG 2 は、各描画操作が背景とどのように相互作用するかを 制御する高度なブレンドモードと合成操作をサポートする。 これらの描画操作を規定する規則は、 Compositing and Blending 仕様で概説されている。
SVG の要素は、 SVG ビューポートの x 軸および y 軸上に配置される。要素が重なる場合、 描画される順序によって、どの要素が前面に表示されるかが決まる。この前後の 順序は z 軸として知られる。
既定では、要素は文書順に描画される。すなわち、 マークアップ内で後に現れる要素は、 先に現れる要素の上に描画される。要素は、 一連の要素をまとめて 1 つの単位として描画する スタッキングコンテキストにグループ化される。
スタッキングコンテキストは、要素が互いの上に描画される 順序と、ポインターイベントのターゲットを決定するときにどの要素が最上位になるかを決定する。 DOM ツリー内の要素の位置や、そのサイズまたは方向には影響せず、 描画される順序だけに影響する。
各要素は 1 つのスタッキングコンテキストに属する。指定されたスタッキング コンテキスト内の要素は、文書順に従って積み重ねなければならない。
スタッキングコンテキストは、さらに別のスタッキングコンテキストを含むことができる。スタッキングコンテキストは、 親スタッキングコンテキストの観点からは不可分である。親が 描画順を決定するとき、子スタッキングコンテキストは単一の 分割不可能な項目として扱われる。外部の要素を、その内部の要素の 間に描画することはできない。
‘foreignObject’ 要素を除き、SVG 要素によって作成された スタッキングコンテキストの背面から 前面への積み重ね順序は次のとおりである。
‘foreignObject’ 要素は CSS の用語で「固定配置の包含ブロック」を作成するため、 ‘foreignObject’ 要素によって作成される スタッキングコンテキストの積み重ね順序に関する規範規則は、 CSS 2.1 の付録 E の規則である。
次の条件のいずれかを満たす場合、SVG 要素にはその子孫のための新しい スタッキングコンテキストを確立しなければならない。プロパティに基づく条件では、 そのプロパティが要素に適用され、指定された計算値を持たなければならない。
| 条件 | 値の条件 | 注記 |
|---|---|---|
| 文書要素 | 常に | スタンドアロン SVG 文書の場合のように、‘svg’ 要素である場合のみ |
| 最外部の svg 要素 | 常に | SVG 文書フラグメントを開始する ‘svg’ 要素、すなわち、 親要素が SVG 名前空間にないもの |
| ‘foreignObject’ | 常に | |
| ‘image’ | 常に | |
| ‘marker’ | 常に | |
| ‘mask’ | 常に | mask プロパティではなく mask 要素 |
| ‘pattern’ | 常に | |
| ‘symbol’ | 常に | |
| ‘use’ | 常に | |
| overflow を持つ内部の ‘svg’ | visible 以外の計算値 | 入れ子になった ‘svg’ 要素にのみ適用され、最外部の svg 要素には適用されない。 ユーザーエージェントスタイルシートは、 入れ子になった ‘svg’ 要素に overflow: hidden を設定することに注意すること。 |
| clip プロパティ | auto 以外の計算値 | 要素は明示的なクリッピングの対象となる。SVG では、clip は、 新しい ビューポートを確立する要素、‘pattern’ 要素、および ‘mask’ 要素にのみ適用される。 |
| clip-path プロパティ | none 以外の計算値 | 要素は明示的なクリッピングの対象となる |
| opacity プロパティ | 1 以外の計算値 | |
| mask プロパティ | none 以外の計算値 | mask 要素ではなく mask プロパティ |
| filter プロパティ | none 以外の計算値 | |
| 別の仕様で定義されるプロパティ | その仕様で定義されるとおり | そのプロパティが SVG でスタッキングコンテキストを確立すると定義されている場合 |
個々のグラフィックス要素は非分離グループであるかのように扱われ、 グラフィックス要素を構成する構成要素(塗り、ストロークなど) (図形とテキストの描画を参照)が そのグループのメンバーとなる。グループのレンダリング方法を参照。
‘g’ 要素などのグループ化要素(コンテナー要素を参照
)は、合成グループを作成する。
同様に、‘use’
要素は、そのシャドウコンテンツ用の合成グループを作成する。
Compositing and Blending
仕様は、合成グループをレンダリングする方法を規範的に記述する。
SVG では、グループに効果を適用できる。例えば、不透明度、フィルター、
またはマスキングである。これらの効果は、グループのレンダリング結果に対して、
グループ上の変換が適用される直前に適用され、その変換は、
グループがグループバックドロップと
ブレンドおよび合成される直前に適用される。
このような効果のいずれかをグループに適用すると、その
グループは分離される。
したがって、合成
グループのレンダリングは次の手順に従う。
グループが分離されている場合:
高品質なレンダリングを実現するため、 フィルタープリミティブおよびその他のビットマップ効果は、 演算 座標空間で適用しなければならない。
opacity の定義については、 CSS Color Module Level 3 を参照。[css-color-3]
opacity プロパティは、 指定されたグラフィカル要素またはコンテナー要素が キャンバスに描画されるときの不透明度を指定する。コンテナー要素に適用される場合、 これはグループ不透明度と呼ばれ、 個々のレンダリング要素に適用される場合はオブジェクト 不透明度と呼ばれる。ただし、これら 2 つの操作の原理は 同じである。
SVG には、不透明度に関連する他のプロパティがいくつかある。
これら 4 つの不透明度プロパティは、中間レンダリング操作に関与する。 しかし、オブジェクトおよびグループの不透明度は後処理操作と考えることができる。 概念的には、opacity が適用されるオブジェクトまたはグループは、 RGBA オフスクリーン画像にレンダリングされる。その後、オフスクリーン画像全体が、 指定された opacity 値をオフスクリーン画像全体に 均一に使用してキャンバスへブレンドされる。 したがって、opacity が存在すると、 グループは 分離される。
opacity プロパティは、次の SVG 要素に適用される。 ‘svg’、‘g’、‘symbol’、‘marker’、 ‘a’、‘switch’、‘use’ およびグラフィックス要素。
次の例は、オブジェクトおよびグループ上での opacity プロパティのさまざまな使用方法を示す。
<svg xmlns="http://www.w3.org/2000/svg"
width="600" height="175" viewBox="0 0 1200 350">
<!-- 背景の青い矩形 -->
<rect x="100" y="100" width="1000" height="150" fill="blue"/>
<!-- 不透明からほぼ透明へ変化する赤い円 -->
<circle cx="200" cy="100" r="50" fill="red" opacity="1"/>
<circle cx="400" cy="100" r="50" fill="red" opacity=".8"/>
<circle cx="600" cy="100" r="50" fill="red" opacity=".6"/>
<circle cx="800" cy="100" r="50" fill="red" opacity=".4"/>
<circle cx="1000" cy="100" r="50" fill="red" opacity=".2"/>
<!-- 不透明なグループ、不透明な円 -->
<g opacity="1">
<circle cx="182.5" cy="250" r="50" fill="red" opacity="1"/>
<circle cx="217.5" cy="250" r="50" fill="green" opacity="1"/>
</g>
<!-- グループ不透明度: .5、不透明な円 -->
<g opacity=".5">
<circle cx="382.5" cy="250" r="50" fill="red" opacity="1"/>
<circle cx="417.5" cy="250" r="50" fill="green" opacity="1"/>
</g>
<!-- 不透明なグループ、半透明の緑を赤の上に描画 -->
<g opacity="1">
<circle cx="582.5" cy="250" r="50" fill="red" opacity=".5"/>
<circle cx="617.5" cy="250" r="50" fill="green" opacity=".5"/>
</g>
<!-- 不透明なグループ、半透明の赤を緑の上に描画 -->
<g opacity="1">
<circle cx="817.5" cy="250" r="50" fill="green" opacity=".5"/>
<circle cx="782.5" cy="250" r="50" fill="red" opacity=".5"/>
</g>
<!-- グループ不透明度 .5、半透明の緑を赤の上に描画 -->
<g opacity=".5">
<circle cx="982.5" cy="250" r="50" fill="red" opacity=".5"/>
<circle cx="1017.5" cy="250" r="50" fill="green" opacity=".5"/>
</g>
</svg>
赤と緑の円の各グループは、まずオフスクリーン画像に レンダリングされ、その後、指定された opacity 値を使用して、 背景の青い矩形とグループ全体としてブレンドされる。
この例では、上段の円は不透明度が異なり、 1.0 から 0.2 の範囲である。下段は 5 つの ‘g’ 要素を示し、 それぞれに重なり合う赤と緑の円が次のように含まれている。
SVG は、キャンバスにレンダリングできる 3 つの基本的な グラフィックス要素の種類をサポートする。
図形とテキストは塗りつぶし(すなわち、図形の 内部にペイントを適用)およびストローク(すなわち、図形の 輪郭に沿ってペイントを適用)できる。
特定の種類の図形では、マーカー シンボル(それ自体が図形、 テキスト、画像の任意の組み合わせで構成できる)を、 図形の境界に沿った位置に描画できる。各マーカーシンボルは、 そのグラフィカルコンテンツが、指定されたマーカーシンボルを使用する 図形オブジェクトの直後に SVG 文書ツリーへ展開されたかのように 描画される。マーカー シンボルのグラフィカルコンテンツは、グラフィックス 要素と同じ方法を使用してレンダリングされる。マーカーシンボルはテキストには適用されない。
塗り、ストローク、およびマーカーが描画される順序は、 paint-order プロパティによって決定される。既定では、 最初に塗り、次にストローク、最後に マーカーシンボルが描画される。マーカーシンボルは、 図形の始点から 終点まで、図形の輪郭に沿った順序でレンダリングされる。
塗り操作とストローク操作は完全に独立している。 例えば、各塗り操作またはストローク操作は独自の不透明度設定を持つ。
SVG は、塗り操作およびストローク操作で使用できる 多数の組み込みペイント型をサポートする。これらは ペイントサーバーで説明されている。
ラスター画像がレンダリングされるとき、元のサンプルは、 標準アルゴリズムを使用して「再サンプリング」され、 出力デバイス上で必要な位置にサンプルが生成される。再サンプリングの 要件については、 適合要件で説明する。
HTML [HTML, 10.4.2] と同様に、 同じ絶対 URL と同じ画像 データを持つすべてのアニメーション画像は、グループとして同じタイムラインに同期してレンダリングされ、 タイムラインは、その グループに最後から最も遠い時点で追加されたものの時刻に開始することが期待される。
ユーザーエージェントが、アニメーション画像を表示する img 要素のアニメーションを再開するとき、 その img 要素のノード文書内で、同じ絶対 URL と同じ 画像データを持つすべてのアニメーション画像は、その アニメーションを最初から再開することが期待される。
SVG では、任意の描画操作にフィルターを適用できる。( Filter Effects を参照。)
この場合、結果は、ペイント 操作が、透明な黒で初期化された中間キャンバスに 適用され、そのサイズが Filter Effects で与えられた規則によって決定され、その後 Filter Effects で定義された処理によって フィルタリングされたかのようにならなければならない。
SVG は次のクリッピング/マスキング機能をサポートする。
クリッピングとマスキングの両方は、CSS Masking モジュール [css-masking-1] で指定される。
SVG 文書フラグメントは半透明にできる。
Compositing and Blending 仕様に従い、 ‘svg’ 要素は常に 分離された グループを作成する。 SVG 文書がトップレベル文書、 すなわち別の文書内に埋め込まれていない場合、 ルートの ‘svg’ 要素は ページ グループとみなされ、 不透明度 100% の白いバックドロップと合成される。 その他のすべての場合、SVG 文書または文書フラグメントは、不透明度を保持したまま親 文書へ合成される。
overflow の定義については、 Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) 仕様 [CSS2] を参照。
| 要素 | 初期値 | UA スタイルシート | auto | visible | hidden | scroll |
|---|---|---|---|---|---|---|
| 文書ルートの svg | visible | n/a | visible | scroll | visible | hidden | scroll |
| その他の svg | visible | hidden | visible | scroll | visible | hidden | scroll |
| text | visible | hidden | visible | visible | hidden | hidden |
| pattern | visible | hidden | visible | visible | hidden | hidden |
| marker | visible | hidden | visible | visible | hidden | hidden |
| symbol | visible | hidden | visible | visible | hidden | hidden |
| image | visible | hidden | visible | visible | hidden | hidden |
| foreignObject | visible | hidden | visible | scroll | visible | hidden | scroll |
overflow プロパティは、 CSS 2.1 で 定義されるものと同じ パラメーター値および意味を持つ ([CSS2]、11.1.1 節)。 ただし、次の追加事項が適用される。
属性またはプロパティの初期値とは、その属性またはプロパティが指定されていない場合、 または無効な値を持つ場合に使用される値である。 この値は、レンダリング、アニメーション値の 計算、および DOM インターフェイスを介した属性またはプロパティへのアクセスの目的で 使用される。
この仕様では、属性は次のような属性定義 表によって定義される。
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| exampleattr | <length> | none | none | はい |
値の列には、属性の構文の説明がある。属性の構文を記述する方法は 6 つある。
| SVG 2 要件: | プレゼンテーション属性値の大文字小文字の区別を緩和することを検討する。 |
|---|---|
| 決議: | プロパティ値を大文字小文字を 区別しないようにする。 |
| 目的: | プレゼンテーション属性の構文解析を、対応する CSS プロパティの構文解析に合わせるため。 |
| 担当者: | Cameron (ACTION-3276) |
| 状態: | 完了 |
CSS 値定義構文を使用して定義されたプレゼンテーション属性を 解析する場合、次のように行う。
<number> 記号を挿入することで、 単位なしの長さと角度をプレゼンテーション属性で使用できる一方、 対応するプロパティ値では使用できないようになる。
すべてのプレゼンテーション属性は、 対応する CSS プロパティを参照して定義されるため、 CSS 値定義構文を使用して定義されていることに注意すること。
CSS 値 定義構文を使用して定義されたその他の属性を解析する場合は、 属性定義 表で与えられた文法に従って属性値を解析することで行う。
これにより、このような属性で CSS コメントとエスケープを使用できることに注意すること。 例えば、値 '10\px/**/' は、 ‘rect’ 要素の ‘x’ プレゼンテーション属性で '10px' として正常に解析される。
URL として定義された属性を解析する場合は、 属性の値を input、文書の URL を base として URL パーサーを呼び出すことで行う [URL]。
初期値の列は、属性の初期値を示す。 指定された CSS 値定義構文、 ABNF または EBNF 文法に従った属性の解析に失敗した場合、または URL 標準に従った解析 もしくは属性の解析方法を説明する本文に従った解析が失敗を示す場合、 属性には、指定された初期 値が指定されたものとみなす。
プレゼンテーション属性の初期値は、 対応するプロパティの初期値である。プレゼンテーション属性内で無効な値を使用すると、 初期値が指定されたものとして扱われるため、この値は、ユーザーエージェントスタイルシートなどの 優先度の低いスタイルシート規則から得られる値を上書きできる。
例えば、ユーザーエージェントスタイルシートは、 ‘svg’ 要素の overflow プロパティの値を hidden に設定するが、 overflow="invalid" のような無効なプレゼンテーション属性を指定すると、 overflow を visible に設定する規則となり、 ユーザーエージェントスタイルシートの値を上書きする。
アニメーション可能の列は、 SVG Animation モジュールで定義されている アニメーション要素を使用して 属性をアニメーション化できるかどうかを示す。
別途記載がない限り、SVG 属性内の数値、および SVG 要素に影響を与えると定義されたプロパティ内の数値は、 ホストアーキテクチャがサポートする少なくともすべての有限単精度値を サポートしなければならない。
可能な限り高い精度を提供し、 丸め誤差を防ぐため、座標系変換などの 操作では、より高精度の浮動小数点 記憶および計算を行うことが推奨される。
適合 SVG ビューアーは、 適合基準で説明されるように、その 適合クラスに従って数値計算を実行する必要がある。
一部の数値属性およびプロパティ値には制限された範囲がある。 その他の値はデバイスの能力によって制限される。 別途指定されていない場合、 ユーザーエージェントは範囲外エラーの確認を レンダリング処理のできるだけ遅い段階まで延期しなければならない。 これは特にデバイスの制限にとって重要である。 複合操作では、 範囲外の中間値が生成されても、 最終値は範囲内になる場合があるためである。
スクリプト実行をサポートする適合SVG ビューアーまたはSVG インタープリターは、 この仕様全体で定義される SVG DOM インターフェイスを、 この節に列挙される具体的な要件および依存関係とともに実装しなければならない。
| SVG 2 要件: | DOM を改善する。 |
|---|---|
| 決議: | SVG 2 の SVG DOM を 全般的に改善する。 |
| 目的: | Java 指向を弱めることによって、著者が SVG DOM を使用しやすくする。 |
| 担当者: | Cameron (ACTION-3273) |
| 注記: | SVG 2 DOM Wiki ページを参照。 |
| SVG 2 要件: | SVG パス DOM API を改善する。 |
|---|---|
| 決議: | SVG 2 で SVG パス DOM API を 改善する。 |
| 目的: | SVGPathSegList インターフェイスを整理し、可能であれば Canvas と API を共有する。 |
| 担当者: | Cameron (アクションなし) |
SVG DOM は Web IDL インターフェイスによって定義される。この仕様内のすべての IDL フラグメントは、 Web IDL 仕様で説明されるように、適合 IDL フラグメントに求められるとおりに解釈しなければならない。[WebIDL]
SVG DOM は多数の DOM 仕様を基礎としている。特に次のとおりである。
SVG DOM は HTML および DOM 標準と同様の命名規則に従う ([HTML]、[DOM])。
すべての名前は、1 つ以上の英単語を 連結して単一の文字列を形成するように定義される。プロパティ名または メソッド名は最初のキーワードを小文字で開始し、 その後の各単語は大文字で開始する。例えば、 ファイルが作成された日付などの文書メタ情報を返す プロパティには "fileDateCreated" という名前を付けることができる。
この仕様で定義されるインターフェイス名のほぼすべては "SVG" で始まる。
SVG 名前空間の要素に対応する DOM Element オブジェクトを表す
インターフェイスは、
SVGElementNameElement という形式に従い、ここで ElementName
は先頭文字を大文字にした要素のタグ名である。
したがって、SVGRadialGradientElement
は ‘radialGradient’ 要素のインターフェイスである。
この大文字小文字規則の例外は SVGSVGElement であり、 タグ名全体が大文字になっている。
SVG DOM をサポートする必要がある SVG ソフトウェアはすべて、 SVG 文書 フラグメント用に作成された DOM 要素を 次のように拡張しなければならない。
サポートされる SVG 要素(すなわち、 名前空間 URI が "http://www.w3.org/2000/svg" で、 ローカル名がこの仕様またはソフトウェアが実装する別の仕様で 定義される要素のいずれかである要素)に対応するすべての Element オブジェクトは、要素定義で特定される DOM インターフェイスも 実装しなければならない。
ローカル名がソフトウェアによってサポートされるいずれの仕様で定義された要素にも 一致しない SVG 名前空間内の要素も、 SVGElement インターフェイスを実装しなければならない。
‘rect’ 要素では、 SVGRectElement インターフェイスが 特定されている。これは、名前空間 URI が "http://www.w3.org/2000/svg" で、 ローカル名が "rect" であるすべての Element オブジェクトが SVGRectElement も実装しなければならないことを意味する。
多くの SVG DOM プロパティ(IDL 属性)は、 対応する要素上のコンテンツ属性またはプロパティを 反映する。 これは、コンテンツ属性と IDL 属性が同じ基礎データを表すことを意味する。 例えば、 SVGRectElement 内の SVGAnimatedLength ry は、 関連付けられた ‘rect’ 要素上の ry プレゼンテーション属性を反映する。
この反映を行う方法は IDL 属性の型によって異なる。
概略として、オブジェクトの
baseVal はコンテンツ属性の値を反映するために使用される。
CSS プロパティを反映するオブジェクトの場合、baseVal は
プレゼンテーション属性を反映するために使用される。
この関係はライブであり、属性またはその反映されたプロパティのいずれかが変更された場合、 値を(反映された値の同期の規則に従って) 同期しなければならない。
属性が文書マークアップ内で明示的に指定されていない場合でも、 反映されるオブジェクトはアクセス時に 属性の初期値で初期化される。 属性の初期値が (none) の場合、 オブジェクトは 空の初期値の反映で定義されるように初期化される。 この新しく構築されたオブジェクトは、最初に変更されるまで要素上に 属性を生成しない。対応する 属性に加えられた変更は直ちにオブジェクトに反映される。
lineElement.x1.baseVal にアクセスし
(ここで lineElement は SVGLineElement のインスタンスである)、
‘x1’
属性が文書内で指定されていなかった場合、
返される SVGLength オブジェクトは
値 0 ユーザー単位を表す。
これは属性の初期値が 0 であるためである。
反映されたコンテンツ属性の基底値が変更されるたびに、 反映するオブジェクトは、値が変更された直後に次の手順を実行することによって 同期されなければならない。
反映されたコンテンツ属性を、 任意で特定の値を使用して 再シリアライズする場合、 次の手順を実行しなければならない。
これは、列挙値が何らかの方法で
「unknown」値に設定された場合、コンテンツ属性が
空文字列に設定されることを意味する。
ただし、この unknown 値を
SVGAnimatedEnumeration オブジェクトに直接設定することはできない。
これは、マークアップで設定された未知の属性値を表す。
値は value の型に応じて、 SVGNumber、SVGLength、 SVGPoint または SVGTransform オブジェクト、あるいは DOMString 値となる。
null または空の初期値を反映する SVG DOM 属性を初期化する場合、 この節で定義されるように、 プロパティをそのデータ型に従って初期化しなければならない。 これは、反映されるコンテンツ属性に明示的な値がなく、 属性定義表の初期値が (none) の場合にのみ発生する。
インターフェイスが以下に列挙されていない場合、 オブジェクトの初期化は、そのインターフェイスが含む オブジェクトの値を使用して行わなければならない。例えば、 SVGAnimatedString は 2 つの DOMString メンバーで構成され、 SVGRect は 多数の double で構成される。
textElement.dx.baseVal にアクセスし
(ここで textElement は SVGTextElement のインスタンスである)、
‘dx’
属性が文書内で指定されていなかった場合、
返される SVGLengthList オブジェクトは
空になる。
スクリプトが反映された DOM 属性に、 コンテンツ属性にとっての無効な値(例えば、 非負の数値を必要とする属性に対する負の 数値)を設定した場合、 この仕様で別途示されていない限り、設定時に例外は 発生しないが、指定された文書フラグメントは エラー処理で説明されるように、 技術的にはエラー状態になる。
整数定数を使用して列挙値を反映する DOM 属性は例外である。 これらは、範囲外の整数、 または未知の属性値を表す定数 (0) に設定された場合、 TypeError をスローする。 これは WebIDL 列挙型の動作 [WebIDL] と一致する。
SVG 言語内の要素に直接対応するすべての SVG DOM インターフェイス (例えば ‘path’ 要素の SVGPathElement インターフェイス)は、 SVGElement インターフェイスから派生する。
CSSOM 仕様は、 ‘style’ 属性に HTML 要素と同じ方法でアクセスできるよう、 SVGElement に style IDL 属性を 追加する。
[Exposed=Window] interface SVGElement : Element { [SameObject] readonly attribute SVGAnimatedString className; readonly attribute SVGSVGElement? ownerSVGElement; readonly attribute SVGElement? viewportElement; }; SVGElement includes GlobalEventHandlers; SVGElement includes HTMLOrSVGOrMathMLElement;
className IDL 属性は、 ‘class’ 属性を 反映する。
この属性は非推奨であり、この仕様の 将来のバージョンで削除される可能性がある。著者には 代わりに Element.classList を使用することが推奨される。
SVGElement 上の className 属性は、WebIDL の 継承規則に従って、 Element 上の 対応する属性を上書きする。
ownerSVGElement IDL 属性は、 最も近い祖先の ‘svg’ 要素を表す。 ownerSVGElement を取得すると、 最も近い祖先の ‘svg’ 要素を返す。現在の 要素が最外部の svg 要素である場合は null を 返す。
viewportElement IDL 属性は、 現在の要素に SVG ビューポートを提供する要素を表す。 viewport を取得すると、 SVG ビューポートを確立する最も近い祖先要素を返す。現在の 要素が最外部の svg 要素である場合は null を 返す。
| SVG 2 要件: | マウスイベントが図形の塗りまたはストローク上にあるかどうかを検出する。 |
|---|---|
| 決議: | SVG 2 では、マウスイベントが要素の ストロークまたは塗り上にあるかどうかをより簡単に検出できるようにする。 |
| 目的: | 要素を複製することなく、著者が要素の塗りとストローク上のポインターイベントを 区別できるようにするため |
| 担当者: | Cameron (ACTION-3279) |
| 状態: | 完了。 |
SVGGraphicsElement インターフェイスは、 主な目的がグラフィックスをグループ内に直接レンダリングすることである SVG 要素を表す。
dictionary SVGBoundingBoxOptions {
boolean fill = true;
boolean stroke = false;
boolean markers = false;
boolean clipped = false;
};
[Exposed=Window]
interface SVGGraphicsElement : SVGElement {
[SameObject] readonly attribute SVGAnimatedTransformList transform;
SVGRect getBBox(optional SVGBoundingBoxOptions options = {});
SVGMatrix? getCTM();
SVGMatrix? getScreenCTM();
};
SVGGraphicsElement includes SVGTests;
transform IDL 属性は、 transform プロパティの計算値と、それに対応する ‘transform’ プレゼンテーション属性を 反映する。
getBBox メソッドは、 現在の要素の境界ボックスを計算するために使用される。 getBBox(options) メソッドが呼び出されると、 現在の要素に対して境界ボックスアルゴリズムが 呼び出され、 options 辞書引数の fill、stroke、markers および clipped メンバーを使用して、要素のどの部分を境界ボックスに含めるかを制御し、 要素のユーザー座標系を境界ボックスを返す座標系として使用する。 計算された境界ボックスを定義する、新しく作成された SVGRect オブジェクトを返す。 要素の幾何属性が存在しないか、無効な値(例えば負の幅または高さ)を持つため 要素がレンダリングされない場合は、x、y、 width、および height がすべて 0 に設定された SVGRect を返す。
getCTM メソッドは、 現在の要素の座標系を その SVG ビューポートの座標系へ変換する行列を取得するために使用される。getCTM() が呼び出されると、 次の手順を実行する。
getScreenCTM メソッドは、 現在の要素の座標系を SVG 文書フラグメントの SVG ビューポートの座標系へ 変換する行列を取得するために使用される。 getScreenCTM() が呼び出されると、次の手順を実行する。
これには次が含まれる。
このメソッドは getClientCTM という名前の方が適切であったが、
歴史的な理由により getScreenCTM という名前が維持されている。
インターフェイス SVGGeometryElement は、 等価パスを持つジオメトリによって レンダリングが定義され、 塗りおよびストロークを適用できる SVG 要素を表す。 これにはパスおよび基本図形が含まれる。
[Exposed=Window] interface SVGGeometryElement : SVGGraphicsElement { [SameObject] readonly attribute SVGAnimatedNumber pathLength; boolean isPointInFill(optional DOMPointInit point = {}); boolean isPointInStroke(optional DOMPointInit point = {}); float getTotalLength(); SVGPoint getPointAtLength(float distance); };
isPointInFill メソッドは、 呼び出されたとき、メソッドに渡された point で指定される点が、 要素の座標空間内で、要素の fill-rule プロパティによって示される巻き数 規則により決定される意図されたパスの内側にある場合は true を返し、それ以外の場合は false を返さなければならない。 パス内部の領域を計算するとき、開いたサブパスは、 実際のサブパスには影響を与えずに暗黙的に閉じなければならない。パス自体の上にある点は、パスの内側にあるとみなさなければならない。 返される値は fill-rule を除くあらゆる視覚的 CSS プロパティから独立している。 point 上の x または y プロパティのいずれかが無限大または NaN の場合、 メソッドは false を返さなければならない。現在の要素がレンダリングされない要素であり、UA が 要素のジオメトリを計算できない場合は、 InvalidStateError をスローする。
isPointInFill は、 要素が ‘clipPath’ 要素の子である場合でも、その要素の fill-rule プロパティで示される巻き数 規則を考慮する。
isPointInFill は、SVG の文脈が 許す限り、 CanvasDrawPath ミックスイン上の isPointInPath メソッドと整合している。
isPointInStroke メソッドは、 呼び出されたとき、メソッドに渡された point で指定される点が、 要素の座標空間内で、要素に適用されたストロークの輪郭パスの内部または上にある場合は true を返し、それ以外の場合は false を返さなければならない。 輪郭パスでは、要素のストロークプロパティ stroke-width、 stroke-linecap、stroke-linejoin、stroke-miterlimit、stroke-dasharray、 stroke-dashoffset および vector-effect を考慮しなければならない。 詳細については、 ストロークの形状の 計算および ベクター効果 の節を参照。 返される値は、列挙されたストロークプロパティを除くあらゆる視覚的 CSS プロパティから独立している。 point 上の x または y プロパティのいずれかが無限大または NaN の場合、 メソッドは false を返さなければならない。現在の要素がレンダリングされない要素であり、UA が 要素のジオメトリを計算できない場合は、 InvalidStateError をスローする。
isPointInStroke は、SVG の文脈が 許す限り、 CanvasDrawPath ミックスイン上の isPointInStroke メソッドと整合している。
pathLength IDL 属性は、 ‘pathLength’ コンテンツ属性を 反映する。
getTotalLength メソッドは、 パスの長さを計算するために使用される。getTotalLength() が呼び出されると、ユーザー単位で表したパスの合計長に対する ユーザーエージェントの計算値を返す。現在の要素がレンダリングされない要素であり、UA が パスの合計長を計算できない場合は、 InvalidStateError をスローする。
ユーザーエージェントが計算するパス長では、 ‘pathLength’ 属性を考慮しない。
getPointAtLength メソッドは、 パスに沿った指定された距離の点を返すために使用される。 getPointAtLength(distance) が呼び出されると、次の手順を実行する。
getTotalLength と同様に、 これは ‘pathLength’ 属性を考慮しない。
SVGNumber インターフェイスは主として、 SVGNumberList の一部である <number> 値を表すために使用される。 個々の SVGNumber オブジェクトをスクリプトによって作成することもできる。
SVGNumber オブジェクトは読み取り専用として指定できる。 これは、以下で説明するように、オブジェクトを変更しようとすると例外が スローされることを意味する。 animVal IDL 属性を通じて反映される SVGNumber オブジェクトは常に 読み取り専用である。
SVGNumber オブジェクトは特定の要素に関連付けることができる。関連付けられた要素は、 オブジェクトが属性を反映する場合に、 どの要素のコンテンツ属性を更新するかを決定するために使用される。別途説明されていない限り、 SVGNumber オブジェクトは どの要素にも関連付けられていない。
すべての SVGNumber オブジェクトは、 次の 2 つの モードのいずれかで動作する。
SVGNumber オブジェクトは、 値と呼ばれる内部数値を 保持する。
[Exposed=Window] interface SVGNumber { attribute float value; };
value IDL 属性は 数値を表す。value を取得すると、 SVGNumber の値を返す。
value を設定すると、 次の手順を実行する。
SVGLength インターフェイスは、 <length>、<percentage>、または <number> 値になり得る値を表すために使用される。
SVGLength オブジェクトは読み取り専用として指定できる。 これは、以下で説明するように、オブジェクトを変更しようとすると例外が スローされることを意味する。 animVal IDL 属性を通じて反映される SVGLength オブジェクトは常に 読み取り専用である。
SVGLength オブジェクトは、特定の要素に関連付けることができ、さらに方向性として 水平、垂直、または未指定を指定できる。関連付けられた要素と長さの方向性は、 パーセント値をユーザー単位へ解決するために使用され、またオブジェクトが属性を反映する場合に どの要素のコンテンツ属性を更新するかを決定するためにも使用される。別途 説明されていない限り、SVGLength オブジェクトは どの要素にも関連付けられておらず、 方向性は未指定である。
すべての SVGLength オブジェクトは、 次の 4 つのモードのいずれかで動作する。
SVGLength オブジェクトは、内部に <length>、 <percentage>、または <number> 値を保持し、これをその 値と呼ぶ。
[Exposed=Window] interface SVGLength { // 長さの単位型 const unsigned short SVG_LENGTHTYPE_UNKNOWN = 0; const unsigned short SVG_LENGTHTYPE_NUMBER = 1; const unsigned short SVG_LENGTHTYPE_PERCENTAGE = 2; const unsigned short SVG_LENGTHTYPE_EMS = 3; const unsigned short SVG_LENGTHTYPE_EXS = 4; const unsigned short SVG_LENGTHTYPE_PX = 5; const unsigned short SVG_LENGTHTYPE_CM = 6; const unsigned short SVG_LENGTHTYPE_MM = 7; const unsigned short SVG_LENGTHTYPE_IN = 8; const unsigned short SVG_LENGTHTYPE_PT = 9; const unsigned short SVG_LENGTHTYPE_PC = 10; readonly attribute unsigned short unitType; attribute float value; attribute float valueInSpecifiedUnits; attribute DOMString valueAsString; undefined newValueSpecifiedUnits(unsigned short unitType, float valueInSpecifiedUnits); undefined convertToSpecifiedUnits(unsigned short unitType); };
SVGLength 上で定義される数値の長さ単位型定数は、 SVGLength の値の型を表すために使用される。 それぞれの意味は次のとおりである。
| 定数 | 意味 |
|---|---|
| SVG_LENGTHTYPE_NUMBER | px 単位の値として解釈される、 単位なしの <number>。 |
| SVG_LENGTHTYPE_PERCENTAGE | <percentage>。 |
| SVG_LENGTHTYPE_EMS | em 単位を持つ <length>。 |
| SVG_LENGTHTYPE_EXS | ex 単位を持つ <length>。 |
| SVG_LENGTHTYPE_PX | px 単位を持つ <length>。 |
| SVG_LENGTHTYPE_CM | cm 単位を持つ <length>。 |
| SVG_LENGTHTYPE_MM | mm 単位を持つ <length>。 |
| SVG_LENGTHTYPE_IN | in 単位を持つ <length>。 |
| SVG_LENGTHTYPE_PT | pt 単位を持つ <length>。 |
| SVG_LENGTHTYPE_PC | pc 単位を持つ <length>。 |
| SVG_LENGTHTYPE_UNKNOWN | その他の種類の値。 |
数値の長さ単位型定数を使用することはアンチパターンであり、 SVGLength がサポートする その他の単位または長さ型について新しい定数値が導入されることはない。他の種類の長さが サポートされ使用される場合、SVGLength は SVG_LENGTHTYPE_UNKNOWN 単位型を使用する。このような長さ型で SVGLength のその他のプロパティが どのように動作するかについては以下を参照。
unitType IDL 属性は、 SVGLength の値がどの型の値であるかを表す。 unitType を取得すると、 次の手順を実行する。
例えば、ch 単位を持つ <length>、 または calc() のような非スカラー値の場合、 SVG_LENGTHTYPE_UNKNOWN が返される。
value IDL 属性は、 SVGLength の値をユーザー単位で表す。 value を取得すると、 次の手順を実行する。
value を設定すると、 次の手順を実行する。
valueInSpecifiedUnits IDL 属性は、 SVGLength の値の数値係数を表す。 valueInSpecifiedUnits を取得すると、次の 手順を 実行する。
したがって valueInSpecifiedUnits は '12%' と 12em の両方について 12 を返すが、 calc(12px + 5%) のような非スカラー値については 0 が返される。
valueInSpecifiedUnits を設定すると、次の 手順を 実行する。
valueAsString IDL 属性は、 SVGLength の値を文字列として表す。 valueAsString を取得すると、 次の手順を実行する。
valueAsString を設定すると、 次の手順を実行する。
newValueSpecifiedUnits メソッドは、SVGLength の値を 型付きの方法で設定するために使用される。 newValueSpecifiedUnits(unitType, valueInSpecifiedUnits) が呼び出されると、 次の手順を実行する。
convertToSpecifiedUnits メソッドは、SVGLength の値を 特定の型へ変換するために使用される。 convertToSpecifiedUnits(unitType) が呼び出されると、次の手順を実行する。
SVGAngle インターフェイスは、 <angle> または <number> 値になり得る 値を表すために使用される。
SVGAngle オブジェクトは読み取り専用として指定できる。 これは、以下で説明するように、オブジェクトを変更しようとすると例外が スローされることを意味する。animVal 属性を通じて反映される SVGAngle は常に 読み取り専用である。
SVGAngle オブジェクトは特定の要素に関連付けることができる。関連付けられた要素は、 オブジェクトが属性を反映する場合に、 どの要素のコンテンツ属性を更新するかを決定するために使用される。別途説明されていない限り、 SVGAngle オブジェクトは どの要素にも関連付けられていない。
すべての SVGAngle オブジェクトは、 次の 2 つのモードのいずれかで動作する。
SVGAngle オブジェクトは、 <angle> または <number> の内部値を保持し、これを 値と呼ぶ。
[Exposed=Window] interface SVGAngle { // 角度の単位型 const unsigned short SVG_ANGLETYPE_UNKNOWN = 0; const unsigned short SVG_ANGLETYPE_UNSPECIFIED = 1; const unsigned short SVG_ANGLETYPE_DEG = 2; const unsigned short SVG_ANGLETYPE_RAD = 3; const unsigned short SVG_ANGLETYPE_GRAD = 4; readonly attribute unsigned short unitType; attribute float value; attribute float valueInSpecifiedUnits; attribute DOMString valueAsString; undefined newValueSpecifiedUnits(unsigned short unitType, float valueInSpecifiedUnits); undefined convertToSpecifiedUnits(unsigned short unitType); };
SVGAngle 上で定義される数値の角度単位型定数は、 SVGAngle の値の型を表すために使用される。 それぞれの意味は次のとおりである。
| 定数 | 意味 |
|---|---|
| SVG_ANGLETYPE_UNSPECIFIED | 度単位の値として解釈される 単位なしの <number>。 |
| SVG_ANGLETYPE_DEG | deg 単位を持つ <angle>。 |
| SVG_ANGLETYPE_RAD | rad 単位を持つ <angle>。 |
| SVG_ANGLETYPE_GRAD | grad 単位を持つ <angle>。 |
| SVG_ANGLETYPE_UNKNOWN | その他の種類の値。 |
数値の角度単位型定数を使用することはアンチパターンであり、 SVGAngle がサポートする その他の単位または角度型について新しい定数値が導入されることはない。他の種類の角度がサポートされ 使用される場合、SVGAngle は SVG_ANGLETYPE_UNKNOWN 単位型を使用する。このような角度型で SVGAngle のその他のプロパティが どのように動作するかについては以下を参照。
unitType IDL 属性は、 SVGAngle の値がどの型の値であるかを表す。 unitType を取得すると、 次の手順を実行する。
例えば、turn 単位を持つ <angle> の場合、 SVG_ANGLETYPE_UNKNOWN が返される。
value IDL 属性は、 SVGAngle の値を度単位で表す。 value を取得すると、 次の手順を実行する。
value を設定すると、 次の手順を実行する。
valueInSpecifiedUnits IDL 属性は、 SVGAngle の値の数値係数を表す。 valueInSpecifiedUnits を取得すると、次の 手順を 実行する。
valueInSpecifiedUnits を設定すると、次の 手順を 実行する。
valueAsString IDL 属性は、 SVGAngle の値を文字列として表す。 valueAsString を取得すると、 次の手順を実行する。
valueAsString を設定すると、 次の手順を実行する。
newValueSpecifiedUnits メソッドは、SVGAngle の値を 型付きの方法で設定するために使用される。 newValueSpecifiedUnits(unitType, valueInSpecifiedUnits) が呼び出されると、 次の手順を実行する。
convertToSpecifiedUnits メソッドは、SVGAngle の値を 特定の型へ変換するために使用される。 convertToSpecifiedUnits(unitType) が呼び出されると、次の手順を実行する。
| SVG 2 要件: | SVGList* インターフェイスを他のリスト/配列にもう少し近づける。 |
|---|---|
| 決議: | SVG リスト型に配列形式のインデックス参照、 .length、および .item を追加する。 |
| 目的: | 他の配列型(例えば NodeList)と整合させるため。Opera と Firefox ではすでに実装されている。 |
| 担当者: | Erik (ACTION-2975) |
| 状態: | 完了 |
一部の SVG 属性は値のリストを含む。これらの値を表すため、 必要な要素型ごとに 1 つずつ、いくつかの SVG DOM リスト インターフェイスがある。すなわち、SVGNumberList、SVGLengthList、 SVGPointList、SVGTransformList、および SVGStringList である。 最初の 4 つは、 SVGAnimatedNumberList、SVGAnimatedLengthList、 SVGAnimatedPoints、および SVGTransformList オブジェクトの 基底コンポーネントとアニメーションコンポーネントを表すために使用される。 5 番目の SVGStringList は、 文字列のリストを取る少数の非アニメーション属性を 反映するために使用される。
ほとんどのリストインターフェイスは次の形式を取る。
interface SVGNameList {
readonly attribute unsigned long length;
readonly attribute unsigned long numberOfItems;
undefined clear();
Type initialize(Type newItem);
getter Type getItem(unsigned long index);
Type insertItemBefore(Type newItem, unsigned long index);
Type replaceItem(Type newItem, unsigned long index);
Type removeItem(unsigned long index);
Type appendItem(Type newItem);
setter undefined (unsigned long index, Type newItem);
};
ここで Name はリスト要素の説明的な名前 ("Number"、"Length"、"Point"、"Transform" または "String")であり、Type は リスト要素の IDL 型(SVGNumber、SVGLength、SVGPoint、SVGTransform または DOMString)である。
SVGTransformList インターフェイスは 上記の形式を取るが、 さらに 2 つのメソッドを持つ。
SVGTransformList を除く すべてのリストインターフェイスオブジェクトは、 反映されたコンテンツ属性の基底値を反映する。 SVGTransformList オブジェクトは、 プレゼンテーション属性 (‘transform’、 ‘gradientTransform’ または ‘patternTransform’)を反映する。 すべてのリストインターフェイスオブジェクトは特定の要素に関連付けられる。 SVGLength および類似のオブジェクトとは異なり、 「切り離された」 リストインターフェイスオブジェクトは存在しない。
リストインターフェイスオブジェクトは内部に要素のリストを保持し、 以下の本文では単に「リスト」と呼ぶ。 IDL 属性およびメソッドは、リストの要素を調査および操作するために使用される。 リストは、反映されたコンテンツ属性の変更や コンテンツ属性のアニメーション(または SVGTransformList オブジェクトの場合は、 transform プロパティの計算値の変更)に応じて変更されることもある。
リスト インターフェイスオブジェクトは 読み取り専用として指定できる。これは、以下で説明するように、 オブジェクトを変更しようとすると例外がスローされることを意味する。 animVal IDL 属性を通じて反映されるリストインターフェイス オブジェクトは常に読み取り専用である。
リストインターフェイスオブジェクトは、 次の手順を実行することによって 同期される。
リスト要素オブジェクトを切り離す場合は常に、 リスト要素型に応じて次の手順を実行する。
リスト要素オブジェクトを取り付ける場合は常に、 リスト要素型に応じて次の手順を実行する。
リストインターフェイスオブジェクトの サポートされるプロパティインデックスは、 リストの長さ未満のすべての非負整数の集合である。
length および numberOfItems IDL 属性は リストの長さを表し、取得時には単に リストの長さを返す。
clear メソッドは、 リスト内のすべての項目を削除するために使用される。clear() が呼び出されると、次の手順を実行する。
initialize メソッドは、 リストをクリアし、指定された単一の値を追加するために使用される。 initialize(newItem) が呼び出されると、次の手順を実行する。
getItem メソッドは、 リスト内の指定された位置から項目を取得するために使用される。 getItem(index) が呼び出されると、次の手順を実行する。
リストの要素型が SVGLength などのオブジェクト型の場合、 そのオブジェクトのコピーではなく、 そのオブジェクトへの参照が返されることに注意すること。
insertItemBefore メソッドは、リスト内の特定の位置に要素を挿入するために使用される。 insertItemBefore(newItem, index) が呼び出されると、 次の手順を実行する。
replaceItem メソッドは、 リスト内の既存の項目を新しい項目で置き換えるために使用される。 replaceItem(newItem, index) が呼び出されると、 次の手順を実行する。
removeItem メソッドは、 リストから項目を削除するために使用される。removeItem(index) が呼び出されると、次の手順を実行する。
appendItem メソッドは、 リストの末尾に項目を付加するために使用される。appendItem(newItem) が呼び出されると、次の手順を実行する。
インデックス付きプロパティセッターの動作は、 replaceItem メソッドの動作と同じである。
SVGNumberList インターフェイスは、 要素が SVGNumber オブジェクトである リストインターフェイスである。 SVGNumberList オブジェクトは 数値のリストを表す。
[Exposed=Window] interface SVGNumberList { readonly attribute unsigned long length; readonly attribute unsigned long numberOfItems; undefined clear(); SVGNumber initialize(SVGNumber newItem); getter SVGNumber getItem(unsigned long index); SVGNumber insertItemBefore(SVGNumber newItem, unsigned long index); SVGNumber replaceItem(SVGNumber newItem, unsigned long index); SVGNumber removeItem(unsigned long index); SVGNumber appendItem(SVGNumber newItem); setter undefined (unsigned long index, SVGNumber newItem); };
SVGNumberList のすべてのインターフェイスメンバーの動作は、 上記のリストインターフェイスの節で 定義されている。
SVGLengthList インターフェイスは、 要素が SVGLength オブジェクトである リストインターフェイスである。 SVGLengthList オブジェクトは 長さのリストを表す。
[Exposed=Window] interface SVGLengthList { readonly attribute unsigned long length; readonly attribute unsigned long numberOfItems; undefined clear(); SVGLength initialize(SVGLength newItem); getter SVGLength getItem(unsigned long index); SVGLength insertItemBefore(SVGLength newItem, unsigned long index); SVGLength replaceItem(SVGLength newItem, unsigned long index); SVGLength removeItem(unsigned long index); SVGLength appendItem(SVGLength newItem); setter undefined (unsigned long index, SVGLength newItem); };
SVGLengthList のすべてのインターフェイスメンバーの動作は、 上記のリストインターフェイスの節で 定義されている。
SVGStringList インターフェイスは、 要素が DOMString 値である リストインターフェイスである。 SVGStringList オブジェクトは 文字列のリストを表す。
[Exposed=Window] interface SVGStringList { readonly attribute unsigned long length; readonly attribute unsigned long numberOfItems; undefined clear(); DOMString initialize(DOMString newItem); getter DOMString getItem(unsigned long index); DOMString insertItemBefore(DOMString newItem, unsigned long index); DOMString replaceItem(DOMString newItem, unsigned long index); DOMString removeItem(unsigned long index); DOMString appendItem(DOMString newItem); setter undefined (unsigned long index, DOMString newItem); };
SVGStringList のすべてのインターフェイスメンバーの動作は、 上記のリストインターフェイスの節で 定義されている。
次のインターフェイスは、アニメーション可能なコンテンツ属性の
反映された値を表すために使用される。
それぞれが同じデータを表す 2 つのコンポーネントオブジェクト、
baseVal および animVal で構成される。
baseVal(基底値)オブジェクトは変更可能であり、
対応する属性値を更新できる。
SVG 1.1 では、SVG DOM インターフェイスの animVal 属性は、
反映された属性の現在のアニメーション値を表していた。このバージョンの SVG では、
animVal は現在のアニメーション値を表さなくなり、代わりに
baseVal の別名となる。
SVGAnimatedBoolean オブジェクトは、 boolean 値を取るアニメーション可能な属性を 反映するために使用される。
[Exposed=Window] interface SVGAnimatedBoolean { attribute boolean baseVal; readonly attribute boolean animVal; };
baseVal および animVal IDL 属性は、 どちらも反映された属性の現在の非アニメーション値を表す。 baseVal または animVal を取得すると、 次の手順を実行する。
baseVal を設定すると、 値が true の場合は反映された属性を "true" に設定し、それ以外の場合は "false" に 設定する。
SVGAnimatedEnumeration オブジェクトは、 キーワード値を取るアニメーション可能な属性(例えば ‘textPath’ 上の ‘method’ 属性)を反映するため、または アニメーション可能な属性が持つ値の型を反映するため (これは ‘marker’ 要素の ‘orient’ 属性に対する orientType IDL 属性でのみ行われる)に使用される。
[Exposed=Window] interface SVGAnimatedEnumeration { attribute unsigned short baseVal; readonly attribute unsigned short animVal; };
キーワード値のみを取る アニメーション可能な属性を反映する SVGAnimatedEnumeration オブジェクトでは、 baseVal および animVal IDL 属性は、 反映された属性の現在の非アニメーション値を表す。 orientType の場合、 これらは反映された ‘orient’ 属性の現在の非アニメーション値の型を表す。 baseVal または animVal を取得すると、 次の手順を実行する。
baseVal を設定すると、 次の手順を実行する。
SVGAnimatedInteger オブジェクトは、 整数値を取るアニメーション可能な属性(例えば ‘feTurbulence’ 上の ‘numOctaves’)を 反映するために使用される。 また、整数の後に任意の第 2 の整数を取る アニメーション可能な属性(例えば ‘feConvolveMatrix’ 上の ‘order’)の 一部分を反映するためにも使用される。
この SVGAnimatedInteger インターフェイスは この仕様では使用されないが、 Filter Effects 仕様では多数使用されている。
[Exposed=Window] interface SVGAnimatedInteger { attribute long baseVal; readonly attribute long animVal; };
単一の整数値を取る アニメーション可能な属性を反映する SVGAnimatedInteger オブジェクトでは、 baseVal および animVal IDL 属性は、 反映された属性の現在の非アニメーション値を表す。 整数の後に任意の第 2 の整数を取る属性の 1 つの整数を反映するものについては、2 つの整数の一方の 現在の非アニメーション値を表す。 baseVal または animVal を取得すると、 次の手順を実行する。
例えば、‘order’ の定義では、暗黙の第 2 の整数は明示的な 最初の整数と同じであるとされている。
baseVal を設定すると、 次の手順を実行する。
SVGAnimatedNumber オブジェクトは、 数値を取るアニメーション可能な属性(例えば ‘path’ 上の ‘pathLength’)を 反映するために使用される。また、 数値の後に任意の第 2 の数値を取る アニメーション可能な属性(例えば ‘feDiffuseLighting’ 上の ‘kernelUnitLength’)の 一部分を反映するためにも使用される。
[Exposed=Window] interface SVGAnimatedNumber { attribute float baseVal; readonly attribute float animVal; };
単一の数値を取る アニメーション可能な属性を反映する SVGAnimatedNumber オブジェクトでは、 baseVal および animVal IDL 属性は、 反映された属性の現在の非アニメーション値を表す。 数値の後に任意の第 2 の数値を取る属性の 1 つの数値を反映するものについては、2 つの数値の一方の 現在の非アニメーション値を表す。 baseVal または animVal を取得すると、 次の手順を実行する。
例えば、‘kernelUnitLength’ の定義では、暗黙の第 2 の数値は明示的な 最初の数値と同じであるとされている。
baseVal を設定すると、 次の手順を実行する。
SVGAnimatedLength オブジェクトは、 (a) <length>、 <percentage> または <number> 値を取るアニメーション可能な属性、 または (b) これらの値のいずれかを取る CSS プロパティと、それに対応する プレゼンテーション属性を 反映するために使用される。
[Exposed=Window] interface SVGAnimatedLength { [SameObject] readonly attribute SVGLength baseVal; [SameObject] readonly attribute SVGLength animVal; };
baseVal および animVal IDL 属性は、 反映されたコンテンツ属性の現在の値を表す。 baseVal または animVal を取得すると、 次の条件を満たす SVGLength オブジェクトを返す。
SVGAnimatedAngle オブジェクトは、 orientAngle IDL 属性を通じて、 ‘marker’ 上のアニメーション可能な ‘orient’ 属性の <angle> 値を 反映するために使用される。
[Exposed=Window] interface SVGAnimatedAngle { [SameObject] readonly attribute SVGAngle baseVal; [SameObject] readonly attribute SVGAngle animVal; };
baseVal および animVal IDL 属性は、 反映された ‘orient’ 属性の現在の非アニメーションの <angle> 値を表す。 baseVal または animVal を取得すると、 次の条件を満たす SVGAngle オブジェクトを返す。
SVGAnimatedString オブジェクトは、 文字列値を取るアニメーション可能な属性を 反映するために使用される。任意で、 第 2 の非推奨属性も追加で反映するよう定義できる。
[Exposed=Window] interface SVGAnimatedString { attribute (DOMString or TrustedScriptURL) baseVal; readonly attribute DOMString animVal; };
baseVal および animVal IDL 属性は、 反映された属性の現在の非アニメーション値を表す。 baseVal または animVal を取得すると、 次の手順を実行する。
SVGURIReference インターフェイス上の href メンバーの場合、 ‘href’ 属性が存在せず、 非推奨の ‘xlink:href’ 属性が 存在する場合はその値が返され、 その他すべての場合は ‘href’ 属性が 返される。
baseVal を設定すると、 次の手順を実行する。
SVG には、まだ完全なスクリプト処理モデルがない。 Trusted Types は、属性および テキスト本体の変更保護が HTML スクリプトのものと同様に動作すると想定している。
SVGURIReference インターフェイス上の href メンバーの場合、 ‘href’ 属性が存在せず、 非推奨の ‘xlink:href’ 属性が 存在する場合はその属性が設定され、 その他すべての場合は ‘href’ 属性が 設定される。
SVGAnimatedRect オブジェクトは、 x、y、width および height によって指定される 矩形値を取るアニメーション可能な属性を 反映するために使用される。
この仕様で SVGAnimatedRect として反映される唯一の属性は、 ‘viewBox’ である。
[Exposed=Window] interface SVGAnimatedRect { [SameObject] readonly attribute SVGRect baseVal; [SameObject] readonly attribute SVGRect animVal; };
baseVal および animVal IDL 属性は、反映された属性の現在の非アニメーション矩形値を表す。 baseVal または animVal を取得すると、 SVGRect オブジェクトが 返される。
baseVal または animVal の SVGRect オブジェクトが作成されたとき、および その後、反映されたコンテンツ属性が 追加、削除、または変更されるたびに、次の手順を実行する。
baseVal または animVal の SVGRect オブジェクトの x 座標、 y 座標、 width または height プロパティが変更されるたびに、 コンテンツ属性の値を SVGRect に反映する前のアルゴリズムの一部として 変更される場合を除き、反映された コンテンツ属性を再シリアライズしなければならない。
SVGAnimatedNumberList オブジェクトは、 <number> 値のリストを取る アニメーション可能な属性を反映するために使用される。
[Exposed=Window] interface SVGAnimatedNumberList { [SameObject] readonly attribute SVGNumberList baseVal; [SameObject] readonly attribute SVGNumberList animVal; };
baseVal および animVal IDL 属性は、 反映された属性の現在の非アニメーション値を表す。 baseVal または animVal を取得すると、 反映された属性の基底値を反映する SVGNumberList オブジェクトが返される。
SVGAnimatedLengthList オブジェクトは、 <length>、<percentage> または <number> 値のリストを取る アニメーション可能な属性を反映するために使用される。
[Exposed=Window] interface SVGAnimatedLengthList { [SameObject] readonly attribute SVGLengthList baseVal; [SameObject] readonly attribute SVGLengthList animVal; };
baseVal または animVal IDL 属性は、 反映された属性の現在の非アニメーション値を表す。 baseVal または animVal を取得すると、 反映された属性の基底値を反映する SVGLengthList オブジェクトが返される。
SVGUnitTypes インターフェイスは、 ‘gradientUnits’、 ‘patternContentUnits’ および その他の類似する属性を反映するために使用される、一般的に 使用される定数の集合を定義する。
[Exposed=Window] interface SVGUnitTypes { // 単位型 const unsigned short SVG_UNIT_TYPE_UNKNOWN = 0; const unsigned short SVG_UNIT_TYPE_USERSPACEONUSE = 1; const unsigned short SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2; };
SVGUnitTypes 上で定義される単位型定数は、次の意味を持つ。
| 定数 | 意味 |
|---|---|
| SVG_UNIT_TYPE_USERSPACEONUSE | 'userSpaceOnUse' 属性値に対応する。 |
| SVG_UNIT_TYPE_OBJECTBOUNDINGBOX | 'objectBoundingBox' 属性値に対応する。 |
| SVG_UNIT_TYPE_UNKNOWN | その他の種類の値。 |
SVGTests インターフェイスは、 条件付き処理属性を反映するために使用され、 これらの属性をサポートする要素の他の インターフェイスにミックスインされる。
interface mixin SVGTests {
[SameObject] readonly attribute SVGStringList requiredExtensions;
[SameObject] readonly attribute SVGStringList systemLanguage;
};
requiredExtensions IDL 属性は、 ‘requiredExtensions’ コンテンツ 属性を反映する。
systemLanguage IDL 属性は、 ‘systemLanguage’ コンテンツ属性を 反映する。
SVGFitToViewBox インターフェイスは、 ‘viewBox’ および ‘preserveAspectRatio’ 属性を 反映するために使用され、 これら 2 つの属性をサポートする要素の他のインターフェイスに ミックスインされる。
interface mixin SVGFitToViewBox {
[SameObject] readonly attribute SVGAnimatedRect viewBox;
[SameObject] readonly attribute SVGAnimatedPreserveAspectRatio preserveAspectRatio;
};
viewBox IDL 属性は、 ‘viewBox’ コンテンツ属性を 反映する。
preserveAspectRatio IDL 属性は、 ‘preserveAspectRatio’ コンテンツ 属性を反映する。
SVGURIReference インターフェイスは、 ‘href’ 属性および非推奨の ‘xlink:href’ 属性を反映するために使用される。
interface mixin SVGURIReference {
[SameObject] readonly attribute SVGAnimatedString href;
};
href IDL 属性は、 ‘href’ 属性の値、およびそれをサポートするよう定義されている要素では、 非推奨の ‘xlink:href’ 属性を表す。 href を取得すると、 次の条件を満たす SVGAnimatedString オブジェクトを返す。
SVGAnimatedString インターフェイスは、その baseVal および animVal メンバーを通じて、 ‘href’ が存在せず、 非推奨の ‘xlink:href’ 属性が存在する場合はその属性を反映し、 その他すべての場合は ‘href’ 属性を反映するよう 定義されている。アニメーション要素は、 attributeName='xlink:href' を ‘href’ 属性を対象とする別名として扱う。
SVG 文書フラグメントは、任意の数の SVG 要素で構成され、 ‘svg’ 要素内に含まれる。
SVG 文書フラグメントは、空のフラグメント(すなわち、 ‘svg’ 要素内にコンテンツがないもの)から、非常に単純な SVG 文書フラグメントで、単一の SVG グラフィックス要素 (例えば ‘rect’)を含むもの、さらに 複雑で深く入れ子になった コンテナー要素と グラフィックス要素の集合までさまざまである。
SVG 文書フラグメントは、自己完結した ファイルまたはリソースとして単独で存在でき、その場合 SVG 文書フラグメントは SVG 文書となる。また、フラグメントとしてインラインで 親 HTML または XML 文書内に埋め込むこともできる。
次の例は、単純な SVG コンテンツを親 XML 文書内にフラグメントとしてインラインで埋め込んだものを示す。 XML 名前空間を使用して、‘svg’ および ‘ellipse’ 要素が SVG 名前空間に属することを示している点に注意すること:
<?xml version="1.0" standalone="yes"?>
<parent xmlns="http://example.org"
xmlns:svg="http://www.w3.org/2000/svg">
<!-- 親のコンテンツをここに記述 -->
<svg:svg width="4cm" height="8cm">
<svg:ellipse cx="2cm" cy="4cm" rx="2cm" ry="1cm" />
</svg:svg>
<!-- ... -->
</parent>
この例は、少し複雑な(すなわち、 複数の矩形を含む)スタンドアロンの自己完結した SVG 文書を示す:
<?xml version="1.0" standalone="no"?>
<svg width="5cm" height="4cm" version="1.1"
xmlns="http://www.w3.org/2000/svg">
<desc>4 つの独立した矩形
</desc>
<rect x="0.5cm" y="0.5cm" width="2cm" height="1cm"/>
<rect x="0.5cm" y="2cm" width="1cm" height="1.5cm"/>
<rect x="3cm" y="0.5cm" width="1.5cm" height="2cm"/>
<rect x="3.5cm" y="3cm" width="1cm" height="0.5cm"/>
<!-- ‘rect’ 要素を使用してビューポートの輪郭を表示 -->
<rect x=".01cm" y=".01cm" width="4.98cm" height="3.98cm"
fill="none" stroke="blue" stroke-width=".02cm" />
</svg>
‘svg’ 要素は SVG コンテンツの途中に出現できる。これは SVG 文書フラグメントを 他の SVG 文書フラグメント内に埋め込むための仕組みである。
SVG コンテンツの途中にある ‘svg’ 要素のもう 1 つの用途は、 新しい SVG ビューポートを確立することである。( 新しい SVG ビューポートの確立を参照。)
SVG が XML として解析される場合、 XML における名前空間 勧告 [xml-names] に適合するため、SVG 名前空間 宣言を提供して、すべての SVG 要素が SVG 名前空間に属するものとして識別されるようにしなければならない。
HTML 構文を使用する場合、名前空間は HTML パーサーによって自動的に提供される。
<html> <svg viewBox="0 0 100 100"> <circle cx="50" cy="50" r="50" fill="green"> </svg> </html>
例が示すように、HTML パーサーを使用する場合、‘xmlns’ 属性によって要素が SVG 名前空間にあることを宣言する必要はない。 HTML パーサーは適切な名前空間に SVG 要素を自動的に作成する。
この節では、 文書の動作がどのように DOM の観点から定義されるかについて述べ、さらに HTML パーサーがどのように SVG フラグメントを作成できるかを説明すべきである。
SVG 2 の名前空間は http://www.w3.org/2000/svg であり、
以前のバージョンの SVG と同じである。
SVG が XML として解析される場合に 名前空間宣言を提供する方法として、次のものがある。名前空間接頭辞のない ‘xmlns’ 属性を ‘svg’ 要素に指定でき、これは SVG が既定の名前空間であることを意味する ‘xmlns’ 属性を持つ要素のスコープ内のすべての要素に対して:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"> <rect x="10" y="10" width="80" height="80" fill="green" /> </svg>
‘xmlns’ 属性に名前空間接頭辞が指定されている場合
(例えば、xmlns:svg="http://www.w3.org/2000/svg")、
対応する名前空間は既定の名前空間ではないため、
明示的な名前空間接頭辞を要素に割り当てなければならない:
<svg:svg xmlns:svg="http://www.w3.org/2000/svg" viewBox="0 0 100 100"> <svg:rect x="10" y="10" width="80" height="80" fill="green" /> </svg:svg>
名前空間接頭辞は祖先要素に指定できる( 上の例で示した)。詳細については、 XML における名前空間 勧告 [xml-names] を参照すること。
| SVG 2 要件: | ‘svg’ 要素の変換をサポートする。 |
|---|---|
| 決議: | SVG 2 では ‘svg’ に ‘transform’ を許可する。 |
| 目的: | 著者の 期待に沿って、入れ子になった ‘svg’ 要素に変換を許可するため。 |
| 担当者: | Dirk (アクションなし) |
| 状態: | 完了 |
x および y 属性は、 埋め込まれた ‘svg’ 要素が 配置される矩形領域の左上隅を指定する。 最外部の svg 要素では、 これらの属性は効果を持たない。
最外部の svg 要素では、 width および height 属性は、 SVG 文書フラグメントの固有サイズを指定する。 埋め込まれた ‘svg’ 要素では、 これらは ‘svg’ 要素が配置される 矩形領域のサイズを指定する。 いずれの場合も、auto の計算済みスタイルは 100% と同等として扱われる。
SVG 文書が別の文書のコンポーネントとして参照される可能性がある場合、 著者は多くの場合、 参照される文書の 最外部の svg 要素に ‘viewBox’ 属性を含めようとする。 この属性は、任意の SVG ビューポートに合わせて拡大縮小される SVG 文書を設計する便利な方法を提供する。
‘svg’ 要素は、イベント ハンドラーコンテンツ属性として、イベントハンドラーのうちいくつかを公開する。 Window オブジェクトのものである。また、それらの イベントハンドラー IDL 属性も反映する。
onblur、‘onerror’、onfocus、‘onload’、および ‘onscroll’ イベントハンドラーは、 Window オブジェクトのもので、‘svg’ 要素上で公開され、 SVG 要素が通常サポートする同名の 汎用 イベントハンドラーを置き換える。
‘g’ 要素は、関連する グラフィックス要素をまとめるための コンテナー要素である。
要素のグループには、個々のオブジェクトと同様に、 ‘id’ 属性を使用して名前を付けることができる。名前付きグループは、 アニメーションや再利用可能なオブジェクトなど、いくつかの目的に必要である。
例:
<?xml version="1.0" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg"
version="1.1" width="5cm" height="5cm">
<desc>2 つのグループ、それぞれ 2 つの矩形からなる</desc>
<g id="group1" fill="red">
<rect x="1cm" y="1cm" width="1cm" height="1cm"/>
<rect x="3cm" y="1cm" width="1cm" height="1cm"/>
</g>
<g id="group2" fill="blue">
<rect x="1cm" y="3cm" width="1cm" height="1cm"/>
<rect x="3cm" y="3cm" width="1cm" height="1cm"/>
</g>
<!-- ‘rect’ 要素を使用してビューポートの輪郭を表示 -->
<rect x=".01cm" y=".01cm" width="4.98cm" height="4.98cm"
fill="none" stroke="blue" stroke-width=".02cm"/>
</svg>
‘g’ 要素は他の ‘g’ 要素を任意の深さまで入れ子にして 内部に含めることができる。
SVG では、後で再利用するためにグラフィカルオブジェクトを定義できる。 このため、SVG は URL 参照 構造 [rfc3987] を広範に使用する。 例えば、矩形を線形グラデーションで塗りつぶすには、 ‘linearGradient’ 要素を、 次のように、矩形の fill プロパティの値から 参照できる ‘id’ プロパティを付けて 定義できる:
<linearGradient id="MyGradient">...</linearGradient> <rect style="fill:url(#MyGradient)"/>
グラデーションなど、一部の種類の要素は、それ自体ではグラフィカルな結果を生成しない。そのため、 都合のよい任意の場所に配置できる。ただし、グラフィカルオブジェクトを定義し、 それが直接レンダリングされないようにしたい場合がある。それは他の場所から参照されるためだけに存在する。このため、また 定義したコンテンツを便利にグループ化できるようにするため、SVG は ‘defs’ 要素を提供する。
可能な場合、参照される要素は、 それを使用する要素よりも文書順で前に定義することが推奨される。 参照されるすべての要素を 単一の ‘defs’ 要素内にまとめて ファイルの先頭付近に置くと、 マークアップを読みやすく理解しやすくできる。
‘defs’ 要素は、 参照される要素のための コンテナー要素である。理解しやすさと アクセシビリティのため、 可能な限り、参照される要素は ‘defs’ 内で定義することが推奨される。
‘defs’ のコンテンツモデルは ‘g’ 要素と 同じである。したがって、 ‘g’ の子になれる任意の要素は ‘defs’ の子にもなれ、その逆も同様である。
‘defs’ の子孫である要素は直接レンダリングされない。 ‘defs’ 要素の display 値は、 ユーザーエージェントスタイルシートによって 常に none に設定されなければならず、 この宣言は他のどの CSS 規則またはプレゼンテーション属性よりも重要でなければならない。 ただし、‘defs’ の子孫は 常にソースツリー内に存在するため、 常に他の要素から参照できる。したがって、‘defs’ 要素上の display プロパティの値は、 それらの要素が他の要素から参照されることを妨げない。
‘symbol’ 要素は、 ‘use’ 要素によってインスタンス化できるが直接レンダリングされない グラフィカルテンプレートを定義するために使用される。
‘symbol’ は、 その内部に含まれるグラフィックスのための 入れ子になった座標系を確立する。 シンボルが ‘use’ 要素の 参照される要素としてインスタンス化される場合、 そのため、入れ子になった ‘svg’ 要素と非常によく似た方法でレンダリングされる。
x, y, width, および height ジオメトリプロパティは、 ‘svg’ 要素におけるものと同じ効果を持つ。 ‘symbol’ が ‘use’ 要素によってインスタンス化される場合である。 特に、width および height が auto に計算される場合 (かつ、インスタンス化する ‘use’ 要素上の値によって上書きされていない場合)、 それらは 100% の値として扱われる。
SVG 2 で新しく追加された。 symbol にジオメトリプロパティを指定できるようにすることで、 より一貫したレンダリングモデルが提供され、 著者は各 symbol の既定サイズを設定できる (ただし、‘use’ 要素上の属性によって上書きされる場合がある)。
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| refX | <length> | left | center | right | (none) | はい |
| refY | <length> | top | center | bottom | (none) | はい |
SVG 2 で新しく追加された。地図でよく行われるように、シンボルを 特定の点へ揃えやすくするために追加された。‘marker’ 上の対応する 属性と同様である。
symbol 要素に refX/refY を追加する。決議は Leipzig F2F。 状態: 完了。
marker/symbol の refX/refY に top/center/bottom, left/center/right キーワードを 追加する。決議は London F2F。値は 'background-position' を参考にした。 状態: 完了。
‘refX’ および ‘refY’ 属性は、 シンボルの 参照点を定義し、その点は正確に シンボルの x,y 配置座標に置かれる。 これは x および y プロパティと、‘symbol’ およびその ホスト ‘use’ 要素上の変換の累積効果によって定義される。
キーワード値は、 ‘marker’ 要素上の ‘refX’ および ‘refY’ 属性と 同じ意味を持ち、 該当する方向で 0%, 50%, または 100% に解決される。
他の配置属性とは異なり、 ‘refX’ および ‘refY’ は、 ‘viewBox’ および ‘preserveAspectRatio’ 属性を適用した後のシンボルコンテンツの座標系にあるものとして解釈される。 一方または両方の属性が指定されていない場合、 対応する次元では調整は行われず、 シンボルの矩形ビューポート領域の上辺または左辺 (‘viewBox’ 座標にかかわらず) が x,y 点に配置される。
後方互換性のため、 ‘symbol’ 上で ‘refX’ および ‘refY’ が指定されていない場合の動作は、値 0 を指定した場合とは異なり、 したがって、 ‘marker’ 上で同等の属性が指定されていない場合の動作とも異なる。
同じ文書内で複数 回使用されるグラフィックスに ‘symbol’ 要素を使用すると、構造とセマンティクスが追加される。 ‘symbol’ 要素と密接に関連するものとして ‘marker’ および ‘pattern’ 要素があり、 3 つすべてがグラフィカルコンテンツのコンテナーを定義し、 SVG 内のさまざまな位置とスケールで繰り返しレンダリングできる。 ただし、pattern および marker 内の再利用されるグラフィックスは、 別の要素にグラフィカル効果を提供するのに対し、 ‘symbol’ 内のコンテンツは use 要素のシャドウ ツリー内に、完全にインタラクティブなコンテンツとして埋め込まれる。
ユーザーエージェントスタイルシートは、 ‘symbol’ 要素の overflow プロパティを hidden に設定し、これによって矩形のクリッピング パスがシンボルの SVG ビューポートの境界に作成される。overflow プロパティが上書きされない限り、 シンボル内の SVG ビューポートの外側にはみ出すグラフィックスはクリップされる。
‘symbol’ 要素は 決して直接レンダリングしてはならず、 ‘use’ 要素を使用して 参照できるものとしてのみ使用される。 ユーザーエージェントは、 ‘symbol’ 要素上の display プロパティを none に設定しなければならない。 これは ユーザーエージェントスタイルシートの一部として行われ、 この宣言は他のどの CSS 規則またはプレゼンテーション属性よりも重要でなければならない。
‘symbol’ の生成された インスタンスが、 ‘use’ 要素の直接の 参照される要素である場合、 display プロパティの 計算値は常に inline でなければならない。 つまり、ホスト ‘use’ 要素がレンダリングされるときは常にレンダリングされなければならない。 ユーザーエージェントスタイルシートはここでも、この 宣言が他のどの CSS 規則またはプレゼンテーション属性よりも重要であると定義する。 use 要素のシャドウツリー内で 要素インスタンスを作成するために 複製されるその他の ‘symbol’ は、 シンボル定義として動作し、レンダリングしてはならない。
| SVG 2 要件: | ‘use’ が、 フラグメントを省略することで外部文書のルート要素を参照できるようにする。 |
|---|---|
| 決議: | 特定の要素への参照 要件を緩和し、SVG 2 の use など、適切な場合にはフラグメントを省略することでルート 要素を参照することを意味するようにする。 |
| 目的: | 著者が参照先文書を変更してルート 要素に ID を追加する必要をなくすため。 |
| 担当者: | Cameron (ACTION-3417) |
| 状態: | 完了 |
‘use’ 要素は 別の要素を参照し、そのコピーが 文書内の ‘use’ の代わりにレンダリングされる。 参照される要素は コンテナー要素であってもよく、 その場合、 その要素をルートとする完全な SVG 文書サブツリーのコピーが使用される。
複製されたコンテンツは ‘use’ 要素からスタイルを継承し、 ユーザーイベントのターゲットになり得る。 ただし、これらの複製された 要素インスタンスは参照された ソースとのリンクを維持し、 元の DOM の変更を反映する。 さらに、参照される要素のスコープ内で適用されるすべてのスタイル規則は、 複製された シャドウツリーのスコープ内でも適用される。
x, y, width および height ジオメトリプロパティは、参照される要素の配置を指定する。 width および height 属性は、 参照される要素が ビューポートを定義する場合(すなわち、‘svg’ または ‘symbol’ の場合)にのみ効果を持つ。 その場合、‘use’ 要素の auto 以外の値が、 その要素上の対応するジオメトリプロパティの値を 上書きする。
width または height の負の値は 無効であり、無視しなければならない。 width または height がゼロで、 そのプロパティが 参照される要素に影響する場合、 その要素のレンダリングは無効になる。
x および y プロパティは、 要素のユーザー座標系に影響する。 実装の詳細については、レイアウトの節を参照すること。
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| href | URL [URL] | (none) | はい |
レンダリング用に複製される SVG 文書内の要素/フラグメントへの URL 参照。
‘use’ 要素は、 フラグメントを含まない ‘href’ 値を指定することで、 SVG 文書全体を参照できる。 このような参照は、参照される文書の ルート要素を参照するものとして扱われる。
URL 参照 属性および 非推奨の XLink 属性に定義された共通処理を参照すること。SVG 2 で新しく追加された。 フラグメントのない ‘href’ により、ルート要素に ID があることを保証する必要なく、 SVG 文書全体を参照できる。
ユーザーエージェントは、セキュリティ上の 理由から外部リソース文書を制限してもよい。特に、この仕様では ‘use’ におけるクロスオリジンおよび data URL リソース要求を許可しない。
‘href’ 属性が設定された場合 (または、‘href’ 属性がない場合は、‘xlink:href’ 属性が設定された場合)、 ユーザーエージェントは URL を処理しなければならない。 URL 処理の結果得られるターゲット要素が、‘use’ の 参照される要素である。
URL の解決によって得られる 参照される要素が SVG 要素でない場合、 その参照は 無効であり、‘use’ 要素はエラー状態となる。
参照される要素が ‘use’ 要素の (シャドウを含む)祖先である場合、 これは 無効な循環参照であり、 ‘use’ 要素は エラー状態となる。
それ以外の場合、ユーザーエージェントは、‘use’ 要素のコンテンツとしてレンダリングする 再利用されるグラフィックスの シャドウツリーを生成しなければならない。 これは次の節、use 要素のシャドウツリーで説明する。
未解決または 無効な URL 参照を持つ ‘use’ は レンダリングされない。 境界ボックス計算の目的では、 空のコンテナー要素と同等である。
‘use’ 要素によって生成される 再利用されるグラフィックスは、 シャドウツリーの観点から定義される。 インタラクティビティおよびスタイル継承の観点では、 そのため、SVG における他の種類の 再利用される グラフィックス、 例えば ‘pattern’ および ‘marker’ のコンテンツとは大きく異なる。
シャドウツリー内の要素は、 ‘use’ 要素がコンテナーであり、 それらがその子であるかのようにレンダリングされる。 ただし、SVG 文書オブジェクトモデル (DOM) には、 ‘use’ 要素と その属性のみが含まれる。 SVG DOM には、 ‘use’ 要素の子として要素インスタンスは含まれない。
スクリプティングと文書オブジェクトモデルをサポートするユーザーエージェントは、 この節で説明される use 要素のシャドウツリーを実装し、 dom 仕様 [dom]、 または将来それに代わる仕様に適合しなければならない。 これに対し、動的インタラクティブ処理モードを サポートしないユーザーエージェントでは、 シャドウ DOM のすべての詳細を実装する必要がない場合がある。 ただし、すべてのユーザーエージェントは、再利用されるグラフィックスの レイアウト および スタイル継承と、該当する場合は 宣言的アニメーションが、 シャドウ DOM が実装されている場合と同じ方法でレンダリングされることを保証しなければならない。
‘use’ 要素 およびそのシャドウツリーについて述べる場合、次の定義を適用する:
次の例と図は、‘use’ 要素がグループを参照する場合に、これらの定義が 互いにどのように関係するかを示す:
<svg>
<defs>
<g id="icon">
<circle/>
<rect/>
</g>
</defs>
<use href="#icon"/>
</svg>
‘use’ 要素を含む文書ツリーと、 その use 要素のシャドウツリーとの関係。 青い破線の矢印は、シャドウツリー内の各 要素インスタンスが 参照される文書 サブツリー内の要素の複製であることを示す。 ‘use’ 要素が シャドウホストであり、 インスタンスルートは シャドウルートの直接の子である。
ユーザーエージェントが ‘use’ 要素を正常に解決して 参照される要素を特定した場合、 ユーザーエージェントは、その ‘use’ 要素自体をホストとする use 要素のシャドウツリーを作成しなければならない。 シャドウツリーは、 ‘use’ 要素が 決してレンダリングされない要素の子孫であるため、 条件付き処理のため、 または自身もしくは祖先要素上の display プロパティが none に設定されているためにレンダリングされない場合でも、 作成しなければならない。
シャドウツリー内の各ノードは、 参照される文書サブツリー内の対応する ノードの インスタンスである。 シャドウノードはすべて インスタンスルートの子孫であり、 これは 参照される要素のインスタンスであり、 それ自体が シャドウルートノードの直接の子である。
シャドウツリーはオープン(スクリプトから検査可能)だが、読み取り専用である。
シャドウツリー内の要素、属性、およびその他のノードを直接変更しようとする試みは、
NoModificationAllowedError をスローしなければならない。
use 要素のシャドウツリー内では、 ‘script’ 要素は 不活性である(実行されない)。
以前のバージョンの SVG では、シャドウツリーのコンテンツを SVG グラフィックス要素に制限していた。 この仕様では、有効な任意の SVG 文書サブツリーを 複製できる。 ただし、非グラフィカルコンテンツを複製しても、 通常は視覚的な効果を持たない。
参照される要素が外部ファイル内にある場合、 属性およびスタイルプロパティ内のすべての URL 参照は、 値を 要素インスタンスへコピーする前に、 絶対 URL の生成で説明されるように絶対 URL にしなければならない。 シャドウツリー自体は、それを含む文書と同じ文書ベース URL を 使用する。
ユーザーエージェントは、 参照される文書サブツリーへのすべての変更が シャドウツリーに反映されることを保証しなければならない。 これには、要素、属性、テキスト、およびその他のノードへの変更が含まれる。 さらに、参照されるグラフィックスに対して有効なスタイルシートの変更は、 スタイル継承の節で詳しく説明されるように、 シャドウツリーのスコープ内のスタイルシートの変更にも反映されなければならない。
‘use’ 要素または 参照される要素のいずれかが、 ‘use’ 要素の URL 参照を再び 未解決にするような方法で変更された場合、 その use 要素のシャドウツリー全体が破棄される。
‘use’ が、 別の ‘use’ 要素、またはコンテンツに ‘use’ 要素を含む別の要素を参照する場合、 上で説明したシャドウ DOM の 複製手法は再帰的に適用される。ただし、直接または間接的に要素を 参照して循環依存関係を作成する一連の参照は、無効な循環 参照である。 シャドウツリーによって循環参照が作成される ‘use’ 要素または 要素インスタンスはエラー状態となり、 ユーザーエージェントによってレンダリングされてはならない。
‘use’ 要素上の x, y, width および height プロパティの値は、 再利用されるグラフィックスの配置と、 参照される要素が入れ子になったビューポートを定義する場合の ビューポートサイズの設定に使用される。 ‘use’ 要素に対するこれらのプロパティの効果は、 グラフィックス要素に対する効果、 または CSS ボックスレイアウトにおける効果とは著しく異なる。
x および y プロパティは、 追加の変換 (translate(x,y)、 ここで x および y は対応するプロパティの計算値を表す)を定義し、 ‘use’ 要素に、 他のプロパティで指定された変換の後に 適用される(すなわち、変換リストの右側に追加される)。
歴史的な理由により、 補助変換は、シャドウツリー内の再利用されるコンテンツだけではなく、 ‘use’ 要素自体に適用される。 これは、‘use’ 要素に適用され、 userSpaceOnUse 単位で計算される マスク、クリッピングパス、またはフィルターに使用される座標系に影響する。
変換されていない座標空間で userSpaceOnUse グラフィカル効果を適用しつつ、 x および y を使用してグラフィックスを配置するには、 著者は ‘use’ 要素を ‘g’ 内に入れ子にし、 グラフィカル効果を ‘g’ 要素に適用できる。
‘use’ 要素上の width および height プロパティは、 参照される ‘svg’ または ‘symbol’ 要素上の対応するプロパティの 値を、インスタンス ルート要素上のそのプロパティの使用値を決定するときに上書きする。 ただし、‘use’ 要素上のプロパティの計算値が auto の場合、 そのプロパティは要素インスタンスに対して通常どおり計算される。
したがって、これらのプロパティを使用して、 独自の座標系を定義するグラフィックを、 再利用するたびに拡大縮小できる。 auto が初期値であるため、 ‘use’ 要素上で寸法が明示的に設定されていない場合、 ‘svg’ または ‘symbol’ 上で設定された値が既定値として使用される。
‘use’ 要素上の width および height プロパティは、 参照される要素が 新しいビューポートを確立しない場合、 効果を持たない。 特に、‘use’ 要素自体は新しいビューポートを確立しないため、 再利用されるグラフィックス内のパーセント値の解釈には影響しない。
その他のすべての点では、 use 要素のシャドウツリー内の要素の レンダリングとレイアウトは、 ‘use’ 要素がそのシャドウコンテンツのコンテナーであるかのように行われる。 特に、シャドウツリー内の要素が新しいビューポートを確立しない限り、 ‘use’ 要素が定義される座標系 (累積変換を含む)で描画されなければならない。 これは、パーセント長の解釈と、 userSpaceOnUse 単位を持つグラフィカル効果にも影響する。
use 要素のシャドウツリーは、他のシャドウツリーと同様に、 CSS Scoping モジュール [css-scoping-1] で定義される スタイルのカプセル化を示す。 これは、シャドウツリー内の要素が その ホスト ‘use’ 要素からスタイルを継承する一方で、 外部文書で定義されたスタイル規則は シャドウツリー内の要素にはマッチしないことを意味する。 代わりに、シャドウツリーは独自のスタイルシート一覧を保持し、 その CSS 規則がシャドウツリー内の要素に対してマッチングされる。
プレゼンテーション属性および ‘style’ 属性は、 参照される グラフィックス内の要素から 要素インスタンスへ、 他の属性と同じ方法で複製される。
参照される要素が
‘use’ 要素と同じ文書にある場合、
同じ文書スタイルシートが、
元の文書とシャドウツリーの文書フラグメントの両方に適用される。
メイン文書のスタイルシートへの変更は、
シャドウツリーにも影響する。
文書およびシャドウルート文書フラグメントの
styleSheets プロパティを通じてアクセスされる
StyleSheetList オブジェクトは同一でなければならない。
‘style’ 要素が、
参照される文書サブツリーの一部として
複製される場合、
要素
インスタンス上の styleSheet プロパティは、
参照される文書サブツリー内のソース要素と同じオブジェクトを指す。
参照される要素が 外部文書からのものである場合、 その文書を処理するときに生成されたスタイルシートオブジェクトが シャドウツリーに適用され、それらは読み取り専用である。 スタイルシート内のすべての URL 参照は、 フラグメントのみの参照を含め、 参照される要素を含む文書の URL を基準として 絶対 URL にしなければならない。 ユーザーエージェントは、同じ外部文書を参照するすべてのシャドウツリーで 同じスタイルシートオブジェクトを再利用してもよい。
シャドウツリーをスコープとするスタイル規則は、 通常、メイン文書内の要素には影響できない。 同様に、メイン文書内のスタイル規則は、 継承値を変更することによってのみシャドウツリー要素に影響できる。 ただし、CSS Scoping は、 シャドウツリー内部から ホスト要素をスタイル付けするため、 またはホストのコンテキストの変更に応じて シャドウツリー内のスタイルを調整するための 特別なセレクターを定義している [css-scoping-1]。
シャドウツリーのスコープ内の CSS メディアクエリーは、 対応する「ライト」文書 (すなわち、入れ子になったすべてのシャドウツリーを再帰的に抜けた後、 シャドウツリーのホスト ‘use’ 要素を含む文書)と同じ デバイス機能および寸法を使用して評価される。
ほとんどの場合、
シャドウツリー内の 要素インスタンスは、
参照される文書
サブツリー内のそのソース要素と同じスタイル規則にマッチする。
ただし、CSS 規則が 複合
セレクターを使用して、
祖先または兄弟に基づいて要素にマッチし、
それらの祖先または兄弟がシャドウツリーの一部として複製されていない場合、
その規則は 要素インスタンスにはマッチしなくなる。
同様に、nth-of-type や nth-child などの
子インデックス擬似クラスは、
一方の要素には適用されても、もう一方には適用されない場合がある。
これは、以前のバージョンの SVG で
スタイル複製が定義されていた方法からの変更である。
次の例は、一貫したスタイルマッチング規則と変更された規則の両方を示す。 左側の円は、右側の円を描画するために再利用される。 元の円にはさまざまな方法でスタイルが設定されている:
special の要素の子孫として円にマッチする複合 CSS セレクターを使用して設定される。
SVG 1.1 のスタイル複製モデルでは、 指定値が 元の要素から要素インスタンスへ複製される。 再利用される円は元の円と同じスタイルになるが、 fill 値だけは ‘g’(青)ではなく ‘use’ (オレンジ)から継承される。
SVG 2 で要求されるシャドウ DOM モデルでは、 再利用される円のスタイルは次のように計算される:
special の要素の子孫ではない円の 要素インスタンスには
マッチしない。代わりに、円上の stroke の色はホスト
‘use’ 要素
(紫)から継承される。
したがって、再利用される円は、塗りの色(異なる要素から継承するため)と ストロークの色(複合セレクターがマッチしなくなるため)の両方で元の円と異なる。
<svg xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
width="200" height="100" viewBox="0 0 200 100">
<title>スタイル継承と use 要素</title>
<desc>
2 つの円。そのうち一方はもう一方を異なるスタイルにした複製である。
このファイルは、
SVG 2 のシャドウ DOM スタイルマッチング規則が
SVG 1.1 のスタイル複製規則とは異なる効果を持つ場合の 1 つを示す。
左側の元の円は
青い塗りと
緑のストロークになるはずである。
適合 SVG 1.1 ユーザーエージェントでは、
右側の再利用された円は
オレンジの塗りと緑のストロークになるはずである。
適合 SVG 2 ユーザーエージェントでは、
再利用された円はオレンジの塗りと紫のストロークになるはずである。
いずれの場合も、
ストロークは部分的に透明で、
幅は 20 単位、
円全体の直径 100 単位に対する値である。
</desc>
<style type="text/css">
circle { stroke-opacity: 0.7; }
.special circle { stroke: green; }
use { stroke: purple;
fill: orange; }
</style>
<g class="special" style="fill: blue">
<circle id="c" cy="50" cx="50" r="40"
stroke-width="20" />
</g>
<use xlink:href="#c" x="100" />
</svg>
Use-changed-styles の例
以前のバージョンの SVG では、
動的擬似クラス
(:hover など)が
要素インスタンスにどのように適用されるべきか明確ではなかった。
シャドウツリーモデルでは、このようなすべての擬似クラスが、
ユーザーがどちらの要素とインタラクションしているかに応じて、
要素インスタンスまたは 参照される文書サブツリー内のそのソース要素に対して
独立してマッチングされることを要求する。
‘use’ 要素に 'visibility:hidden' を指定しても、 参照されるコンテンツがレンダリングされないことは保証されない。 display または opacity プロパティとは異なり、 visibility プロパティは コンテナー要素には直接適用されないため、 ‘use’ 要素にも直接適用されない。 visibility は通常継承されるため、 use 要素を非表示にすると多くの場合は子コンテンツも非表示になるが、 必ずしもそうではない。 シャドウツリー内のいずれかのグラフィックス要素に 'visibility:visible' が指定されている場合、その 要素は ‘use’ 要素が 'visibility:hidden' を指定していても表示される。
次の例では、主要なスタイル規則は次のとおりである:
.dark {
visibility: hidden;
}
.eyes {
visibility: visible;
}
svg:hover .dark, svg:focus .dark {
visibility: visible;
}
"dark" class は ‘use’ 要素を含むグループに設定されているため、 再利用されるグラフィックスのすべての部分は、非表示の visibility 設定を継承する。 ただし class が "eyes" のサブツリーでは、visible に再設定される。 グラフィックにホバーまたはフォーカスすると、非表示効果は解除される。
Use-visibility-hidden の例、既定のスタイル
Use-visibility-hidden の例、インタラクティブなスタイル
この例は、‘use’ 要素に指定された他のスタイルプロパティ (fill および stroke)の継承と、 シンボル内の要素が明示的な値を指定している場合 (例えば、ピンク色の鼻と耳、および白い尾)には、それらも使用されないことを示す。
Web Animations API [web-animations-1] および SVG Animations 仕様 [svg-animation] は、 DOM プロパティを直接操作することなく、対象要素上の属性およびスタイルを アニメーション化する非 CSS の方法を定義する (詳細についてはアニメーションの付録を参照)。 これらの機能を実装するユーザーエージェントは、 参照される文書 サブツリー内の要素に適用されるすべてのアニメーションが、 この節で説明するように、 use 要素のシャドウツリー内のその要素のインスタンスにも 適用されることを保証しなければならない。
参照される グラフィックス内の要素上の属性を直接操作することによって作成される スクリプトによるアニメーション (‘style’ 属性またはその IDL プロパティを含む)は、 他の DOM 操作と同じ方法で、シャドウツリー内の 要素インスタンスへ伝播される。
CSS を使用して適用されるアニメーション効果は、 スタイルのスコープと継承の節で 指定された手順に従って、 他のスタイルシート規則とともに複製される。
use 要素のシャドウツリー内のすべてのアニメーションは、 参照される要素が 同じ文書または外部文書のどちらにあるかにかかわらず、 ホスト ‘use’ 要素と 同じ文書タイムラインで動作する。
Web Animations API メソッドを使用して 適用されるアニメーション効果 [web-animations-1]について、 アニメーションのターゲットが 参照される文書サブツリー内の要素であり、 シャドウツリー内に対応する 要素インスタンスがある場合、 ユーザーエージェントは、ソースがその Animation オブジェクトで、 ターゲットがその 要素インスタンスである ShadowAnimation を構築しなければならない。 異なるツリーにその要素の複数のインスタンスがある場合、 それぞれに 1 つずつ、複数のシャドウアニメーションが存在する。
ユーザーエージェントは、シャドウツリーが生成された時点で有効な すべての Web Animations API アニメーション (保留中および凍結されたアニメーションを含む)と、 シャドウツリーが存在している間に適用される新しいアニメーションについて、 このような ShadowAnimation を作成しなければならない。 ユーザーエージェントは CSS アニメーションまたはアニメーション要素について、 ShadowAnimation オブジェクトを作成してはならない (これらは別途複製されるため)。
インターフェイス定義の一部として、 ShadowAnimation は読み取り専用であり、 その sourceAnimation への変更を反映しなければならない。
use 要素のシャドウツリー内の読み取り専用の
要素インスタンス(または擬似要素)を
ターゲットとして新しいアニメーションを直接適用しようとする試みは、
NoModificationAllowedError をスローしなければならない。
参照される文書サブツリー内の要素を対象とする 各 アニメーション 要素 [svg-animation] について、 ユーザーエージェントは、同等のアニメーション要素が use 要素のシャドウツリー内で有効になることを保証しなければならない。 アニメーション要素自体が参照される文書サブツリーの一部である場合、 これはアニメーション要素の 要素インスタンスの作成を通じて 自然に行われる。 それ以外の場合、ユーザーエージェントは、 シャドウツリー内のノードである場合と同じ効果を持つ アニメーション要素の 要素インスタンスを生成しなければならない。 これらの生成されたアニメーション要素の実効文書順は、 参照される文書サブツリー内のソース要素の文書順と同じでなければならない。
各アニメーション要素またはインスタンスは、 ターゲット指定が暗黙的(親要素)か 明示的(要素 ‘id’ への URL 相互参照)かにかかわらず、 同じノードツリー(シャドウまたはライト)内のターゲット要素にのみ影響しなければならない。 このようにして、アニメーション要素と ターゲット要素との一対一の関係が維持される。
‘id’ 属性は、 他の属性と同様に、 ソース要素から 要素インスタンスへ複製される。 これは ‘id’ が一意でなければならないという要件とは競合しない。 複製と元の要素は別々のノードツリー内にあるためである。
文書内またはシャドウツリー内のすべてのアニメーション要素で、 ‘id’ 属性によって識別される別の要素上の イベントに応じて開始または終了するようタイミング指定されているものは、 その ‘id’ を持つ要素の 任意の インスタンスが同じイベントを受信した場合にも 開始または終了しなければならない。 これは、参照される要素上のイベントリスナーが、その要素のインスタンス上のイベントも リッスンする方法と一致する。 use 要素のシャドウツリー内のイベント処理の節で 説明されているとおりである。 この動作は、‘id’ ではなくイベントのみによって 定義されるアニメーションの開始時刻または終了時刻には適用されない (したがって、暗黙的にターゲット要素上のイベントをリッスンする)。 その場合、各アニメーション要素は自身のターゲットによってのみ起動される。
アニメーション要素の インスタンスが シャドウツリー内に生成される時点で、 参照される文書サブツリー内のソース要素に関連付けられた アクティブなアニメーション(凍結されたアニメーションを含む)があり、 そのアニメーションを開始したタイミングイベントが、インスタンスが存在していたならば そのインスタンスも開始していたはずである場合、 要素インスタンスのアニメーションも開始しなければならず、 その開始時刻は、ソース要素のタイミングと一致するよう 文書タイムライン上で遡って調整される。
多くの場合、 この節の要件により、 要素インスタンスとそのソース要素は 同期してアニメーションする。 アニメーションが純粋に時間ベースである場合、 または ‘id’ によって参照される要素上の ユーザーインタラクションに応じて開始および終了する場合がこれに該当する。 ただし、アニメーションが対象要素上の ユーザーインタラクションイベントによって(暗黙的に)起動される場合、 インタラクションイベントを受信した要素または要素インスタンスだけが アニメーションを表示する。
これは以前のバージョンの SVG からの変更であり、 以前は、ユーザーインタラクションにかかわらず、 ソース要素上のすべてのアニメーションを反映することが要求されていたが、 要素インスタンスとのユーザーインタラクションに 応答する方法について明確な指針は提供されていなかった。 この変更により、アニメーション要素で宣言されたインタラクティブなアニメーションが、 インタラクティブな CSS スタイルおよび CSS アニメーションと同じ方法で動作することが保証される。
任意のインスタンスまたは元の要素がイベントを受信したときに すべてのインスタンスに適用されるアニメーションを作成するには、 要素の ‘id’ を明示的に指定する:
<set href="#target" begin="mouseover" ... />
<!-- マウスオーバーされた要素にのみ影響する -->
<set href="#target" begin="target.mouseover" ... />
<!-- id 'target' を持つ要素のすべてのインスタンスに影響する。
すべてのライトおよびシャドウノードツリー内で、
それらのいずれかがマウスオーバーされたとき -->
use 要素のシャドウツリー内の要素は、 DOM イベントをリッスンすることも、そのターゲットになることもできる。 イベントのリターゲティングはカプセル化を提供し、 イベントがシャドウツリーから外へバブリングしてライトツリーへ入るときに、 シャドウ DOM 構造の詳細を隠蔽する。
イベントのリターゲティングは SVG 2 で新しく追加された。 これは Shadow DOM 仕様、 既存の実装、 およびメイン DOM 内の要素のみを考慮する著者の期待との一貫性を提供する。
参照されるグラフィックス内の要素に
定義されたすべてのイベントリスナーは、
use 要素のシャドウツリー内のその要素の各
インスタンス上でも、
同じイベントを同じキャプチャフェーズでリッスンしなければならない。
これには、イベント属性を使用して割り当てられたイベントリスナー
(他の DOM 属性と同様に複製される)と、
addEventListener
メソッドを使用して割り当てられたイベントリスナーの両方が含まれる。
ユーザーエージェントは、各 要素インスタンスの
イベントリスナー一覧が、
参照される文書
サブツリー内のそのソース要素と一致するよう同期されることを保証しなければならない。
use 要素のシャドウツリー内の読み取り専用
要素インスタンスにイベントリスナーを直接割り当てることはできない。
このような要素にイベントリスナーを追加しようとする試みは、
NoModificationAllowedError をスローしなければならない。
use 要素のシャドウツリー内のイベントは、 シャドウツリーの イベントパスおよびイベントリターゲティングアルゴリズム [DOM] に従ってディスパッチおよびバブリングされる。
一般に、use 要素のシャドウ ツリーのイベントパスは、 イベントターゲット要素の祖先から シャドウルートまで、 次に ホスト ‘use’ 要素、 さらに文書ウィンドウまでのそのイベントパスから構成される。 これは、キャプチャフェーズでは、 イベントがウィンドウから通常の文書ツリーを通って ‘use’ 要素へ、 次にシャドウルートオブジェクトへ、 そしてシャドウツリーを下って (または複数のシャドウツリーを再帰的に通って) イベントターゲット要素へ伝播することを意味する。 バブリングフェーズでは、イベントは反対方向に進み、 シャドウツリー要素からシャドウルートへ、 次に ‘use’ 要素とその祖先へ進む。
イベントリターゲティングアルゴリズムにより、
‘use’ 要素
またはその祖先上のイベントリスナーの観点からは、
シャドウツリー内の 要素インスタンスをターゲットとするすべてのイベントが、
代わりに ‘use’
要素自体をターゲットとして持つことが保証される。
イベントが target
と relatedTarget の両方を持ち、
これら両方のプロパティが同じ ‘use’
要素を指すようにリターゲティングされる場合、
イベントはシャドウツリーの外側へまったく伝播しない。
これは例えば、
フォーカスがシャドウツリー内のある要素から別の要素へ移動した場合に発生する。
その他の特定のイベント型も、
それらが作成されたシャドウツリーの外側へ伝播しないよう制約される。
これに対し、イベントがシャドウツリーを通じて伝播している間にイベントを処理する
イベントリスナー
(リスナーが 参照される文書
サブツリー内のソース要素に追加されているため)は、
target が
シャドウツリー内の読み取り専用 要素インスタンスを指す状態で
イベントを受信する。
SVG には ‘switch’ 要素と、 ‘requiredExtensions’ および ‘systemLanguage’ 属性があり、 特定のユーザーエージェントの 能力またはユーザーの言語に応じて代替表示を指定できる。
‘requiredExtensions’ および ‘systemLanguage’ 属性は テストとして機能し、 true または false のいずれかに評価される。‘switch’ は、これらすべての属性のテストが true となる 最初の子をレンダリングする。指定された 属性が指定されていない場合、true 値であると 仮定される。
条件付き処理によって要素が除外された場合、
その要素は display プロパティの使用値が none
であるかのように扱われる。
display プロパティと同様に、条件付き
処理
属性は要素の直接のレンダリングにのみ影響し、
他の要素によって正常に参照されることを
妨げない(例えば ‘use’ を介した参照)。
したがって:
以前のバージョンの SVG には、3 番目の条件付き処理属性
requiredFeatures が含まれていた。
これは、SVG 仕様の一部のみを実装する
ユーザーエージェントに対して、著者がフォールバック動作を提供できるようにすることを意図していた。
残念ながら、この属性の仕様および実装が不十分であったため、
機能サポートのテストとして信頼できないものとなった。
‘switch’ 要素は、 その直接の子要素上の ‘requiredExtensions’ および ‘systemLanguage’ 属性を順番に 評価し、これらの属性が true と評価される最初の子を 処理してレンダリングする。他のすべてはスキップされるため、 レンダリングされない。子要素が ‘g’ などのコンテナー要素である場合、サブツリー全体が 処理/レンダリングされるか、 スキップ/非レンダリングとなる。
SVG では、‘systemLanguage’ 属性を評価するとき、 ‘switch’ 要素の子孫要素の評価 順序は、 SMIL 仕様 [SMIL] で定義される 'allowReorder' 属性が常に 'yes' の値を持つかのようでなければならない。
プロパティ display および visibility の値は、‘switch’ 要素の 処理には影響しないことに注意すること。特に、‘switch’ 要素の子で display を none に設定しても、‘switch’ 要素の処理に関連する true/false テストには影響しない。
‘switch’ 要素は、 ‘script’ および ‘style’ 要素の処理には影響しない。
詳細および例については、 外部 オブジェクト型の埋め込みを参照すること。
‘requiredExtensions’ 属性は、必要な言語拡張のリストを定義する。 言語拡張とは、この仕様で定義される機能セットを 超えるユーザーエージェント内の機能である。各 拡張は URL 参照によって識別される。
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| requiredExtensions | 空白区切りトークンの 集合 [HTML] | (none) | いいえ |
値は、必要な拡張を識別する URL 参照のリストであり、 個々の値は空白で区切られる。指定された すべての拡張がユーザーエージェントによってサポートされているかどうかを決定する。 指定された拡張がすべてサポートされている場合、 属性は true と評価される。それ以外の場合、現在の 要素とその子はスキップされるため、 レンダリングされない。
指定された URL 参照自体に空白が含まれる場合、その空白は エスケープしなければならない。
属性が存在しない場合は、暗黙的に "true" と評価される。null 文字列または空文字列の 値が ‘requiredExtensions’ 属性に 指定された場合、 属性は "false" と評価される。
‘requiredExtensions’ は、 ‘switch’ 要素と組み合わせて使用されることが多い。‘requiredExtensions’ が その他の 状況で使用される場合、指定された 要素をレンダリングするかどうかを切り替える単純なスイッチを表す。
拡張の URL 名には、 "http://example.org/SVGExtensionXYZ/1.0" のようなバージョン 情報を含めるべきであり、これによりスクリプト作成者は 指定された拡張の異なるバージョンを区別できる。
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| systemLanguage | カンマ区切りトークンの 集合 [HTML] | (none) | いいえ |
値は カンマ区切りトークンの 集合であり、それぞれは Language-Tag 値でなければならない。これは BCP 47 [BCP47] で定義される。
値 V を持つ ‘systemLanguage’ 属性を評価するには:
tags を、V を カンマ区切りトークンの 集合 [HTML]として解析した結果とする。
tags から空文字列であるトークンをすべて削除する。
tags が空の場合、false を返す。
user languages を、ユーザーの優先言語の順序付きリストとする。
tags 内の各 tag について、user languages 内の各 user-lang について:
tag が user-lang と ASCII 大文字小文字不区別で 一致する場合、true を返す。
user-lang が tag の ASCII 大文字小文字不区別の 接頭辞であり、その接頭辞の直後の tag 内のコードポイントが U+002D HYPHEN-MINUS (-) の場合、true を返す。
false を返す。
属性が存在しない場合は、暗黙的に "true" と評価される。
この接頭辞マッチング規則の使用は、 言語タグが、あるタグを持つ言語をユーザーが理解する場合に そのタグを接頭辞とするタグを持つすべての言語も 常に理解するような方法で 言語に割り当てられていることを意味するものではない。
接頭辞規則は、そのような場合に単に接頭辞タグを使用できるようにするものである。
実装上の注記: 言語の 優先設定をユーザーに提供する場合、実装者は ユーザーが上記で説明した言語マッチングの詳細に 精通していないという事実を考慮し、 適切な案内を提供すべきである。例えば、ユーザーは "en-gb" を選択すると、イギリス英語が利用できない場合には あらゆる種類の英語文書が提供されると想定する可能性がある。ユーザー 設定を設定するためのインターフェイスは、最適なマッチング動作を得るため "en" を追加するようユーザーを案内すべきである。
複数の対象者を意図するコンテンツでは、 複数の言語を列挙してもよい。例えば、元のマオリ語と英語の バージョンを同時に提示するコンテンツでは、 次のようにする:
<text systemLanguage="mi, en"><!-- コンテンツをここに置く --></text>
ただし、 ‘systemLanguage’ テスト 属性が置かれたオブジェクト内に複数の言語が存在するからといって、 複数の言語利用者を対象としていることを意味するわけではない。 例えば、"A First Lesson in Latin" のような 初心者向け語学入門書は、 明らかに英語を読める利用者を対象としている。この 場合、 ‘systemLanguage’ テスト属性には "en" のみを含めるべきである。
‘switch’ 要素は各子の ‘systemLanguage’ 属性を順番に評価し、最初に一致するものだけをレンダリングする。最後に ‘systemLanguage’ を持たない子を置くと、 包括的なフォールバックとして機能し、ユーザーの言語設定にかかわらず 常にコンテンツが表示される。
<switch> <text systemLanguage="fr" x="10" y="30">Bonjour</text> <text systemLanguage="ja" x="10" y="30">こんにちは</text> <text x="10" y="30">Hello</text> </switch>
言語設定が "fr" のユーザーには "Bonjour" が表示される。"ja" のユーザーには "こんにちは" が表示される。その他のユーザーにはフォールバックの "Hello" が表示される。
接頭辞マッチング規則により、著者は段階的により具体的な 言語バリアントを提供できる。‘switch’ 要素は最初に一致する子をレンダリングするため、より具体的なタグを先に配置すべきである。
<switch> <text systemLanguage="zh-Hans" x="10" y="30">简体中文</text> <text systemLanguage="zh-Hant" x="10" y="30">繁體中文</text> <text systemLanguage="zh" x="10" y="30">中文</text> </switch>
言語設定が "zh-Hans-CN" のユーザーは最初の子に一致する。 "zh-Hans" が "zh-Hans-CN" の ASCII 大文字小文字不区別の 接頭辞であり、その後に "-" が続くためである。 "zh-TW" のユーザーは "zh-Hans" または "zh-Hant" には一致しないが、 "zh" フォールバックに一致する。
オーサリング上の注記: 複数の 代替言語オブジェクトが ‘switch’ 内に含まれ、そのいずれにも 一致しない場合、コンテンツが何も 表示されない状況になる可能性がある。そのため、このような ‘switch’ の最後には、すべての場合に受け入れ可能な "catch-all" 選択肢を含めることが推奨される。
‘systemLanguage’ は、 ‘switch’ 要素と組み合わせて使用されることが多い。 ‘systemLanguage’ がその他の 状況で使用される場合、指定された 要素をレンダリングするかどうかを切り替える単純なスイッチを表す。
‘lang’ 属性に基づく多言語の記述テキスト選択は、 ‘desc’ および ‘title’ 要素の 国際化を可能にするため追加された。
SVG 2 で新しく追加された。'lang' の追加は Rigi Kaltbad 対面会議で決議された。 'desc' および 'title' 要素の数を制限していたテキストを削除した。状態: 完了。
SVG 文書内の任意の コンテナー要素または グラフィックス要素は、 子として 0 個以上の ‘desc’ および/または ‘title’ 要素を持つことができ、 その内容はテキストである。‘desc’ および ‘title’ 要素は グラフィックスの一部として視覚的にレンダリングされない。 ‘title’ および ‘desc’ 要素の display 値は、 ユーザーエージェントスタイルシートによって 常に none に設定されなければならず、 この宣言は他のどの CSS 規則またはプレゼンテーション属性よりも重要でなければならない。
複数の兄弟 ‘desc’
または ‘title’ 要素は、
記述要素またはその祖先上の ‘lang’
属性(または xml:lang
属性)を使用して定義される
異なる言語を持たなければならない。
ユーザーエージェントは、ユーザーが設定した言語設定に最もよく
一致する各型の要素を選択しなければならない。
空文字列の言語タグを持つ記述要素
(言語がないことを示す。例えば絵文字記号からなる代替テキスト)は、
すべてのユーザーに対して最も優先度の低い一致であり、ユーザーが指定したすべての言語設定より下位に順位付けされる。
同等に有効な一致が複数存在する場合、最初の一致を使用すべきである。
'title' または 'desc' のいずれにも一致が存在しない場合、その型の最初の要素を選択しなければならない。
次の例は、HTML 文書内にインラインで配置された、再利用される星アイコンの代替言語タイトルを示す。
この例では、HTML 文書全体に
en(国コードを指定しない英語)が正しく言語指定されていると仮定する。
<svg>
<use href="#star">
<title>お気に入り</title>
<title lang="en-us">Favorite</title>
<title lang="nl">Favoriet</title>
<title lang="">★</title>
</use>
</svg>
最初の title 要素は文書の言語(en)を継承し、
その他は各要素について明示的に言語が宣言されている。
ユーザーの優先言語(提供されたものの中で)がアメリカ英語の場合、アイコンのタイトルは
アメリカ式綴りの "Favorite" となる。
ユーザーの優先言語がオランダ語の場合、アイコンのタイトルは "Favoriet" となる。
ユーザーの優先設定リストで一般的な英語がオランダ語より上位の場合、タイトルは
イギリス式綴りの "Favourite" となる。
ユーザーがオランダ語も英語も理解しない場合、タイトルは星印
文字となる。これは理想的ではないが(ほとんどのスクリーンリーダーはこれを "black
star" のローカライズ版として読み上げる)、代替テキストがまったくないよりはよい。
著者は、多言語の記述テキストをまだ実装していない
SVG 1.1 対応ユーザーエージェントでは、
通常、ユーザー設定にかかわらず各型の最初の要素が選択されることに注意すべきである。
SVG 1.1 ユーザーエージェントは、親の最初の子でない title 要素、
または他の記述要素ではない先行兄弟を持つ desc 要素を
認識できない場合もある。
複数の ‘title’ または ‘desc’ 要素を使用して ローカライズされた情報を提供する機能はリスクがあり、既知の実装は存在しない。
ユーザーエージェントは、選択された 'title' および 'desc' 要素のテキストコンテンツを、 SVG Accessibility API Mappings [SVG-AAM] 仕様で定義される親要素の名前および説明の計算の一部として、 プラットフォームアクセシビリティ API に提供しなければならない。
レンダリングされる要素の直接の子として 'title' または 'desc' 要素を含めることは、そのレンダリングされる要素が グラフィック内で意味的に重要であることを示す。 著者は、また SVG ジェネレーターは、 テキストコンテンツがない、または空白のみのテキストコンテンツしかない 空の 'title' または 'desc' 要素を含めるべきではなく、含めてはならない。 そうすると名前のないオブジェクトが支援技術のユーザーに提示されるためである。
個々のグラフィックス要素がそれ自体では意味を持たない場合、 代替テキストは代わりに、意味のあるオブジェクトを記述する最も近いコンテナー要素に提供すべきである。 著者は、グループ化(‘g’)要素を使用して描画要素を 意味のあるオブジェクトに構造化し、それらのグループに ‘title’ で名前を付けるべきである。 逆に、コンテナーオブジェクトが単にスタイルまたはレイアウトを適用するためだけに使用され、 オブジェクトを定義せず、意味のあるグループ化構造も提供しない場合、 代替テキストは必要ない。
親がレンダリングされない記述テキスト要素は、 著者またはオーサリングツールによって参照情報として使用できる。著者には、このデータが 支援技術を通じてグラフィックを閲覧するエンドユーザーには通常利用できないことが警告される。それでも、 レンダリングされない要素は、 レンダリングされる要素のアクセシブルな名前または説明の一部として参照されることがあり (SVG-AAM で定義される)、 再帰的な計算では参照される要素の記述用子要素が使用される。
description および title 要素には、 標準の XML 機構を使用して名前空間を示すことにより、 他の名前空間のマークアップされたテキストを含めることができる。 ただし、著者はそのようなマークアップに代替テキストの意味を担わせるべきではない。 現在、支援技術に公開することが必須なのはプレーンテキストコンテンツのみである。
HTML パーサーは、‘title’ および ‘desc’ 内のすべてのマークアップを、 HTML フラグメント内のマークアップと同じ方法で扱う。 ほとんどの要素は HTML 名前空間に割り当てられる。
ユーザーエージェントは、‘title’ 内のマークアップを title の視覚的な表示(ツールチップなど)に影響させるために使用してもよいが、 そうする必要はない。
‘title’ 子 要素は、その要素の短い代替テキストを 表す。
リンクでは、これはターゲットリソースのタイトルまたは説明となり得る。画像または描画 オブジェクトでは、グラフィックの短い説明となり得る。インタラクティブなコンテンツでは、 要素を使用するためのラベルまたは指示となり得る。などである。
描画要素に可視ラベルも存在する場合(例えば ‘text’ 要素を使用する場合)、 著者は ‘title’ 要素内に 冗長な情報を提供すべきではない。 代わりに、可視ラベルを描画要素に ‘aria-labelledby’ 属性を使用して関連付けるべきである。
インタラクティブなユーザーエージェントは、‘title’ 要素のプレーンテキストコンテンツを、 プラットフォームの慣例に沿った方法でユーザーインタラクションに応じて利用可能にすべきである。 既存のユーザーエージェントは通常、親要素にホバーしたときの ツールチップとして ‘title’ 要素をレンダリングする。
著者は、スタンドアロン SVG 文書内のルート svg 要素に ‘title’ 子要素を提供すべきである。ユーザーはしばしば文脈から離れて文書を参照するため、 著者は文脈情報を十分に含むタイトルを提供すべきである。したがって、 文脈情報をほとんど提供しない "Introduction" のような タイトルではなく、 "Introduction to Medieval Bee-Keeping" のようなタイトルを提供すべきである。 アクセシビリティ上の理由から、ユーザーエージェントは常に ルート svg 要素の ‘title’ 子要素のコンテンツを ユーザーが利用できるようにすべきである。 ただし、これは通常、入れ子になった SVG およびグラフィックス 要素で使用されるツールチップとは異なる方法、例えばブラウザータブに表示することで行われる。
‘desc’ 要素は、 説明など、要素に関するより詳細なテキスト 情報を表す。これは通常、グラフィックの視覚的外観の説明や、 複雑なウィジェットの機能を説明するための補助など、より詳細な情報を提供するため 支援技術に公開される。通常は他のユーザーには利用できないため、 必須の指示には使用すべきではない。
著者は、‘aria-describedby’ 属性を使用して、可視テキストを含む詳細情報をグラフィックの一部に関連付けてもよい。 (説明される要素または親コンテナー上で) 値は、説明を含む 1 つ以上の SVG または HTML 要素への ID 参照である。 ‘aria-describedby’ 属性は、説明を提供する際、 子の ‘desc’ より優先される。 要素に可視の説明と、補足 情報を提供する子 ‘desc’ 要素の両方がある場合、 著者は 2 つの説明を連結するために、 要素自体の ‘id’ を自身の ‘aria-describedby’ リストに明示的に含めるべきである。
SVG コンテンツに含まれるメタデータは、 ‘metadata’ 要素内で指定すべきである。‘metadata’ の内容は、 他の XML 名前空間の要素であるべきであり、それらの名前空間の要素は XML における名前空間 勧告 [xml-names] に適合する方法で表現されるべきである。
SVG 2 では、メタデータ 要素を特定の方法で構造化するという推奨を削除する。
メタデータコンテンツは直接レンダリングされない。 ‘metadata’ 要素の display 値は、 ユーザーエージェントスタイルシートによって 常に none に設定されなければならず、 この宣言は他のどの CSS 規則またはプレゼンテーション属性よりも重要でなければならない。
次に、SVG 文書にメタデータを含める方法の例を示す。 この例では Dublin Core バージョン 1.1 スキーマを使用する。 (RDF に基づかないものを含め、その他の XML 互換メタデータ言語も 使用できる。)
<?xml version="1.0" standalone="yes"?>
<svg width="4in" height="3in"
xmlns = 'http://www.w3.org/2000/svg'>
<desc xmlns:myfoo="http://example.org/myfoo">
<myfoo:title>これは財務報告書です</myfoo:title>
<myfoo:descr>全体の説明では
<myfoo:emph>myfoo</myfoo:emph> 名前空間のマークアップを使用します。</myfoo:descr>
<myfoo:scene><myfoo:what>widget $growth</myfoo:what>
<myfoo:contains>$three $graph-bar</myfoo:contains>
<myfoo:when>1998 $through 2000</myfoo:when> </myfoo:scene>
</desc>
<metadata>
<rdf:RDF
xmlns:rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs = "http://www.w3.org/2000/01/rdf-schema#"
xmlns:dc = "http://purl.org/dc/elements/1.1/" >
<rdf:Description about="http://example.org/myfoo"
dc:title="MyFoo Financial Report"
dc:description="$three $bar $thousands $dollars $from 1998 $through 2000"
dc:publisher="Example Organization"
dc:date="2000-04-11"
dc:format="image/svg+xml"
dc:language="en" >
<dc:creator>
<rdf:Bag>
<rdf:li>Irving Bird</rdf:li>
<rdf:li>Mary Lambert</rdf:li>
</rdf:Bag>
</dc:creator>
</rdf:Description>
</rdf:RDF>
</metadata>
</svg>
HTML をサポートするユーザーエージェントでは、次の HTML 要素 (HTML 名前空間内)を SVG 文書でサポートしなければならない:
base
要素は、例えばペイントサーバー参照や ‘use’
要素参照を含む、
文書内のすべての URL 値に影響することに注意すること。
ただし、特定のターゲット要素を識別するために
URL 参照を処理する場合、
ユーザーエージェントは常に、生成された絶対 URL を現在の文書ベース URL と比較して、
同一文書 URL 参照であるかどうかを決定しなければならない。
このようにして、同じ文書内の要素へのターゲットフラグメントのみの参照は、
文書ベース URL の変更にかかわらず有効なままとなる。
SVG では、SVG コンテンツ内の任意の場所に 外部名前空間の要素を含めることができる。 一般に、SVG ユーザーエージェントは、 未知の外部名前空間要素を DOM に含めなければならないが、 レンダリングの目的ではそれらを無視して除外する。
注目すべき例外は、埋め込みコンテンツの章の 外部オブジェクト 型の埋め込みで説明されている。
さらに、SVG では任意の SVG 要素上に 外部名前空間の属性を含めることができる。 SVG ユーザーエージェントは 未知の属性を DOM に含めなければならないが、それ以外では 未知の属性を無視すべきである。
著者は、未知の名前空間付き要素および属性が HTML パーサーではそのようには解析されないことに注意すべきである。 代わりに、名前空間接頭辞がタグ名または属性名に含まれ、 要素は親要素の名前空間に、属性は既定の名前空間に配置される。
XML 文書と HTML 文書の両方で一貫した解析結果となる方法で カスタム属性を追加するには、 著者は ‘data-*’ 属性を使用できる。 これらが符号化する情報が文書内の他のどの要素にも関連付けられていない場合、 SVG ‘metadata’ 要素に追加できる。
SVG が外部名前空間を含められる機能は、 次の目的で使用できる:
例えば、ビジネスグラフィックスのオーサリングアプリケーションでは、 SVG 文書内にプライベートデータを含め、 再び読み込んだときにチャート(この場合は円グラフ)を 正しく再構築できるようにしたい場合がある:
<?xml version="1.0" standalone="yes"?>
<svg width="4in" height="3in"
xmlns = 'http://www.w3.org/2000/svg'>
<defs>
<myapp:piechart xmlns:myapp="http://example.org/myapp"
title="地域別売上">
<myapp:pieslice label="北部地域" value="1.23"/>
<myapp:pieslice label="東部地域" value="2.53"/>
<myapp:pieslice label="南部地域" value="3.89"/>
<myapp:pieslice label="西部地域" value="2.04"/>
<!-- その他のプライベートデータをここに置く -->
</myapp:piechart>
</defs>
<desc>このチャートには別の名前空間のプライベートデータが含まれる
</desc>
<!-- ここには円グラフを描画する実際の SVG グラフィックス要素が
入る -->
</svg>
‘id’ 属性は、 すべての SVG 要素で利用できる:
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| id | (以下を参照) | (none) | いいえ |
要素の ID [DOM] を反映しなければならない。 ‘id’ 属性は、 ノードツリー内で一意でなければならず、 空文字列であってはならず、 空白文字を含んではならない。
‘id’ 属性が XML 文書内で有効となるためには、 関連する XML バージョンの仕様で定義された追加要件が適用される。 スタンドアロン SVG 文書は XML 1.0 構文 [xml] を使用し、 有効な ‘id’ 値は XML 名前トークンであると規定されている。 有効な XML 1.0 名には指定された文字(文字、数字、およびいくつかの句読点 記号)のみを含めることができ、 数字、ピリオド (.) 文字、またはハイフンマイナス (-) 文字で始めることはできない。
ユーザーエージェントは、XML の妥当性にかかわらず SVG ファイル内の ‘id’ 値を処理すべきである。
著者は、URL ターゲットフラグメントとして使用したときに SVG view 仕様 または 基本メディアフラグメントとして 解析される ‘id’ 値の使用を避けるべきである。
名前空間に属さない ‘lang’ 属性は、 要素のコンテンツおよび テキストを含む要素の属性の主要言語を指定する。
XML 名前空間内の ‘lang’ 属性は XML [xml] で定義される。
これらの属性が要素から省略されている場合、その要素の言語は、 親要素が存在するならその親要素の言語と同じである。
XML 名前空間内の ‘lang’ 属性は、XML 文書内の SVG 要素で使用してもよい。 名前空間に属さない ‘lang’ 属性と XML 名前空間内の ‘lang’ 属性の 両方が同じ要素に指定されている場合、ASCII 大文字小文字不区別で比較したときに 正確に同じ値を持たなければならない。
名前空間に属さない ‘lang’ 属性と XML 名前空間内の ‘lang’ 属性の両方が要素に設定されている場合、 ユーザーエージェントは XML 名前空間内の ‘lang’ 属性を使用しなければならず、 要素の言語を決定する目的では、 名前空間に属さない ‘lang’ 属性を無視しなければならない。
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| lang | Language-Tag [ABNF] | (none) | いいえ |
‘lang’ 属性は、 要素のコンテンツおよび テキストを含む要素の属性の主要言語を指定する。その値は有効な BCP 47 言語 タグ、 または空文字列でなければならない。属性を空文字列に設定すると、 主要言語が不明であることを示す。 [BCP47]。
| SVG 2 要件: | テキストレイアウトに影響させるための ‘xml:space’ の使用を非推奨とし、 代わりに ‘white-space’ プロパティを使用する。 |
|---|---|
| 決議: | SVG 2 から xml:space を削除し、 SVG 1.1 テストスイートから関連するテストを削除する。 |
| 目的: | CSS と整合させるため。 |
| 担当者: | Chris (ACTION-3004, 完了; および ACTION-3005, 完了) |
| 状態 | 完了。 |
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| xml:space | (以下を参照) | default | いいえ |
文字データ内の空白を 保持するかどうかを指定する非推奨の XML 属性。指定可能な値は、 空白を含まない文字列 'default' および 'preserve' のみである。 Extensible Markup Language (XML) 1.0 勧告 [xml] および SVG における 空白 処理の説明を参照すること。
新しいコンテンツでは、代わりに white-space プロパティを使用すべきである。
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| tabindex | 有効な整数 [HTML] | (none) | いいえ |
このコンテンツ属性により、著者は要素がフォーカス可能かどうか、 順次フォーカスナビゲーションを使用して 到達可能であるべきかどうか、および順次フォーカス ナビゲーションの目的での要素の相対順序を制御できる。
"tab index" という名称は、 フォーカス可能な要素間を移動するために "tab" キーが一般的に使用されることに由来する。 "tabbing" という用語は、順次フォーカスナビゲーションを使用して 到達可能なフォーカス可能要素を順方向に移動することを指す。
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| autofocus | boolean 属性 [HTML] | (none) | いいえ |
このコンテンツ属性により、著者はフォーカス可能な要素が 文書に接続された後にフォーカスされるよう要求できる。詳細については HTML 仕様の autofocus を参照すること。
要素がすでに フォーカス可能でない場合、この属性は効果を持たない。
すべての SVG 要素は、 名前空間に属さず、名前が文字列 "data-" で始まる カスタムデータ 属性をサポートする。 HTML 仕様の カスタムデータ属性の 要件を参照すること。
上記の ARIA 属性のリストは、将来の WAI-ARIA 仕様によって拡張される可能性があることに注意すること。
任意の レンダリング可能な要素には ARIA role 属性を指定できる。 role 属性は レンダリングされない要素では無視される。 属性を指定する場合、その値は要素が属するさまざまな WAI-ARIA ロールを表す 空白区切りトークンの 集合でなければならない。 これらのトークンは、 ロールの定義 ([wai-aria]、5.4 節)および グラフィックスロール ([graphics-aria-1.0]、4 節)で定義される role 値である。
SVG 要素に割り当てられる WAI-ARIA role は、 role 属性を空白で分割したときに生成されるトークンのリスト内で 最初に見つかった有効な role である。 有効な role とは、認識される非抽象 role であり、その 要素型に許可されているものである。
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| role | 空白区切りトークンの 集合 [HTML] | (以下を参照) | いいえ |
‘role’ 属性は、 空白区切りトークンの 集合でなければならず、その値は ロールの定義([wai-aria]、5.4 節)で定義される。
role 値は、要素の目的を定義するために使用される、 空白区切りの機械的に抽出可能な意味情報の集合である。
各 SVG 要素について、‘role’ 属性の 初期値は、対応する SVG 要素の既定の暗黙 ARIA セマンティクスである。
有効かつ有用であるために、多くの要素 role では、 アクセシブルな名前または明示的な 状態およびプロパティ値の 形式で追加情報を提供する必要がある。 アクセシブルな名前は SVG 記述要素 または ARIA 属性を使用して提供できる。 各 role の要件は、その role が定義される場所、例えば WAI-ARIA ([WAI-ARIA])または WAI-ARIA Graphics Module ([graphics-aria-1.0])で示される。
WAI-ARIA の状態およびプロパティ属性は SVG 要素に指定できる。 これらの属性は ARIA の 状態およびプロパティの定義(すべての aria-* 属性) ([wai-aria]、6.6 節)で定義される。
これらの属性を指定する場合、その値は、状態またはプロパティの定義の "Value" 欄にある WAI-ARIA 値型でなければならず、 WAI-ARIA 値型の言語へのマッピングに従い、 SVG マッピングを使用して適切な SVG 値型にマッピングされる ([wai-aria]、10.2 節)。
これらの属性はアニメーション可能である。 アニメーションを使用してグラフィックの状態を変更する場合、 または正しい代替テキストの説明を変更するような方法でコンテンツを変更する場合、 対応する ARIA 状態またはプロパティ属性を更新するために 同じアニメーション方法を使用すべきである。
WAI-ARIA の状態およびプロパティ属性は任意の要素で使用できる。ただし、 常に意味があるとは限らず、そのような場合、ユーザーエージェントは DOM に含める以外の処理を行わないことがある。状態およびプロパティ属性は、 ARIA および SVG Accessibility API Mappings 仕様に 従って処理される。[wai-aria] [svg-aam-1.0]
次の表は、SVG 要素に適用される 既定の暗黙 ARIA セマンティクスを定義する。第 1 列のセルにある各言語機能(要素)は、同じ行の第 2 列のセルに示される ARIA セマンティクス(role、状態、および/またはプロパティ)を暗黙的に持つ。 第 3 列は、どの WAI-ARIA セマンティクス(role、状態、またはプロパティ)が 適用できるか、または適用できないかについての制限を定義する。
多くのグラフィックス要素では、著者が意味的な重要性を示す情報を提供した場合にのみ、 暗黙の role が割り当てられる。 アクセシビリティツリーへの完全な 包含 基準は、 ユーザーエージェント向けに SVG Accessibility API Mappings 仕様 [svg-aam-1.0] で定義される。 著者にとって、意味的な重要性を示す望ましい方法は、要素にアクセシブルな名前を提供することである。 これは直接の子 ‘title’ 要素、 または ‘aria-label’ もしくは ‘aria-labelledby’ 属性によって行える。 著者は、SVG の理解に不可欠な任意のコンテンツ、 特にインタラクティブなコンテンツにアクセシブルな名前を提供するため、 これらの方法のいずれかを使用すべきである。
| 言語機能 | 既定の暗黙 ARIA セマンティクス | 許可される role |
|---|---|---|
| ‘a’ | 要素に有効な href または xlink:href 属性がある場合、
link role。
リンクではない a 要素については、a 要素が text の子孫である場合、
既定のセマンティクスは tspan と同じであり、
それ以外の場合は g と同じである。
|
制限なし |
| ‘circle’ | 要素が 包含基準を満たす場合、
graphics-symbol role、
それ以外の場合は none
|
制限なし |
| ‘clipPath’ | none | role を適用してはならない |
| ‘defs’ | none | role を適用してはならない |
| ‘desc’ | none | role を適用してはならない |
| ‘ellipse’ | 要素が 包含基準を満たす場合、
graphics-symbol role、
それ以外の場合は none
|
制限なし |
| ‘feBlend’ | none | role を適用してはならない |
| ‘feColorMatrix’ | none | role を適用してはならない |
| ‘feComponentTransfer’ | none | role を適用してはならない |
| ‘feComposite’ | none | role を適用してはならない |
| ‘feConvolveMatrix’ | none | role を適用してはならない |
| ‘feDiffuseLighting’ | none | role を適用してはならない |
| ‘feDisplacementMap’ | none | role を適用してはならない |
| ‘feDistantLight’ | none | role を適用してはならない |
| ‘feDropShadow’ | none | role を適用してはならない |
| ‘feFlood’ | none | role を適用してはならない |
| ‘feFuncA’ | none | role を適用してはならない |
| ‘feFuncB’ | none | role を適用してはならない |
| ‘feFuncG’ | none | role を適用してはならない |
| ‘feFuncR’ | none | role を適用してはならない |
| ‘feGaussianBlur’ | none | role を適用してはならない |
| ‘feImage’ | none | role を適用してはならない |
| ‘feMerge’ | none | role を適用してはならない |
| ‘feMergeNode’ | none | role を適用してはならない |
| ‘feMorphology’ | none | role を適用してはならない |
| ‘feOffset’ | none | role を適用してはならない |
| ‘fePointLight’ | none | role を適用してはならない |
| ‘feSpecularLighting’ | none | role を適用してはならない |
| ‘feSpotLight’ | none | role を適用してはならない |
| ‘feTile’ | none | role を適用してはならない |
| ‘feTurbulence’ | none | role を適用してはならない |
| ‘filter’ | none | role を適用してはならない |
| ‘foreignObject’ | 要素が 包含基準を満たす場合、
group role、
それ以外の場合は none
|
制限なし |
| ‘g’ | 要素が 包含基準を満たす場合、
group role、
それ以外の場合は none
|
制限なし |
| ‘image’ | img role |
制限なし |
| ‘line’ | 要素が 包含基準を満たす場合、
graphics-symbol role、
それ以外の場合は none
|
制限なし |
| ‘linearGradient’ | none | role を適用してはならない |
| ‘marker’ | none | role を適用してはならない |
| ‘mask’ | none | role を適用してはならない |
| ‘metadata’ | none | role を適用してはならない |
| ‘mpath’ | none | role を適用してはならない |
| ‘path’ | 要素が 包含基準を満たす場合、
graphics-symbol role、
それ以外の場合は none
|
制限なし |
| ‘pattern’ | none | role を適用してはならない |
| ‘polygon’ | 要素が 包含基準を満たす場合、
graphics-symbol role、
それ以外の場合は none
|
制限なし |
| ‘polyline’ | 要素が 包含基準を満たす場合、
graphics-symbol role、
それ以外の場合は none
|
制限なし |
| ‘radialGradient’ | none | role を適用してはならない |
| ‘rect’ | 要素が 包含基準を満たす場合、
graphics-symbol role、
それ以外の場合は none
|
制限なし |
| ‘script’ | none | role を適用してはならない |
| ‘stop’ | none | role を適用してはならない |
| ‘style’ | none | role を適用してはならない |
| ‘svg’ | graphics-document role |
制限なし |
| ‘switch’ | none | role を適用してはならない |
| ‘symbol’ | 要素がレンダリングされる 要素インスタンスであり、
包含基準を満たす場合、
graphics-object role、
それ以外の場合は none
|
制限なし |
| ‘text’ | group role。
プラットフォーム固有の role マッピングについては、
SVG Accessibility API
Mappings 仕様で定義される
|
制限なし |
| ‘textPath’ | 要素が 包含基準を満たす場合、
group role、
それ以外の場合は none
|
制限なし |
| ‘title’ | none | role を適用してはならない |
| ‘tspan’ | 要素が 包含基準を満たす場合、
group role、
それ以外の場合は none
|
制限なし |
| ‘use’ | 要素が 包含基準を満たす場合、
graphics-object role、
それ以外の場合は none
|
制限なし |
| ‘view’ | none | role を適用してはならない |
DOM Core 仕様は Document インターフェイスを定義しており、この 仕様はそれを拡張する。
SVG 文書が参照によって埋め込まれる場合、 例えば HTML 文書に ‘object’ 要素があり、その ‘data’ 属性が SVG 文書(すなわち MIME 型が "image/svg+xml" であり、そのルート要素が ‘svg’ 要素である文書)を参照する場合、 2 つの異なる DOM 階層が存在する。最初の DOM 階層は 参照元の文書(例えば XHTML 文書)のものである。2 番目の DOM 階層は 参照される SVG 文書のものである。
partial interface Document { readonly attribute SVGSVGElement? rootElement; };
rootElement IDL 属性は、 ルート ‘svg’ 要素を表す。 rootElement を取得すると、文書のルート要素が ‘svg’ 要素である場合はそれを返し、 それ以外の場合は null を返す。
この属性は非推奨であり、将来の SVG 仕様で削除される可能性がある。 著者には代わりに documentElement 属性を Document 上で使用することが推奨される。
HTML を実装する SVG 実装は、 document インターフェイスに対する HTML の拡張を サポートしなければならない。 その他の SVG 実装は次の IDL フラグメントをサポートしなければならない。
// 特定の実装でのみ実装しなければならない partial interface Document { readonly attribute DOMString title; readonly attribute DOMString referrer; readonly attribute DOMString domain; readonly attribute Element? activeElement; };
title、referrer、domain および activeElement IDL 属性は、 HTML で定義される対応する IDL 属性と同じように動作しなければならない。
SVGSVGElement オブジェクトは、 DOM 内の ‘svg’ 要素を 表す。SVGSVGElement インターフェイスには、 データ型オブジェクトのファクトリメソッドなど、 その他さまざまなユーティリティメソッドも含まれる。
SVGSVGElement オブジェクトは、 内部の SVGPoint オブジェクトを保持し、 これを 現在の平行移動点 オブジェクトと呼ぶ。 これは currentTranslate IDL 属性から返されるオブジェクトである。
[Exposed=Window] interface SVGSVGElement : SVGGraphicsElement { [SameObject] readonly attribute SVGAnimatedLength x; [SameObject] readonly attribute SVGAnimatedLength y; [SameObject] readonly attribute SVGAnimatedLength width; [SameObject] readonly attribute SVGAnimatedLength height; attribute float currentScale; [SameObject] readonly attribute SVGPoint currentTranslate; NodeList getIntersectionList(SVGRect rect, SVGElement? referenceElement); NodeList getEnclosureList(SVGRect rect, SVGElement? referenceElement); boolean checkIntersection(SVGElement element, SVGRect rect); boolean checkEnclosure(SVGElement element, SVGRect rect); undefined deselectAll(); [NewObject] SVGNumber createSVGNumber(); [NewObject] SVGLength createSVGLength(); [NewObject] SVGAngle createSVGAngle(); [NewObject] SVGPoint createSVGPoint(); [NewObject] SVGMatrix createSVGMatrix(); [NewObject] SVGRect createSVGRect(); [NewObject] SVGTransform createSVGTransform(); [NewObject] SVGTransform createSVGTransformFromMatrix(optional DOMMatrix2DInit matrix = {}); Element? getElementById(DOMString elementId); // 呼び出しても効果のない非推奨メソッドだが、 // 互換性のために維持されている。 unsigned long suspendRedraw(unsigned long maxWaitMilliseconds); undefined unsuspendRedraw(unsigned long suspendHandleID); undefined unsuspendRedrawAll(); undefined forceRedraw(); }; SVGSVGElement includes SVGFitToViewBox; SVGSVGElement includes WindowEventHandlers;
x、 y、 width および height IDL 属性は、 それぞれ x、y、width および height プロパティの計算値と、それに対応する プレゼンテーション属性を反映する。
currentScale および currentTranslate IDL 属性は、SVG に適用される追加の変換を表す。 これらは SVG 文書フラグメントの 最外部の svg 要素に対してのみ効果を持つ。
文書の拡大縮小およびパン
変換は、
[currentScale 0 0 currentScale currentTranslate.x currentTranslate.y]
という形式の 2x3 行列である。
‘transform’
プロパティの値は、
currentScale または
currentTranslate には影響しない。
以前のバージョンの SVG では、ユーザーエージェントが既定で、
グラフィックのスケール(ズーム)および平行移動(パン)をユーザーが設定するためのコントロールを
実装することが推奨されていた。
これらのユーザー操作による変換は、currentScale および currentTranslate の値に
反映されるものとされていた。
これらのユーザーコントロールは十分に実装されなかったため、現在は推奨されていない。
ただし、著者はユーザーエージェントがこれらの値を更新する可能性があることに注意すべきである。
最外部の SVG 要素上の廃止された属性 zoomAndPan="disable" は、
ユーザー操作に基づくユーザーエージェントによる値の操作を無効にすべきであるが、
一部のユーザーエージェントでは望ましくない副作用を引き起こす可能性がある。
currentScale および currentTranslate と、 文書ルートを変換するその他の方法(変換および SVG view)との相互作用は 十分に定義されていない。 詳細については GitHub issue を参照すること。
currentScale を取得すると、 次の手順を実行する:
currentScale を設定すると、 次の手順を実行する:
currentTranslate を取得すると、 SVGSVGElement オブジェクトの 現在の 平行移動点オブジェクトが返される。このオブジェクトは、 ‘svg’ 要素の 現在の平行移動を表す。 現在の 平行移動点オブジェクトは、その ‘svg’ 要素が 最外部の svg 要素でない場合は 読み取り専用でなければならず、 それ以外の場合は書き込み可能でなければならない。
現在の 平行移動点オブジェクトを変更した場合に文書の拡大縮小およびパン変換へ どのように影響するかについては、SVGPoint への代入の規則を参照すること。
ユーザーインタラクションに応じて文書の拡大縮小およびパン変換が変更されるたび、 または 最外部の svg 要素が 変更されるたびに、次の手順を実行する:
最外部の svg 要素が 変更されたときにこれらの手順を実行することで、文書要素が別の ‘svg’ 要素に置き換えられた場合、 その currentTranslate が、 文書の拡大縮小およびパン変換の平行移動成分を反映するよう 直ちに更新されることが保証される。
‘svg’ 要素が 最外部の svg 要素でなくなった場合、 その 現在の 平行移動点オブジェクトの x および y 成分を 0 に設定しなければならない。
suspendRedraw、 unsuspendRedraw、 unsuspendRedrawAll および forceRedraw メソッドはすべて非推奨であり、効果を持たないものとして定義される。 suspendRedraw メソッドが呼び出された場合、1 を返さなければならない。
getIntersectionList、 getEnclosureList、 checkIntersection および checkEnclosure メソッドは、 グラフィックス要素に対してジオメトリ操作を行い、 そのグラフィカルコンテンツが指定された矩形内に 一部または完全に存在するものを検索する(またはそうであるかどうかを確認する)ために使用される。
指定された要素 element の 交差する または内包される子孫を検索するには、 指定された矩形 rectangle と、rectangle を解釈する座標空間を持つ要素として ancestor を使用して、次の手順を実行する:
これは、use 要素のシャドウ ツリー内の 要素を調べるものの、 要素インスタンスや、 参照される文書サブツリー内の そのソース要素を result リストには入れず、 ‘use’ 要素自体だけを返すことを意味する。
指定された要素 element 内の 非コンテナー グラフィックス要素を検索するには、次の 手順を実行する:
getIntersectionList(rect, referenceElement) または getEnclosureList(rect, referenceElement) が呼び出された場合、 次の手順を実行する:
checkIntersection(element, rect) または checkEnclosure(element, rect) が呼び出された場合、 次の手順を実行する:
deselectAll メソッドは、 文書からすべての選択を削除するために使用される。deselectAll() が呼び出されると、 文書の selection からすべての range が削除され、 selection の direction は forwards に設定される。[DOM][EDITING] このメソッドは Selection API の機能と重複するため非推奨である。
これは、この ‘svg’ 要素が属する文書上で
document.getSelection().removeAllRanges() を呼び出すことと同等である。
createSVGNumber、 createSVGLength、 createSVGAngle、 createSVGPoint、 createSVGMatrix、 createSVGRect および createSVGTransform メソッドはすべて、特定の型の新しいデータ型オブジェクトを作成するために使用される ファクトリ関数である。これらのメソッドのいずれかが呼び出されると、次の表に従って 新しいオブジェクトが返される:
| メソッド | オブジェクトおよび詳細 |
|---|---|
| createSVGNumber | 値が 0 の、新しく作成された切り離された SVGNumber オブジェクト。 |
| createSVGLength | 値が単位なしの <number> 0 である、新しく作成された 切り離された SVGLength オブジェクト。 |
| createSVGAngle | 値が単位なしの <number> 0 である、新しく作成された 切り離された SVGAngle オブジェクト。 |
| createSVGPoint | すべての座標が 0 である、新しく作成された切り離された SVGPoint オブジェクト。 |
| createSVGMatrix | 単位行列を表す、新しく作成された切り離された SVGMatrix オブジェクト。 |
| createSVGRect | x、y、width および height がすべて 0 の、新しく作成された SVGRect オブジェクト。 |
| createSVGTransform | 値が matrix(1, 0, 0, 1, 0, 0) である、新しく作成された切り離された SVGTransform オブジェクト。 |
createSVGPoint、 createSVGMatrix および createSVGRect メソッドは すべて非推奨であり、レガシーコンテンツとの互換性のためだけに維持されている。 著者には代わりに SVGPoint、SVGMatrix および SVGRect コンストラクターを 使用することが推奨される。
createSVGTransformFromMatrix メソッドは、行列オブジェクトから新しい SVGTransform オブジェクトを作成するために使用される。 その動作は SVGTransformList 上の createSVGTransformFromMatrix メソッドと同じである。
getElementById メソッドは、 ‘svg’ 要素の 子孫内で、ID が elementId である要素のうち ツリー 順で最初の要素を返さなければならず、 そのような要素が存在しない場合は null を返さなければならない。
SVGGElement オブジェクトは、 DOM 内の ‘g’ 要素を表す。
[Exposed=Window] interface SVGGElement : SVGGraphicsElement { };
SVGDefsElement オブジェクトは、 DOM 内の ‘defs’ 要素を 表す。
[Exposed=Window] interface SVGDefsElement : SVGGraphicsElement { };
SVGDescElement オブジェクトは、 DOM 内の ‘desc’ 要素を 表す。
[Exposed=Window] interface SVGDescElement : SVGElement { };
SVGMetadataElement オブジェクトは、 DOM 内の ‘metadata’ 要素を表す。
[Exposed=Window] interface SVGMetadataElement : SVGElement { };
SVGTitleElement オブジェクトは、 DOM 内の ‘title’ 要素を 表す。
[Exposed=Window] interface SVGTitleElement : SVGElement { };
SVGSymbolElement オブジェクトは、 DOM 内の ‘symbol’ 要素を表す。
[Exposed=Window] interface SVGSymbolElement : SVGGraphicsElement { }; SVGSymbolElement includes SVGFitToViewBox;
SVG 2 で新しく追加された。 SVGSymbolElement インターフェイスは現在、 SVGGraphicsElement から継承するため、 シャドウ DOM 内でインスタンス化された symbol をグラフィックス要素として照会できる。
SVGUseElement オブジェクトは、 DOM 内の ‘use’ 要素を 表す。
[Exposed=Window] interface SVGUseElement : SVGGraphicsElement { [SameObject] readonly attribute SVGAnimatedLength x; [SameObject] readonly attribute SVGAnimatedLength y; [SameObject] readonly attribute SVGAnimatedLength width; [SameObject] readonly attribute SVGAnimatedLength height; }; SVGUseElement includes SVGURIReference;
x、 y、 width および height IDL 属性は、 それぞれ x、y、width および height プロパティの計算値と、それに対応する プレゼンテーション属性を反映する。
各 use 要素のシャドウツリーのルートオブジェクトは、 SVGUseElementShadowRoot インターフェイスを実装する。 このインターフェイスは現在、 ShadowRoot インターフェイスおよび DocumentOrShadowRoot ミックスインで 定義されるプロパティおよびメソッドへの拡張を定義していない。 ただし、このノードをルートとするツリーは、 著者スクリプトの観点からは完全に読み取り専用である。
[Exposed=Window] interface SVGUseElementShadowRoot : ShadowRoot { };
ShadowAnimation インターフェイスは、 読み取り専用の Animation オブジェクトを定義し、 その構築元である sourceAnimation オブジェクトに対する すべての変更を反映する。 これらは use 要素のシャドウツリー内で、 著者が開始したアニメーションオブジェクトを反映するために使用される。
[Exposed=Window] interface ShadowAnimation : Animation { constructor(Animation source, (Element or CSSPseudoElement) newTarget); [SameObject] readonly attribute Animation sourceAnimation; };
sourceAnimation IDL プロパティは、 コンストラクターに渡された Animation オブジェクトを指す。
コンストラクターは、新しい ShadowAnimation
オブジェクトを生成する。
これは sourceAnimation 上のすべてのプロパティを反映するが、
その effect
は例外であり、
KeyframeEffectReadOnly
を新しく構築し、
sourceAnimation のキーフレーム効果をソースとして使用した後、
その target
を newTarget パラメーターに一致するよう変更することで作成される。
ShadowAnimation は読み取り専用である。
継承された IDL プロパティのいずれかを設定しようとする試み、
またはその状態を変更する Animation メソッドの
いずれかを呼び出そうとする試みは、
NoModificationAllowedError をスローしなければならない。
ただし、ユーザーエージェントは、
sourceAnimation のプロパティまたは状態の
変更が ShadowAnimation の変更に
反映されることを保証しなければならない。
SVGSwitchElement オブジェクトは、 DOM 内の ‘switch’ 要素を表す。
[Exposed=Window] interface SVGSwitchElement : SVGGraphicsElement { };
このインターフェイスは、別の DOM ベースの言語内に 参照によって埋め込まれた SVG 文書へのアクセスを提供する。 このインターフェイスは、そのような SVG 文書参照を許可する DOM オブジェクト上で実装されることが想定される。
このインターフェイスは非推奨であり、将来の
SVG 仕様のバージョンから削除される可能性がある。
‘iframe’ または
‘object’ 要素内の SVG 文書へアクセスするには、
著者には、それぞれ
HTMLIFrameElement
または HTMLObjectElement
インターフェイス上の contentDocument
属性を使用することが推奨される。
HTMLIFrameElement、 HTMLEmbedElement および HTMLObjectElement インターフェイスはすべて独自の getSVGDocument メソッドを定義しており、 GetSVGDocument と同じ方法で SVG 文書へのアクセスを提供する。したがって、これら 3 つの インターフェイスは GetSVGDocument を 実装する必要はない。それでも、著者には 代わりに contentDocument を使用することが強く推奨される。
interface mixin GetSVGDocument {
Document getSVGDocument();
};
getSVGDocument メソッドは、 参照される SVG 文書を返すために使用される。getSVGDocument() が呼び出された場合、 GetSVGDocument インターフェイスを実装する埋め込み要素によって参照される Document オブジェクトを返さなければならない。 文書が存在しない場合は null を返す。
これは、参照される 文書が実際に SVG 文書であるかどうかを確認しないことに注意すること。代わりに、任意の文書が返される。
SVG 文書内の要素は CSS を使用してスタイル付けできる。 ほとんどの視覚的特性と、要素の ジオメトリの一部は CSS プロパティを使用して制御される。 例えば、fill プロパティは、図形の内部を 塗りつぶすために使用されるペイントを制御し、width および height プロパティは、‘rect’ 要素の サイズを制御するために使用される。
SVG ユーザーエージェントは、この章で説明するすべての CSS スタイル付け 機構をサポートしなければならない。
SVG 1.1 では、‘style’ 要素 および ‘style’ を使用するインラインスタイルシートのサポートは必須ではなかった。 SVG 2 では、 これらは必須である。
| SVG 2 要件: | HTML5 の ‘style’ 要素属性を SVG の ‘style’ 要素に追加する。 |
|---|---|
| 決議: | SVG 2 の ‘style’ 要素は HTML5 の ‘style’ 要素と整合させる。 |
| 目的: | HTML と SVG コンテンツで ‘style’ 要素の動作が異なることで著者を驚かせないため。 |
| 担当者: | Cameron (ACTION-3277) |
‘style’ 要素を使用すると、 スタイルシートを SVG コンテンツ内に直接埋め込むことができる。 SVG の ‘style’ 要素は、 HTML の 対応する 要素と同じ属性を持つ。
属性定義:
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| type | (以下を参照) | (none) | いいえ |
この属性は、要素のコンテンツのスタイルシート言語を メディア型として指定する。 [rfc2046]。 属性が指定されていない場合、 スタイルシート言語は CSS であると仮定される。 この属性は廃止されており、使用すべきではない。
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| media | (以下を参照) | (none) | いいえ |
この属性は、スタイルシートが適用されるために 一致しなければならないメディアクエリーを指定する。その値は media_query_list として解析される。 指定されていない場合、スタイルシートは無条件に適用される。
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| title | (以下を参照) | (none) | いいえ |
この属性はスタイルシートのタイトルを指定し、 代替スタイルシートを公開して選択するときに使用される。 この属性は任意の値を取る。
‘style’ 要素とその 属性のセマンティクスおよび処理は、 HTML ‘style’ 要素について定義されるものと同じでなければならない。
スタイルシートのテキストコンテンツは直接レンダリングされることはない。 ‘style’ 要素の display 値は、 ユーザーエージェントスタイルシートによって 常に none に設定されなければならず、 この宣言は他のどの CSS 規則またはプレゼンテーション属性よりも重要でなければならない。
SVG 文書内の HTML ‘link’ 要素(すなわち、 HTML 名前空間にあり、ローカル名が "link" である要素)で、 ‘rel’ 属性が 'stylesheet' に設定されているものは、 HTML 仕様で定義されるように処理され、外部スタイルシートを 読み込んで文書に適用しなければならない。インライン SVG フラグメントの外側にある HTML 文書内の このような要素も SVG コンテンツに適用されなければならない。
この要素は HTML 名前空間にある必要があるため、 HTML ‘link’ 要素を text/html 文書内の インライン SVG フラグメントの一部として解析することはできない。ただし、 XML 構文を使用して SVG 文書を解析する場合は、XML 名前空間宣言を 使用して要素を HTML 名前空間に置くことができる。
HTML ‘link’ 要素を使用せずに外部スタイルシートを参照する 別の方法として、インラインスタイルシート内で @import 規則を使用できることに注意すること。例えば:
<svg xmlns="http://www.w3.org/2000/svg">
<style>
@import url(mystyles.css);
</style>
<rect .../>
</svg>
これは次と同様に動作する:
<svg xmlns="http://www.w3.org/2000/svg"> <link xmlns="http://www.w3.org/1999/xhtml" rel="stylesheet" href="mystyles.css" type="text/css"/> <rect .../> </svg>
また、XML 文書では、外部 CSS スタイルシートを <?xml-stylesheet?> 処理命令 [xml-stylesheet] を使用して含めることができる。
SVG ‘style’ または HTML ‘style’ 要素が HTML 文書内で使用される場合、それらのスタイルシートは文書内のすべての HTML および インライン SVG コンテンツに適用されなければならない。同様に、SVG 文書内で使用される HTML ‘style’ 要素も、そのスタイルシートを 文書に適用しなければならない。
HTML と同様に、SVG はすべての要素で ‘class’ および ‘style’ 属性をサポートし、要素固有のスタイル付けを可能にする。
属性定義:
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| class | 空白区切りトークンの 集合 [HTML] | (none) | はい |
‘class’ 属性は、1 つ以上のクラス名を要素に割り当て、 それをスタイル付け言語から指定するために使用できる。
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| style | (以下を参照) | (none) | いいえ |
‘style’ 属性は、要素の CSS 宣言を指定するために 使用される。この属性は declaration-list として 解析される。
SVG DOM で ‘class’ 属性が反映される方法 (SVGElement 上の className IDL 属性)を除き、 ‘class’ および ‘style’ 属性のセマンティクス と動作は、 HTML の対応する 属性と同じでなければならない。
次の例では、‘text’ 要素を ‘class’ 属性と組み合わせて使用し、文書のメッセージをマークアップする。メッセージは 英語版とフランス語版の両方で表示される。
<!-- 英語のメッセージ --> <text class="info" lang="en">変数が 2 回宣言されています</text> <text class="warning" lang="en">宣言されていない変数</text> <text class="error" lang="en">変数名の構文が不正です</text> <!-- フランス語のメッセージ --> <text class="info" lang="fr">変数が 2 回宣言されています</text> <text class="warning" lang="fr">未定義の変数</text> <text class="error" lang="fr">変数の構文エラー</text>
次の CSS スタイル 規則は、視覚的ユーザーエージェントに情報 メッセージを緑、警告メッセージを黄、エラー メッセージを赤で表示するよう指示する:
text.info { fill: green; }
text.warning { fill: yellow; }
text.error { fill: red; }
この例は、‘style’ 属性を使用して、 前の例と同様に ‘text’ 要素をスタイル付けする方法を示す:
<text style="fill: green;" lang="en">変数が 2 回宣言されています</text> <text style="fill: yellow;" lang="en">宣言されていない変数</text> <text style="fill: red;" lang="en">変数名の構文が不正です</text>
一部のスタイル付けプロパティは、スタイルシート および ‘style’ 属性だけでなく、 プレゼンテーション 属性でも指定できる。 これらは、名前が指定された CSS プロパティと一致する(または類似する)属性であり、 その値はそのプロパティの値として解析される。プレゼンテーション 属性はカスケードの 著者レベルに寄与し、 その後に他のすべての著者レベルのスタイルシートが続き、 詳細度は 0 である。
プレゼンテーション属性は宣言ではなく CSS 値として解析されるため、 プレゼンテーション属性内の !important 宣言は、 その値を無効な 値にする。 プレゼンテーション属性がどのように解析されるかの詳細については、 属性構文を参照すること。
SVG のレンダリングに影響できるすべてのスタイルプロパティに、 対応するプレゼンテーション属性があるわけではない。 その他の属性(たまたまスタイルプロパティと同じ名前を共有するもの)は、 プレゼンテーション属性として解析してはならず、CSS のカスケードおよび継承に影響してはならない。 また、SVG 名前空間内の要素だけがプレゼンテーション属性をサポートする。 ほとんどの SVG プレゼンテーション属性は、既存の属性と名前が衝突しない SVG 名前空間内の任意の要素に指定できる。 ただし、ジオメトリプロパティに対応する プレゼンテーション属性があるのは 指定された要素のみである。 その他の要素上の同名の属性は CSS のカスケードおよび継承に影響してはならない。
transform プレゼンテーション属性の表で注記されている場合を除き、 プレゼンテーション属性名はプロパティ名と同じで、小文字である。
‘cx’, ‘cy’, ‘r’, ‘x’, ‘y’, ‘width’ および ‘height’ 属性は、常に プレゼンテーション属性であるわけではないことに注意すること。 例えば、‘text’ および ‘tspan’ 上の ‘x’ 属性は x プロパティのプレゼンテーション属性ではなく、 ‘radialGradient’ 上の ‘r’ 属性は r プロパティのプレゼンテーション属性ではない。
将来、SVG コンテンツに適用される新しいプロパティに プレゼンテーション属性が追加されることはない。したがって、 著者には SVG コンテンツのスタイル付けにプレゼンテーション属性ではなく、 インラインの ‘style’ プロパティ またはスタイルシートを通じて、 スタイル付けプロパティを使用することが推奨される。
プレゼンテーション属性のアニメーションは、 対応するプロパティをアニメーション化することと同等である。
次のプロパティは、すべての SVG ユーザーエージェントでサポートされなければならない:
次の ユーザー エージェントスタイルシートは、すべての SVG ユーザーエージェントで適用されなければならない。
@namespace url(http://www.w3.org/2000/svg);
@namespace xml url(http://www.w3.org/XML/1998/namespace);
svg:not(:root), image, marker, pattern, symbol { overflow: hidden; }
*:not(svg),
*:not(foreignObject) > svg {
transform-origin: 0 0;
}
*[xml|space=preserve] {
white-space-collapse: preserve-spaces;
}
:link, :visited {
cursor: pointer;
}
さらに、
すべてのインタラクティブなユーザーエージェントは、
:focus 擬似クラス
(通常は outline プロパティを使用)および
::selection 擬似要素に
区別できるスタイルを適用する必要がある
(反転色で選択されたグリフを再描画するなど、
適切な強調表示手法を使用する)。
CSS Transforms は、 transform-origin の初期値を 50% 50% と定義している。 SVG 内の要素は既定で原点 (0, 0) を中心に変換されなければならないため、 transform-origin は 上書きされ、すべての SVG 要素について 0 0 の既定値に設定される (ルート ‘svg’ 要素、および ‘foreignObject’ 要素または非 SVG 名前空間内の要素の子である ‘svg’ 要素を除く。これらの要素は 中心を基準に変換されなければならない)。 [css-transforms-1]
OpenType 仕様は、 [OPENTYPE] を処理するときに 追加のユーザーエージェントスタイル シートを適用することを要求している。 これは次のとおりである:
@namespace svg url(http://www.w3.org/2000/svg);
svg|text, svg|foreignObject {
display: none !important;
}
:root {
fill: context-fill;
fill-opacity: context-fill-opacity;
stroke: context-stroke;
stroke-opacity: context-stroke-opacity;
stroke-width: context-value;
stroke-dasharray: context-value;
stroke-dashoffset: context-value;
}
context-fill および context-stroke キーワードは この仕様で定義されるとおりであり、 フォントグリフの コンテキスト要素は 対応する テキストコンテンツ要素である。 その他のキーワードは OpenType 仕様で定義されるとおりであり、 テキストコンテンツ 要素からのスタイル値が フォントグリフへ伝播されることを保証し、 座標系の変更に応じた適切な調整が行われる [OPENTYPE]。
上で説明した機能に加えて、次の CSS 機能も SVG ユーザーエージェントでサポートされなければならない:
SVGStyleElement オブジェクトは、 DOM 内の ‘style’ 要素を 表す。
[Exposed=Window] interface SVGStyleElement : SVGElement { [Reflect] attribute DOMString type; [Reflect] attribute DOMString media; [Reflect] attribute DOMString title; attribute boolean disabled; }; SVGStyleElement includes LinkStyle;
SVG のスタイル付けプロパティに加えて、SVG は ジオメトリプロパティも定義する。 ジオメトリプロパティは、 グラフィックス要素 ‘circle’, ‘ellipse’, ‘rect’, ‘image’, ‘foreignObject’ および ‘svg’ 要素の位置と寸法を記述する。
cx, cy, x および y プロパティは負の値を受け入れる。r, rx, ry, width および height プロパティは受け入れない: 負の <length-percentage> は 無効である。これらの プロパティのいずれかに無効な負の値が指定された場合、 プレゼンテーション属性または CSS 宣言のどちらによるものであっても、 そのプロパティの初期値が指定されたかのように扱わなければならない: rx, ry, width および height では auto、 r では 0 である。したがって負の値によって要素が エラー状態になることはなく、 @@ 未知の用語 "使用値" はプロパティの通常の解決 規則によって決定される。次の表は この処理を要約する。
| プロパティ | 値 | 初期値 | 負の値を許可? | 負の値の計算値 | 負の値の使用値 |
|---|---|---|---|---|---|
| cx, cy | <length-percentage> | 0 | はい | 指定された値(そのまま保持) | 負の値(図形を平行移動する) |
| r | <length-percentage> | 0 | いいえ | 0 | 0; r = 0 の ‘circle’ はレンダリングされない |
| rx, ry | <length-percentage> | auto | auto | いいえ | auto | auto として解決される: 他方の半径の使用値と等しく、 他方の半径も auto または負である場合は 0。解決された半径が 0 の ‘ellipse’ はレンダリングされない。 |
| width, height | <length-percentage> | auto | auto | いいえ | auto | サイズ指定表に従って auto として解決される: 最外部の ‘svg’ では 100%、 ‘image’ では固有サイズ、 その他すべての要素では 0。 |
| 名前: | cx |
|---|---|
| 値: | <length-percentage> |
| 初期値: | 0 |
| 適用対象: | ‘circle’ および ‘ellipse’ 要素 |
| 継承: | いいえ |
| パーセント値: | 現在の SVG ビューポートの幅を参照する( 単位を参照) |
| メディア: | 視覚 |
| 計算値: | 絶対長またはパーセント値 |
| アニメーション型: | 計算値による |
cx プロパティは、要素の位置の水平中心 座標を記述する。
cx には負の値が許可される。負の 値は図形の中心を 平行移動し、r, rx および ry とは異なり、レンダリングを無効にしない( 負の値の処理を参照)。
| 名前: | cy |
|---|---|
| 値: | <length-percentage> |
| 初期値: | 0 |
| 適用対象: | ‘circle’ および ‘ellipse’ 要素 |
| 継承: | いいえ |
| パーセント値: | 現在の SVG ビューポートの高さを参照する( 単位を参照) |
| メディア: | 視覚 |
| 計算値: | 絶対長またはパーセント値 |
| アニメーション型: | 計算値による |
cy プロパティは、要素の位置の垂直中心座標を 記述する。
cy には負の値が許可される。負の 値は図形の中心を 平行移動し、レンダリングを無効にしない( 負の値の処理を参照)。
| 名前: | r |
|---|---|
| 値: | <length-percentage> |
| 初期値: | 0 |
| 適用対象: | ‘circle’ 要素 |
| 継承: | いいえ |
| パーセント値: | 現在の SVG ビューポートの正規化された対角線を参照する( 単位を参照) |
| メディア: | 視覚 |
| 計算値: | 絶対長またはパーセント値 |
| アニメーション型: | 計算値による |
r の負の値は無効であり、 0 が指定されたかのように扱われる( 負の値の処理を参照)ため、 ‘circle’ はレンダリングされない。
| 名前: | rx |
|---|---|
| 値: | <length-percentage> | auto |
| 初期値: | auto |
| 適用対象: | ‘ellipse’, ‘rect’ 要素 |
| 継承: | いいえ |
| パーセント値: | 現在の SVG ビューポートの幅を参照する( 単位を参照) |
| メディア: | 視覚 |
| 計算値: | 絶対長またはパーセント値 |
| アニメーション型: | 計算値による |
rx プロパティは、 ‘ellipse’ 要素の水平半径と、 ‘rect’ 要素の曲線の半径を記述する。 ‘rx’ の計算値が auto の場合、 使用される半径は ry に使用される絶対長と等しくなり、 円弧を生成する。 ‘rx’ と ‘ry’ の両方の計算値が auto の場合、使用値は 0 である。
値の計算方法にかかわらず、‘rect’ に対する ‘rx’ の使用値は、 同じ図形の width の使用値の 50% を超えることはない。
auto の動作は、‘ellipse’ について SVG 2 で新しく追加されたもので、 rx が指定されていない場合の ‘rect’ 要素の動作と一致する。
rx の負の値は無効であり、 auto が指定されたかのように扱われる( 負の値の処理を参照)。したがって auto と同様に解決される: ry の使用値、または ry も auto または 負である場合は 0 となる。
| 名前: | ry |
|---|---|
| 値: | <length-percentage> | auto |
| 初期値: | auto |
| 適用対象: | ‘ellipse’, ‘rect’ |
| 継承: | いいえ |
| パーセント値: | 現在の SVG ビューポートの高さを参照する( 単位を参照) |
| メディア: | 視覚 |
| 計算値: | 絶対長またはパーセント値 |
| アニメーション可能な型: | 計算値による |
ry プロパティは、 ‘ellipse’ 要素の垂直半径と、 ‘rect’ 要素の垂直方向の曲線半径を記述する。 ‘ry’ の計算値が auto の場合、 使用される半径は rx に使用される絶対長と等しくなり、 円弧を生成する。 ‘rx’ と ‘ry’ の両方の計算値が auto の場合、使用値は 0 である。
値の計算方法にかかわらず、‘rect’ に対する ‘ry’ の使用値は、 同じ図形の height の使用値の 50% を超えることはない。
auto の動作は、‘ellipse’ について SVG 2 で新しく追加されたもので、 ry が指定されていない場合の ‘rect’ 要素の動作と一致する。
ry の負の値は無効であり、 auto が指定されたかのように扱われる( 負の値の処理を参照)。したがって auto と同様に解決される: rx の使用値、または rx も auto または 負である場合は 0 となる。
| 名前: | x |
|---|---|
| 値: | <length-percentage> |
| 初期値: | 0 |
| 適用対象: | ‘svg’, ‘rect’, ‘image’, ‘foreignObject’ 要素 |
| 継承: | いいえ |
| パーセント値: | 現在の SVG ビューポートの幅を参照する( 単位を参照) |
| メディア: | 視覚 |
| 計算値: | 絶対長またはパーセント値 |
| アニメーション型: | 計算値による |
x プロパティは、 要素の位置の水平座標を記述する。
| 名前: | y |
|---|---|
| 値: | <length-percentage> |
| 初期値: | 0 |
| 適用対象: | ‘svg’, ‘rect’, ‘image’, ‘foreignObject’ 要素 |
| 継承: | いいえ |
| パーセント値: | 現在の SVG ビューポートの高さを参照する( 単位を参照) |
| メディア: | 視覚 |
| 計算値: | 絶対長またはパーセント値 |
| アニメーション型: | 計算値による |
y プロパティは、 要素の位置の垂直座標を記述する。
width および height の定義については CSS 2.1 仕様を参照すること。
CSS の width および height プロパティは、 一部の SVG 要素のサイズ指定に使用される。具体的には、 ‘rect’, ‘image’, ‘foreignObject’, および 最外部の ‘svg’ 要素のサイズ指定に使用される。 これらすべての要素には ‘width’ および ‘height’ プレゼンテーション属性がある。 これらのプロパティは、HTML 名前空間から埋め込まれた要素のレイアウトにも使用される。
入れ子になった ‘svg’ 要素、‘use’ 要素、および ‘symbol’ 要素など、 その他の SVG 要素にも ‘width’ および ‘height’ 属性があるが、CSS プロパティとしては受け入れない。 これらの要素では、width および height は XML 属性として指定しなければならず、同名の CSS プロパティは 無視される。
width の使用値は、 max-width および min-width プロパティの値によって制約される場合がある。 height の使用値は、 max-height および min-height プロパティの値によって制約される場合がある。
次の表は、width および height の値 auto が、 異なる要素でどのように扱われるかを要約する:
| 要素 | 値 | 扱い |
|---|---|---|
| ‘svg’ | auto | 100% |
| ‘image’ | auto | CSS の 既定のサイズ指定 アルゴリズムに従い、参照される画像の固有寸法とアスペクト比から計算される |
| その他すべての要素 | auto | 0 |
SVG 2 で新しく追加された。SVG に埋め込まれた画像は、固有サイズに自動でサイズ設定したり、 固有のアスペクト比に従って固定の高さまたは幅へ拡大縮小したりできるようになった。これは HTML に埋め込まれた画像の 動作と一致する。
これは例えば、‘foreignObject’ オブジェクト要素では、 auto が使用されてもコンテンツに合わせて縮小包装されないことを意味する。
すべての SVG コンテンツは SVG ビューポート内に描画される。 各 SVG ビューポートは、大きさ (幅、高さ)と原点によって特徴付けられる描画領域を定義し、それらは抽象的な ユーザー単位で測定される。
SVG ビューポートという用語は、CSS で使用される "ビューポート" という用語とは異なることに注意すること。
初期ビューポートは、 包含環境で使用される座標系(例えば、ウェブブラウザーの CSS ピクセル) と ユーザー単位との間の対応付けを確立する最上位の SVG ビューポートである。初期ビューポートの確立については、 初期ビューポートでさらに 詳しく説明する。
SVG ビューポートは要素によってのみ確立される。どの要素がビューポートを生成するかについては、 新しい SVG ビューポートの確立を参照すること。
各 SVG ビューポートは ビューポート座標 系 と ユーザー座標 系を生成し、初期状態では両者は同一である。 ビューポートの要素に ‘viewBox’ を指定すると、ユーザー座標系は ビューポート座標系に対して、 ‘viewBox’ 属性で説明されるように変換される。ビューポートの子要素は、 例えば transform プロパティを指定することで、 ユーザー 座標系をさらに変更できる。
SVG ビューポートは入れ子にできる。パーセント単位は、 単位の節で定義されるように、 最も近い祖先のビューポート定義要素のユーザー座標系を基準として解決される。 したがって、SVG ビューポートを入れ子にすると、 パーセント単位の意味を再定義し、 特定の矩形領域に対してグラフィックを「合わせる」ための 新しい基準矩形を提供できる。 最遠祖先 SVG ビューポートは、 SVG コンテキストから外れることなく到達できる最上位のルート SVG ビューポートである。祖先 SVG ビューポートは DOM ツリー順に依存しない場合がある。例えば ‘linearGradient’, ‘radialGradient’, ‘pattern’, ‘mask’, ‘clipPath’, ‘symbol’ または ‘use’ 要素の場合である。
SVG コンテキストとは、そのフラグメント内のすべての要素が SVGElement をプロトタイプとして持つ文書フラグメントである。
SVG ビューポートの幅、高さ、および原点は、 SVG ビューポートを生成する SVG 文書フラグメントと、 そのフラグメントの親(実際のものまたは暗黙のもの)との間の調整 プロセスによって確立される。この調整プロセスの 説明については 新しい SVG ビューポートの確立を参照すること。
既定では、入れ子になった SVG ビューポートの ビューポート座標 系は、親要素のローカル 座標系を SVG ビューポートの 要素の原点だけ平行移動したものと等価である。ただし、SVG ビューポートの要素上の transform プロパティは、 親要素のユーザー座標系に対して ビューポート座標系を変更する。
抽象的には、すべての SVG ビューポートは キャンバスに埋め込まれている。 これは、関連するすべての次元で無限に大きい描画領域である。
この処理は、viewBox 属性の min-x、min-y、width、および height 値と、 viewBox 属性が定義された要素の位置とサイズ、 およびその要素上の preserveAspectRatio 属性の値を、要素に含まれるコンテンツへ適用される平行移動と 拡大縮小へ変換する。
要素に含まれるコンテンツに適用される変換は、 translate(translate-x, translate-y) scale(scale-x, scale-y) で与えられる。
次の条件が満たされない限り、初期ビューポートの幅は、最外部の svg 要素上の width プレゼンテーション属性の値でなければならない:
これらの条件下では、ビューポートの幅は 配置プロパティによって確立されなければならない。
同様に、参照元要素または 最外部の svg 要素に、 ビューポートの高さを確立するのに十分な 配置 プロパティ が指定されている場合、それらの 配置プロパティがビューポートの高さを確立しなければならない。 それ以外の場合、初期ビューポートの高さは 最外部の svg 要素上の height プレゼンテーション属性の値でなければならない。
最外部の svg 要素上の width または height プレゼンテーション属性が ユーザー単位である場合(すなわち、単位 識別子が指定されていない場合)、その値は同じ数の "px" 単位と等価であると仮定される(単位を参照)。
次の例では、SVG グラフィックが CSS レイアウト規則を使用して整形される親 XML 文書内に インラインで埋め込まれている。 最外部の svg 要素に CSS 配置プロパティが指定されていないため、 width="100px" および height="200px" 属性が 初期ビューポートのサイズを決定する:
<?xml version="1.0" standalone="yes"?>
<parent xmlns="http://some.url">
<!-- SVG グラフィック -->
<svg xmlns='http://www.w3.org/2000/svg'
width="100px" height="200px">
<path d="M100,100 Q200,400,300,100"/>
<!-- SVG グラフィックの残りはここに置く -->
</svg>
</parent>
最外部の svg 要素について、SVG ユーザー エージェントは、2 つの座標系が同一になるよう、 初期 ビューポート座標 系と 初期 ユーザー座標系 を決定しなければならない。両方の 座標系の原点は SVG ビューポートの原点になければならず、初期座標系の 1 単位は SVG ビューポート内の 1 CSS 2.1 px ([CSS2]、4.3.2 節) と等しくなければならない。 スタンドアロン SVG 文書、および親の レイアウトが CSS [CSS2] によって決定される親文書内へ (参照またはインラインで)埋め込まれた SVG 文書フラグメントでは、 初期ビューポート 座標系(したがって初期ユーザー座標 系も)は、ビューポートの左上に原点を持ち、 正の x 軸が右を向き、正の y 軸が下を向き、テキストは「直立」 方向でレンダリングされなければならない。これは、ローマ字 文字およびアジア系文字体系の全角 表意文字について、対応するグリフの上辺が 上を向き、対応するグリフの右辺が 右を向くようにグリフが配置されることを意味する。
SVG 実装が、 CSS 2.1 互換の px 単位を使用した文書のスタイル付けをサポートするユーザーエージェントの一部である場合、 SVG ユーザーエージェントは、実世界 単位における px 単位の大きさの初期値を、他のスタイル付け操作で使用される値と 一致させるべきである。 それ以外で、ユーザーエージェントが環境から px 単位の大きさを決定できる場合、その 値を使用すべきである。それ以外の場合、1 px 単位に適切な大きさを選択すべきである。すべての場合において、px の大きさは CSS 2.1 で説明される規則 ([CSS2]、4.3.2 節) に適合しなければならない。
下の InitialCoords の例は、 初期座標系が左上に原点を持ち、 x 軸が右向き、y 軸が 下向きであることを示す。初期ユーザー座標系では 1 ユーザー 単位が親(暗黙または明示)のユーザーエージェントの "ピクセル" に等しい。
<?xml version="1.0" standalone="no"?>
<svg width="300px" height="100px" version="1.1"
xmlns="http://www.w3.org/2000/svg">
<desc>InitialCoords の例 - SVG の初期座標系</desc>
<g fill="none" stroke="black" stroke-width="3" >
<line x1="0" y1="1.5" x2="300" y2="1.5" />
<line x1="1.5" y1="0" x2="1.5" y2="100" />
</g>
<g fill="red" stroke="none" >
<rect x="0" y="0" width="3" height="3" />
<rect x="297" y="0" width="3" height="3" />
<rect x="0" y="97" width="3" height="3" />
</g>
<g font-size="14" font-family="Verdana" >
<text x="10" y="20">(0,0)</text>
<text x="240" y="20">(300,0)</text>
<text x="10" y="90">(0,100)</text>
</g>
</svg>
InitialCoords の例
ユーザーエージェントは [css-transforms-1] で定義される transform プロパティ およびプレゼンテーション属性をサポートしなければならない。
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| viewBox | [<min-x>,? <min-y>,? <width>,? <height>] | 指定されていない場合と同様。 | はい |
<min-x>, <min-y>, <width>, <height> = <number>
‘svg’
要素上の Transform は、‘viewBox’ 属性のため少し特殊である。
transform は、‘svg’ に、その
transform が設定された親要素があるかのように適用されるべきである。
決議: transform プロパティは
概念上 'svg' 要素の外側に適用され、プレゼンテーション属性とスタイルプロパティの間に違いはない(視覚的結果の観点で)。
‘viewBox’ 属性は、 ‘preserveAspectRatio’ 属性と組み合わせて、 SVG ビューポートを特定のコンテナー要素に合うよう 引き伸ばす機能を提供する。
‘viewBox’ 属性の値は、 空白および/またはコンマで区切られた 4 つの数値 <min-x>, <min-y>, <width> および <height> のリストであり、 指定された要素によって確立される SVG ビューポートの境界へ マッピングされるべきユーザー空間内の矩形を指定する。その際、 ‘preserveAspectRatio’ 属性が考慮される。 ‘viewBox’ 属性が存在すると、 SVG ビューポートの等価変換の計算で説明されるように、 ビューポート座標系へ変換が適用される。
<width> または <height> の負の値はエラーである: ‘viewBox’ 属性は無効であり、指定されていなかったかのように扱わなければならないため、 viewBox 変換は適用されない。 <width> または <height> の値が 0 の場合、 他のサイズが 0 のビューポートの扱いと同様に、 要素のレンダリングが無効になる。
ViewBox の例は、 最外部の svg 要素上で ‘viewBox’ 属性を使用し、 SVG コンテンツが SVG ビューポートの境界に合うよう 引き伸ばされるべきことを指定する方法を示す。
<?xml version="1.0" standalone="no"?>
<svg width="300px" height="200px"
viewBox="0 0 1500 1000" preserveAspectRatio="none"
xmlns="http://www.w3.org/2000/svg">
<desc>ViewBox の例 - viewBox
属性を使用して初期ユーザー座標系を自動的に作成し、
SVG ビューポートのサイズに関係なくグラフィックが
SVG ビューポートに合うよう拡大縮小される。</desc>
<!-- この矩形はユーザー座標系で (0,0) から (1500,1000) まで広がる。
上の viewBox 属性により、
この矩形は最終的に SVG コンテンツ用に
確保された領域全体を埋める。 -->
<rect x="0" y="0" width="1500" height="1000"
fill="yellow" stroke="blue" stroke-width="12" />
<!-- 大きな赤い三角形 -->
<path fill="red" d="M 750,100 L 250,900 L 1250,900 z"/>
<!-- SVG ビューポートの大部分にまたがるテキスト文字列 -->
<text x="100" y="600" font-size="200" font-family="Verdana" >
合うように引き伸ばす
</text>
</svg>
| 次の SVG ビューポートへ レンダリング: width=300px, height=200px |
次の SVG ビューポートへ レンダリング: width=150px, height=200px |
|
|---|---|---|
|
![]() |
この
例を SVG として表示(SVG 対応ブラウザーのみ)
‘viewBox’ 属性の効果により、ユーザーエージェントは ユーザー座標系内の指定された 矩形を指定された領域 (多くの場合 SVG ビューポート)の境界へマッピングするための適切な変換行列を自動的に提供する。 左の例の効果を実現するには、SVG ビューポートの寸法が 300 x 200 ピクセルであるため、 ユーザーエージェントは X と Y の両方を 0.2 倍にする 変換を自動的に挿入する必要がある。この効果は、 300px x 200px の SVG ビューポートと、文書内に 次の補助変換がある場合と等価である:
<?xml version="1.0" standalone="no"?>
<svg width="300px" height="200px"
xmlns="http://www.w3.org/2000/svg">
<g transform="scale(0.2)">
<!-- 文書の残りはここに置く -->
</g>
</svg>
右の例の効果を実現するには、 SVG ビューポートの寸法が 150 x 200 ピクセルであるため、ユーザーエージェントは X を 0.1 倍、Y を 0.2 倍にする 変換を自動的に挿入する必要がある。この効果は、 150px x 200px の SVG ビューポートと、文書内に次の補助 変換がある場合と等価である:
<?xml version="1.0" standalone="no"?>
<svg width="150px" height="200px"
xmlns="http://www.w3.org/2000/svg">
<g transform="scale(0.1 0.2)">
<!-- 文書の残りはここに置く -->
</g>
</svg>
場合によっては、ユーザーエージェントが scale 変換に加えて translate 変換も提供する必要があることに注意すること。例えば、 最外部の svg 要素で、 ‘viewBox’ 属性が <min-x> または <min-y> に 0 以外の値を指定する場合、 translate 変換が必要になる。
transform(または ‘patternTransform’) と ‘viewBox’ の両方が 要素に適用される場合、2 つの新しい座標 系が確立される。transform は要素の 最初の新しい座標系を確立する。‘viewBox’ は要素のすべての子孫に対して 2 番目の座標系を確立する。最初の座標系には 2 番目の座標系が後乗算される。
transform プロパティとは異なり、 ‘viewBox’ によって作成される自動変換は、 ‘x’, ‘y’, ‘width’ および ‘height’ 属性 (または ‘marker’ 要素の場合は、 ‘markerWidth’ および ‘markerHeight’ 属性)には影響しない。 これらは ‘viewBox’ 属性を持つ要素上の属性である。したがって、上の例のように ‘svg’ 要素が width および height プレゼンテーション属性 と ‘viewBox’ 属性を持つ場合、 width および height は ‘viewBox’ 変換が適用される前に存在する座標系内の値を表す。一方、 transform プロパティと同様に、 その他すべての属性および 子孫要素には新しい座標系を確立する。
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| preserveAspectRatio | <align> <meetOrSlice>? | xMidYMid meet | はい |
<align> =
none
| xMinYMin | xMidYMin | xMaxYMin
| xMinYMid | xMidYMid | xMaxYMid
| xMinYMax | xMidYMax | xMaxYMax
<meetOrSlice> = meet | slice
均一な拡大縮小を強制するかどうかを示す。新しい SVG ビューポートを確立する すべての要素(SVG ビューポートを 確立する要素を参照)に加え、 ‘image’, ‘marker’, ‘pattern’ および ‘view’ 要素に適用される。
場合によっては、一般に ‘viewBox’ 属性を使用するとき、 グラフィックスを SVG ビューポート全体を占めるよう 不均一に引き伸ばして合わせることが望ましい。 その他の場合には、グラフィックスのアスペクト比を 保持する目的で均一な拡大縮小を使用することが望ましい。
新しい SVG ビューポートを確立する要素(SVG ビューポートを 確立する要素を参照)に加え、 ‘marker’, ‘pattern’ および ‘view’ 要素では、 ‘preserveAspectRatio’ は、 同じ要素上の ‘viewBox’ に値が指定されている場合にのみ適用される。これらの要素で ‘viewBox’ 属性が 指定されていない場合、 ‘preserveAspectRatio’ は 無視される。
‘image’ 要素では、 ‘preserveAspectRatio’ は、 参照される画像を基準矩形に対して どのように収めるべきか、および参照される画像のアスペクト比を 現在のユーザー座標系に対して 保持すべきかどうかを示す。
<align> パラメーターは、 均一な拡大縮小を強制するかどうか、および強制する場合、 ‘viewBox’ のアスペクト比が SVG ビューポートのアスペクト比と一致しない場合に使用する 配置方法を示す。<align> パラメーターは次の文字列のいずれかでなければならない:
<meetOrSlice> パラメーターはオプションであり、指定する場合は <align> 値から 1 つ以上の 空白で区切り、次の文字列のいずれかでなければならない:
meet(既定値) - 次の条件を満たすよう グラフィックを拡大縮小する:
この場合、グラフィックのアスペクト比が SVG ビューポートと一致しなければ、SVG ビューポートの一部が ‘viewBox’ の境界を越えて広がる (すなわち、‘viewBox’ が描画される領域は SVG ビューポートより小さくなる)。
slice - 次の条件を満たすよう グラフィックを拡大縮小する:
この場合、‘viewBox’ のアスペクト比が SVG ビューポートと一致しなければ、‘viewBox’ の一部が SVG ビューポートの境界を越えて広がる(すなわち、‘viewBox’ が描画される領域は SVG ビューポートより大きくなる)。
PreserveAspectRatio の例は、 ‘preserveAspectRatio’ のさまざまな選択肢を示す。 この例では、最外部の svg 要素内に ‘svg’ サブ要素を埋め込むことで、複数の新しい SVG ビューポートを作成する (新しい SVG ビューポートの確立を参照)。
<svg width="450px" height="300px" xmlns="http://www.w3.org/2000/svg">
<desc>PreserveAspectRatio の例 - preserveAspectRatio 属性を示す</desc>
<style type="text/css">
text { font-size: 9; }
rect { fill: none; stroke: blue; }
</style>
<defs>
<g id="smile">
<rect x='.5' y='.5' width='29' height='39' style="fill:black;stroke:red"/>
<circle cx='15' cy='20' r='10' fill='yellow'/>
<circle cx='12' cy='17' r='1.5' fill='black'/>
<circle cx='17' cy='17' r='1.5' fill='black'/>
<path d='M 10 24 A 8 8 0 0 0 20 24' stroke='black' stroke-width='2'/>
</g>
</defs>
<rect x="1" y="1" width="448" height="298"/>
<text x="10" y="30">合わせる SVG</text>
<g transform="translate(20,40)"><use href="#smile" /></g>
<text x="10" y="110">ビューポート 1</text>
<g transform="translate(10,120)"><rect x='.5' y='.5' width='49' height='29'/></g>
<text x="10" y="180">ビューポート 2</text>
<g transform="translate(20,190)"><rect x='.5' y='.5' width='29' height='59'/></g>
<g id="meet-group-1" transform="translate(100, 60)">
<text x="0" y="-30">--------------- meet ---------------</text>
<g>
<text y="-10">xMin*</text>
<rect x='.5' y='.5' width='49' height='29'/>
<svg preserveAspectRatio="xMinYMin meet" viewBox="0 0 30 40" width="50" height="30">
<use href="#smile" />
</svg>
</g>
<g transform="translate(70,0)">
<text y="-10">xMid*</text>
<rect x='.5' y='.5' width='49' height='29'/>
<svg preserveAspectRatio="xMidYMid meet" viewBox="0 0 30 40" width="50" height="30">
<use href="#smile" />
</svg>
</g>
<g transform="translate(0,70)">
<text y="-10">xMax*</text>
<rect x='.5' y='.5' width='49' height='29'/>
<svg preserveAspectRatio="xMaxYMax meet" viewBox="0 0 30 40" width="50" height="30">
<use href="#smile" />
</svg>
</g>
</g>
<g id="meet-group-2" transform="translate(250, 60)">
<text x="0" y="-30">---------- meet ----------</text>
<g>
<text y="-10">*YMin</text>
<rect x='.5' y='.5' width='29' height='59'/>
<svg preserveAspectRatio="xMinYMin meet" viewBox="0 0 30 40" width="30" height="60">
<use href="#smile" />
</svg>
</g>
<g transform="translate(50, 0)">
<text y="-10">*YMid</text>
<rect x='.5' y='.5' width='29' height='59'/>
<svg preserveAspectRatio="xMidYMid meet" viewBox="0 0 30 40" width="30" height="60">
<use href="#smile" />
</svg>
</g>
<g transform="translate(100, 0)">
<text y="-10">*YMax</text>
<rect x='.5' y='.5' width='29' height='59'/>
<svg preserveAspectRatio="xMaxYMax meet" viewBox="0 0 30 40" width="30" height="60">
<use href="#smile" />
</svg>
</g>
</g>
<g id="slice-group-1" transform="translate(100, 220)">
<text x="0" y="-30">---------- slice ----------</text>
<g>
<text y="-10">xMin*</text>
<rect x='.5' y='.5' width='29' height='59'/>
<svg preserveAspectRatio="xMinYMin slice" viewBox="0 0 30 40" width="30" height="60">
<use href="#smile" />
</svg>
</g>
<g transform="translate(50,0)">
<text y="-10">xMid*</text>
<rect x='.5' y='.5' width='29' height='59'/>
<svg preserveAspectRatio="xMidYMid slice" viewBox="0 0 30 40" width="30" height="60">
<use href="#smile" />
</svg>
</g>
<g transform="translate(100,0)">
<text y="-10">xMax*</text>
<rect x='.5' y='.5' width='29' height='59'/>
<svg preserveAspectRatio="xMaxYMax slice" viewBox="0 0 30 40" width="30" height="60">
<use href="#smile" />
</svg>
</g>
</g>
<g id="slice-group-2" transform="translate(250, 220)">
<text x="0" y="-30">--------------- slice ---------------</text>
<g>
<text y="-10">*YMin</text>
<rect x='.5' y='.5' width='49' height='29'/>
<svg preserveAspectRatio="xMinYMin slice" viewBox="0 0 30 40"
width="50" height="30">
<use href="#smile" />
</svg>
</g>
<g transform="translate(70,0)">
<text y="-10">*YMid</text>
<rect x='.5' y='.5' width='49' height='29'/>
<svg preserveAspectRatio="xMidYMid slice" viewBox="0 0 30 40" width="50" height="30">
<use href="#smile" />
</svg>
</g>
<g transform="translate(140,0)">
<text y="-10">*YMax</text>
<rect x='.5' y='.5' width='49' height='29'/>
<svg preserveAspectRatio="xMaxYMax slice" viewBox="0 0 30 40" width="50" height="30">
<use href="#smile" />
</svg>
</g>
</g>
</svg>
PreserveAspectRatio の例
SVG コンテンツ内に ‘svg’ 要素を含めると、 含まれるすべてのグラフィックスが描画される新しい SVG ビューポートが作成される。 これにより、新しいビューポート座標系と 新しいユーザー座標系の両方が暗黙的に確立される。 さらに、新しい SVG ビューポートが確立されたため、 その内部ではパーセント単位にも新しい意味が生じる (単位を参照)。
新しい SVG ビューポートの境界は、新しい SVG ビューポートを 確立する要素、例えば ‘svg’ 要素上の ‘x’, ‘y’, ‘width’ および ‘height’ 属性によって定義される。 新しい ビューポート座標系と新しいユーザー座標系はどちらも (‘x’, ‘y’) に原点を持つ。ここで ‘x’ および ‘y’ は SVG ビューポートを確立する要素上の 対応する属性の値を表す。新しい ビューポート座標系と新しいユーザー座標系の向きは、 SVG ビューポートを確立する要素の現在のユーザー座標 系の向きに対応する。新しいビューポート座標系と新しいユーザー 座標系の 1 単位は、 SVG ビューポートを確立する要素の現在のユーザー座標系の 1 単位と 同じ大きさである。
次に例を示す:
<?xml version="1.0" standalone="no"?>
<svg width="4in" height="3in"
xmlns="http://www.w3.org/2000/svg">
<desc>この SVG 描画は別のものを埋め込み、
それによって新しい SVG ビューポートを確立する
</desc>
<!-- 次の文は新しい SVG ビューポートを確立し、
SVG 描画 B をその SVG ビューポートへレンダリングする -->
<svg x="25%" y="25%" width="50%" height="50%">
<!-- 描画 B はここに置く -->
</svg>
</svg>
新しい SVG ビューポートを作成する詳細な例については、PreserveAspectRatio の 例を参照すること。
次の要素は新しい SVG ビューポートを確立する:
歴史的な理由により、 ‘pattern’ および ‘marker’ 要素は、 ‘viewBox’ 属性を受け入れるにもかかわらず、 新しいビューポートを作成しない。 ‘clipPath’ または ‘mask’ 要素も同様である。 これらの要素のコンテンツ内のパーセント長は、 グラフィカル効果領域の寸法に比例しない。
‘foreignObject’ 要素は、 子コンテンツのために新しい CSS 包含ブロック を確立する。 これは新しいビューポートと似たいくつかの効果を持ち、 子コンテンツのレイアウトのスコープをリセットする。 ただし、‘foreignObject’ の子孫である SVG 要素をレンダリングするには、 新しい ‘svg’ 要素が SVG 文書フラグメントと SVG ビューポートを確立しなければならない。
‘image’ は、 参照される文書のために新しい 文書ビューポート を作成する。 参照される文書が SVG ファイルである場合、当然それ自身の SVG ビューポートを確立する。
新しい SVG ビューポートが追加の新しい クリッピングパスも確立するかどうかは、新しい SVG ビューポートを確立する 要素上の overflow プロパティの値によって決定される。
SVG は、属性、 プレゼンテーション属性、および CSS プロパティについて、 CSS Values and Units Module [css-values] の共通の値と単位の説明および定義に従う。 各属性およびプロパティは、使用するコンポーネント値型を指定しなければならない。 CSS WG または SVG WG が公開する後続または拡張仕様は、 基本データ型を拡張したり、新しいデータ型を追加したりしてもよい。
SVG ビューポートのサイズに対して相対的であると定義される <percentage> 値について:
sqrt((width)**2 + (height)**2)/sqrt(2) で計算しなければならない。
下の Units の例は、 異なる種類の単位に対するいくつかの処理規則を 示す。
<?xml version="1.0" standalone="no"?>
<svg width="400px" height="200px" viewBox="0 0 4000 2000"
xmlns="http://www.w3.org/2000/svg">
<title>Units の例</title>
<desc>さまざまな単位の選択肢を示す</desc>
<!-- 図を枠で囲む -->
<rect x="5" y="5" width="3990" height="1990"
fill="none" stroke="blue" stroke-width="10"/>
<g fill="blue" stroke="red" font-family="Verdana" font-size="150">
<!-- 絶対単位指定子 -->
<g transform="translate(400,0)">
<text x="-50" y="300" fill="black" stroke="none">絶対単位:</text>
<rect x="0" y="400" width="4in" height="2in" stroke-width=".4in"/>
<rect x="0" y="750" width="384" height="192" stroke-width="38.4"/>
<g transform="scale(2)">
<rect x="0" y="600" width="4in" height="2in" stroke-width=".4in"/>
</g>
</g>
<!-- 相対単位指定子 -->
<g transform="translate(1600,0)">
<text x="-50" y="300" fill="black" stroke="none">相対単位:</text>
<rect x="0" y="400" width="2.5em" height="1.25em" stroke-width=".25em"/>
<rect x="0" y="750" width="375" height="187.5" stroke-width="37.5"/>
<g transform="scale(2)">
<rect x="0" y="600" width="2.5em" height="1.25em" stroke-width=".25em"/>
</g>
</g>
<!-- パーセント値 -->
<g transform="translate(2800,0)">
<text x="-50" y="300" fill="black" stroke="none">パーセント値:</text>
<rect x="0" y="400" width="10%" height="10%" stroke-width="1%"/>
<rect x="0" y="750" width="400" height="200" stroke-width="31.62"/>
<g transform="scale(2)">
<rect x="0" y="600" width="10%" height="10%" stroke-width="1%"/>
</g>
</g>
</g>
</svg>
Units の例
左側の 3 つの矩形は、 絶対単位識別子の 1 つである "in" 単位(インチ)の使用を示す。CSS は 1 インチを 96 ピクセルと等しいと定義する。したがって、インチで 指定された最上部の矩形は、 最上部の 矩形の各対応するインチにつき 96 ユーザー単位となるようユーザー単位で指定された中央の 矩形と正確に同じサイズである。グループの下部の矩形は、 インチで指定された値が拡大縮小されたときに何が起こるかを示す。
中央の 3 つの矩形は、 相対単位識別子の 1 つである "em" 単位の使用を示す。 最外部の ‘g’ 要素で font-size プロパティが 150 に設定されているため、各 "em" 単位は 150 ユーザー単位と等しい。"em" 単位で 指定された最上部の矩形は、 最上部の矩形の各対応する "em" 単位につき 150 ユーザー単位となるようユーザー単位で指定された中央の 矩形と正確に同じサイズである。グループの下部の矩形は、 "em" 単位で指定された値が拡大縮小されたときに何が起こるかを示す。
右側の 3 つの矩形は、
パーセント値の使用を示す。SVG ビューポート要素
(この場合は 最外部の svg 要素)のユーザー座標系における
SVG ビューポートの幅と高さは、それぞれ 4000 と
2000 であることに注意すること。これは ‘viewBox’ 属性の処理によって
変換されたユーザー座標系が生じるためである。パーセント単位で
指定された最上部の矩形は、
等価なユーザー単位で指定された中央の矩形と
正確に同じサイズである。特に、中央の矩形の
stroke-width プロパティは、
sqrt((actual-width)**2 +
(actual-height)**2) / sqrt(2) の 1% に設定されていることに注意すること。この
場合は .01*sqrt(4000*4000+2000*2000)/sqrt(2)、すなわち 31.62 である。
グループの下部の矩形は、
パーセント単位で指定された値が拡大縮小されたときに何が起こるかを示す。
要素の境界ボックス(または "bbox")は、 その要素のユーザー座標系の軸に揃えられ、 その要素とその子孫を完全に包含する、最も密接に適合する矩形である。
要素について 3 種類の境界ボックスを計算できる:
要素上の opacity, visibility, fill, fill-opacity, fill-rule, stroke-dasharray および stroke-dashoffset プロパティの値は、 要素の境界ボックスに影響しないことに注意すること。
曲線図形では、境界ボックスは端点だけでなく、 辺に沿った図形のすべての部分を包含しなければならない。結果として得られる曲線の線上にないと定義される 曲線の制御点(例えば、三次ベジェコマンドの 2 番目の 座標ペア)は、境界ボックスの寸法に寄与してはならない (ただし、それらの点が図形自体の内部、または曲線上もしくはその近くにある場合、 境界ボックスの領域内に入ることはある)。例えば、 曲線の辺の非包含側から見て曲線の辺より遠い位置にある曲線の制御点は、 境界ボックスから除外しなければならない。
パス 'M20,50 L35,100 H120 V50 Q70,10 20,50' は薄い青色で示される。左側には、パスの正しいオブジェクト境界ボックスが 示されている。曲線の最上部の制御点は含まれていないが、 制御点の凸包の外側にある部分も含め、 青い図形全体が含まれていることに注意すること。
要素が レンダリングツリー内に存在しない場合でも、 'display: none' である、‘defs’ 要素内にある、通常は ‘symbol’ 要素のようにレンダリングされない、または 現在文書ツリー内に存在しないなどの理由であっても、境界ボックスは依然として存在する。 要素上で getBBox を呼び出すと、 要素がレンダリングされた場合と同じ矩形が返される。ただし、 レンダリングツリー内にない要素は、 どの祖先要素の境界ボックスにも寄与しない。
次の例では複数の要素を定義する。ID を持つ各要素について期待される オブジェクト境界ボックスを 下に示す。
<svg xmlns="http://www.w3.org/2000/svg">
<title>境界ボックスの計算</title>
<desc>コンテキストに基づいて異なる境界ボックス結果を持つ要素の例。</desc>
<defs id="defs-1">
<rect id="rect-1" x="20" y="20" width="40" height="40" fill="blue" />
</defs>
<g id="group-1">
<use id="use-1" href="#rect-1" x="10" y="10" />
<g id="group-2" display="none">
<rect id="rect-2" x="10" y="10" width="100" height="100" fill="red" />
</g>
</g>
</svg>
| 要素 ID | 境界ボックスの結果 |
|---|---|
"defs-1" |
{0, 0, 0, 0} |
"rect-1" |
{20, 20, 40, 40} |
"group-1" |
{30, 30, 40, 40} |
"use-1" |
{30, 30, 40, 40} |
"group-2" |
{10, 10, 100, 100} |
"rect-2" |
{10, 10, 100, 100} |
テキストコンテンツ要素では、境界 ボックス計算の目的上、各グリフを個別のグラフィックス要素として扱わなければならない。 計算では、すべてのグリフが 完全なグリフ セルを占めると仮定しなければならない。 完全なグリフセルは、 横書きテキストでは幅が 水平送り量に等しく、高さが EM ボックスに等しくなければならない。横倒しで組版される縦書きテキストでは、 完全なグリフ セルは幅が EM ボックスに等しく、高さが水平送り量に等しくなければならない。 その他の縦書きテキストでは、完全なグリフセルは幅が EM ボックスに等しく、高さが縦送り量に等しくなければならず、フォントに縦送り量が定義されていない場合は、 高さが EM ボックスの高さに等しくなければならない。 例えば、横書きテキストでは、各グリフが フォントの完全なアセント値とディセント値まで垂直方向に広がると仮定して計算しなければならない。
宣言的またはスクリプトによるアニメーションは、要素の形状、サイズ、および 位置を変更できるため、境界ボックスは可変である。したがって、要素の境界ボックスは、 スクリプト呼び出しを通じてであれ、 宣言的またはリンク構文の一部としてであれ、境界ボックスが要求された時点のスナップショットにおける 要素の現在値を反映しなければならない。
幅が 0、高さが 0、または両方が 0 の要素(例えば 垂直線または水平線、あるいは width または height が 0 の ‘rect’ 要素)にも 境界ボックスは存在し、正の寸法については正の値を持ち、 正の寸法が指定されていない場合は幅と高さの両方が '0' になる。同様に、幅と高さが 0 の ‘path’ 要素のサブパス区間も、 境界ボックスのためにその要素のジオメトリに含めなければならない。
位置が指定されていない要素(例えば、 d プロパティの値が none である ‘path’ 要素)は、 境界ボックスを計算する目的では 点 (0,0) に配置される。
DOM オブジェクトが SVGGraphicsElement から派生しない要素 (グラデーション要素など)は境界ボックスを持たず、したがって 境界ボックスを要求するためのインターフェイスも持たないことに注意すること。
レンダリングツリー内で未解決のリソースを参照する要素も、
それでも境界ボックスを持たなければならない。これは、
属性で指定された位置と寸法、
または値が指定されていない場合にはそれらの属性の
初期値によって定義される。
例えば、要素 <use href="#bad" x="10" y="10"/>
は x と y が 10、幅と高さが 0 の境界ボックスを持つ。
次のアルゴリズムは、指定された 要素の境界ボックスを計算する方法を定義する。アルゴリズムへの入力は次のとおり:
境界ボックスを計算するアルゴリズムは、element の型に応じて次のとおり:
fill, fill-opacity および fill-rule プロパティの値は fill-shape に影響しない。
stroke-opacity, stroke-dasharray および stroke-dashoffset の値は、ストローク形状の計算に影響しない。
値が (0, 0, 0, 0) の box と空の図形との和集合は box である。
要素の オブジェクト境界ボックス、ストローク境界ボックス、または 装飾境界ボックス は、上記の境界ボックス計算アルゴリズムを 次の引数で呼び出した結果である: element は要素自身。 space は要素のユーザー座標系。 fill は true。 stroke は ストローク 境界ボックスまたは 装飾境界ボックスを計算している場合は true、 それ以外は false。 markers は 装飾 境界ボックスを計算している場合は true、それ以外は false。および clipped は false。
次の要素では、指定された属性を 'objectBoundingBox' に設定することにより、 座標値および長さを オブジェクト境界ボックスの 分数(場合によっては パーセント値)として表現する選択肢が提供される:
| 要素 | 属性 | 効果 |
|---|---|---|
| ‘linearGradient’ | ‘gradientUnits’ | グラデーションベクトルを指定する属性 (‘x1’, ‘y1’, ‘x2’, ‘y2’)が、 グラデーションが適用される要素の境界ボックスの 分数または パーセント値を表すことを示す。 |
| ‘radialGradient’ | ‘gradientUnits’ | 中心を指定する属性 (‘cx’, ‘cy’)、半径 (‘r’)、および焦点 (‘fx’, ‘fy’)が、 グラデーションが適用される要素の境界ボックスの 分数または パーセント値を表すことを示す。 |
| ‘pattern’ | ‘patternUnits’ | パターンのタイル配置方法を定義する属性 (‘x’, ‘y’, ‘width’, ‘height’)が、 パターンが適用される要素の境界ボックスを使用して 確立されることを示す。 |
| ‘pattern’ | ‘patternContentUnits’ | パターンの コンテンツのユーザー座標系が、 パターンが適用される要素の境界 ボックスを使用して確立されることを示す。 |
| ‘clipPath’ | ‘clipPathUnits’ | ‘clipPath’ 要素のコンテンツのユーザー座標系が、 クリッピングパスが適用される 要素の境界ボックスを使用して確立されることを示す。 |
| ‘mask’ | ‘maskUnits’ | マスク領域を定義する属性 (‘x’, ‘y’, ‘width’, ‘height’)が、 マスクが適用される要素の境界ボックスを使用して 確立されることを示す。 |
| ‘mask’ | ‘maskContentUnits’ | ‘mask’ 要素のコンテンツのユーザー座標系が、 マスクが適用される 要素の境界ボックスを使用して確立されることを示す。 |
| ‘filter’ | ‘filterUnits’ | フィルター効果 領域を定義する属性 (‘x’, ‘y’, ‘width’, ‘height’)が、 フィルターが適用される要素の境界ボックスの 分数またはパーセント値を表すことを示す。 |
| ‘filter’ | ‘primitiveUnits’ | フィルタープリミティブ内のさまざまな長さ値が、 フィルターが適用される要素の境界ボックスの 分数またはパーセント値を表すことを示す。 |
以下の説明では、適用対象要素という用語は、 指定された効果が適用される要素を指す。グラデーションおよび パターンでは、適用対象要素は、その fill または stroke プロパティが指定されたグラデーションまたはパターンを参照する グラフィックス要素である。(テキスト要素に関する特別な規則については、 オブジェクト 境界ボックス単位とテキスト要素の説明を参照。)クリッピングパス、 マスク、およびフィルターでは、適用対象要素は コンテナー要素または グラフィックス要素のいずれでもよい。
キーワード objectBoundingBox が使用される場合、 補助変換行列が 入れ子になった変換行列のリストに挿入されて 新しいユーザー座標系を作成するかのような効果になる。
最初に、(minx,miny) および (maxx,maxy) 座標は、 適用対象要素の オブジェクト境界ボックスの 範囲によって決定される。
次に、新しいユーザー座標系の座標 (0,0) は、 適用対象要素のユーザー座標系内の密接な境界ボックスの (minx,miny) 隅へマッピングされ、 新しいユーザー座標系の座標 (1,1) は、 適用対象要素の密接な境界ボックスの (maxx,maxy) 隅へマッピングされる。ほとんどの場合、 次の変換行列によって正しい効果が得られる:
[ (maxx-minx) 0 0 (maxy-miny) minx miny ]
グラデーションベクトル、パターンタイル、フィルター領域、または マスク領域を定義する属性でパーセント値が使用される場合、 パーセント値は対応する小数値と同じ値を表す (例えば、50% は 0.5 と同じ意味を持つ)。 ‘pattern’, ‘clipPath’, ‘mask’ または ‘filter’ 要素のコンテンツ内でパーセント値が使用される場合、 これらの値は 単位で定義される パーセント値の処理規則に従って扱われる。
オブジェクト境界ボックス単位の 分数またはパーセント値として表現される値には、任意の数値を指定できる。 特に、0 未満または 1 より大きい分数、および 0% 未満または 100% より大きいパーセント値を 指定できる。
キーワード objectBoundingBox は、適用対象要素のジオメトリに 幅または高さがない場合、例えば水平線または 垂直線の場合には使用すべきではない。 線のストローク幅が 0 でないため表示時には実際の太さがあっても、 境界ボックス計算ではストローク幅が無視されるためである。 適用対象要素のジオメトリに幅または高さがなく、 objectBoundingBox が指定された場合、 指定された効果(例えばグラデーションまたはフィルター)は 無視される。
CSS で整形されたホスト文書に SVG を含められるようにするには、 具体的オブジェクトサイズを 計算しなければならない。 具体的オブジェクトサイズは、 CSS Images 3 [css-images-3] で定義される 既定のサイズ指定アルゴリズムを 次の入力で使用して計算しなければならない:
指定サイズは、 ‘svg’ 要素の width および height サイズ指定プロパティの使用値から決定しなければならない。
固有寸法も、 width および height サイズ指定プロパティから決定しなければならない。 width または height のいずれかが 指定されていない場合、使用値は初期値 'auto' である。 'auto' およびパーセント長は、 固有幅または 固有高さの決定に使用してはならない。
ビットマップ画像形式では、固有寸法は画像ファイル内で固定され、 画像を拡大縮小するために必要に応じて指定サイズがホスト文書で定義される。 SVG は本質的に拡大縮小可能であるため、 固有幅および 固有高さを 指定サイズの幅と 高さになるよう適応させる。 したがって、長さとして指定された場合、‘svg’ 要素の width および height サイズ指定プロパティは、 SVG 画像の 固有寸法と、 SVG 画像をホスト文書に配置するときに使用される 指定サイズを制御する。
固有アスペクト比は、 次のアルゴリズムを使用して計算しなければならない。 アルゴリズムが null を返す場合、固有アスペクト比は存在しない。
この節で定義される動作は CSS に固有だが、 他のホストコンテキストに適応してもよい。すべてのホストコンテキストで、 利用可能な場合は 固有アスペクト比を SVG ビューポートのサイズ指定時に尊重しなければならない。
例:
<svg xmlns="http://www.w3.org/2000/svg"
width="10cm" height="5cm">
...
</svg>
この例では、SVG ビューポートの固有アスペクト比は 2:1 である。 固有幅は 10cm、固有高さは 5cm である。
<svg xmlns="http://www.w3.org/2000/svg"
width="100%" height="50%" viewBox="0 0 200 200">
...
</svg>
この例では、最外部の SVG ビューポートの固有アスペクト比は 1:1 である。この場合のアスペクト比計算により、 一方向だけが制約された包含ブロック内の オブジェクトへの埋め込みが可能になる。
<svg xmlns="http://www.w3.org/2000/svg"
width="10cm" viewBox="0 0 200 200">
...
</svg>
この場合、固有アスペクト比は 1:1 である。
<svg xmlns="http://www.w3.org/2000/svg"
width="75%" height="10cm" viewBox="0 0 200 200">
...
</svg>
この例では、固有アスペクト比は 1:1 である。
新しい auto 値について、さらに例を追加するか? 例えば David Vest が 提供した例など。
| SVG 2 要件: | SVG 2 は SVG 1.2 Tiny に基づく制約付き変換を持つ。 |
|---|---|
| 決議: | ベクター効果拡張 の提案を SVG 2 仕様に追加する。 |
| 目的: | 非スケーリング機能(オブジェクトの非スケーリング部分、およびオブジェクト全体の非スケーリング)を含めるため |
| 担当者: | Satoru Takagi (ACTION-3619) |
オブジェクトの輪郭に元の幅を維持させたり、 どのような変換が適用されてもオブジェクトの位置を固定したりすることが望ましい場合がある。 例えば、道路を表す幅 2px の線を持つ地図では、 ユーザーが地図を拡大しても道路を 2px 幅に維持することや、 パン可能なグラフィックチャート上の説明注記などである。
このような特殊な座標変換および グラフィック描画に関する効果を提供するため、SVG Tiny 1.2 は vector-effect プロパティを導入した。 SVG Tiny 1.2 では非スケーリングストロークの動作のみが導入されたが、このバージョンでは さらに多くの効果を導入する。また、これらの効果は 組み合わせて指定できるため、より多様な効果を示すことができる。さらに、将来の SVG 言語のバージョンでは、このプロパティを通じてより強力なベクター効果を 使用できるようになる。
vector-effect の値のうち non-scaling-stroke および none 以外は、 実装不足のため SVG 2 から削除されるリスクがある。 実装期間中に、 現在指定されているとおりに実装する実用性について、 実装者からのフィードバックが求められる。
| 名前: | vector-effect |
|---|---|
| 値: | none | non-scaling-stroke | non-scaling-size | non-rotation | fixed-position |
| 初期値: | none |
| 適用対象: | グラフィックス要素および ‘use’ |
| 継承: | いいえ |
| パーセント値: | 該当なし |
| メディア: | 視覚 |
| 計算値: | 指定値のまま |
| アニメーション型: | 離散 |
これらの値は列挙できる。これにより、 これらの特性を同時に持つ効果を指定できる。
vector-effect のホスト座標空間は、 最遠祖先 SVG ビューポートの ビューポート座標系である。
注記: SVG の将来のバージョンでは、デバイス座標系を指定する方法が許可される可能性がある。
この節では、明確な 意味を持つ non-scaling-stroke を除き、 ベクター効果の動作を明確にするため、値の組み合わせに関する変換式の一覧を示す。
vector-effect プロパティは、 3D レンダリング コンテキストで実行される変換には影響しない。
ユーザー座標系から ビューポート座標系への通常の座標変換式は次のとおりである。
<circle vector-effect="veValue" transform="translate(xo yo)" cx="xf" cy="yf" r=".."/>
上記のような要素に vector-effect を追加すると、 ユーザー座標からデバイス座標への 変換式は次のように変化する。ここで、xf および yf は、 対応する要素およびその子孫のユーザー 座標である。また、 xo および yo は、 対応する要素が持つ transform 属性の行列要素 e および f である。さらに、|det(CTM)| は CTM の行列式の絶対値である。 この値が 0 となり、 non-scaling-size が指定された場合、 vector-effect は無効、すなわち none となる。
| veValue | 式 |
|---|---|
| non-scaling-size |
|
| non-rotation |
|
| non-scaling-size non-rotation |
|
| fixed-position |
|
| fixed-position non-scaling-size |
|
| fixed-position non-rotation |
|
| fixed-position non-scaling-size non-rotation |
|
以下は、ベクター効果のない入れ子になったビューポート 座標系の通常の座標変換式である。xviewport(UA) および yviewport(UA) は、ユーザーエージェントの直接の 制御下にある座標である。CTMthis は、対象グラフィックの ユーザー 座標系から、それが属する ビューポート座標系への 変換行列の CTM である。 CTMparent は、 前述の ビューポート座標系から、その親の ビューポート座標系への 変換行列の CTM である。 また、CTMroot は、 最上位のビューポート座標系(UA)の CTM である。
前節の 7 つの式を入れ子になったビューポート 座標系に適用する場合、それらの式の適用方法は、 vector-effect の追加値として viewport または screen のどちらが指定されているかによって、 次のように変化する。
viewport 値が指定された場合、 ユーザーエージェントは、前節の 7 つの式のいずれかと、 次の式を組み合わせて座標を計算する。
screen 値が指定された場合、 ユーザーエージェントは、前節の 7 つの式のいずれかと、 次の式を組み合わせて座標を計算する。
以下は non-scaling-stroke vector-effect の例である。
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg"
width="6cm" height="4cm" viewBox="0 0 600 400"
viewport-fill="rgb(255,150,200)">
<desc>non-scaling stroke の例</desc>
<rect x="1" y="1" width="598" height="398" fill="none" stroke="black"/>
<g transform="scale(9,1)">
<line stroke="black" stroke-width="5" x1="10" y1="50" x2="10" y2="350"/>
<line vector-effect="non-scaling-stroke" stroke="black" stroke-width="5"
x1="32" y1="50" x2="32" y2="350"/>
<line vector-effect="none" stroke="black" stroke-width="5"
x1="55" y1="50" x2="55" y2="350"/>
</g>
</svg>
以下は none vector-effect(ベクター効果なし)の例である。
| CTM 変更前 | CTM 変更後 |
ソースコード
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-50,-50,500,500" height="500" width="500">
<rect x="-50" y="-50" width="500" height="500" stroke="orange" stroke-width="3" fill="none"/>
<!-- 入れ子になったユーザー座標系はこの transform 属性によって変換される -->
<g transform="matrix(2.1169438081370817,0.3576047954311102,-0.3576047954311102,1.4700998667618626,0,0)
translate(-50,-50)">
<svg viewBox="-50,-50,500,500" height="500" width="500">
<!-- この svg の基本ユーザー座標系上の方眼紙 -->
<g stroke="green" stroke-width="1" fill="none">
<circle cx="0" cy="0" r="10"/>
<circle cx="150" cy="150" r="7"/>
<path fill="green" stroke="none" d="M0,-3 L30,-3 25,-10 50,0 25,10 30,3 0,3z"/>
<line x1="-100" y1="-100" x2="600" y2="-100" stroke-dasharray="5,5"/>
<line x1="-100" y1="000" x2="600" y2="000"/>
<line x1="-100" y1="100" x2="600" y2="100" stroke-dasharray="5,5"/>
<line x1="-100" y1="200" x2="600" y2="200" stroke-dasharray="5,5"/>
<line x1="-100" y1="300" x2="600" y2="300" stroke-dasharray="5,5"/>
<line x1="-100" y1="400" x2="600" y2="400" stroke-dasharray="5,5"/>
<line x1="-100" y1="500" x2="600" y2="500" stroke-dasharray="5,5"/>
<line y1="-100" x1="-100" y2="600" x2="-100" stroke-dasharray="5,5"/>
<line y1="-100" x1="000" y2="600" x2="000"/>
<line y1="-100" x1="100" y2="600" x2="100" stroke-dasharray="5,5"/>
<line y1="-100" x1="200" y2="600" x2="200" stroke-dasharray="5,5"/>
<line y1="-100" x1="300" y2="600" x2="300" stroke-dasharray="5,5"/>
<line y1="-100" x1="400" y2="600" x2="400" stroke-dasharray="5,5"/>
<line y1="-100" x1="500" y2="600" x2="500" stroke-dasharray="5,5"/>
</g>
<!-- ベクター効果を持つ図形 -->
<!-- この図形の入れ子になったユーザー座標系の原点上にある
太い赤色の右矢印と小さな矩形 -->
<path id="ve" vector-effect="none"
stroke="red" stroke-width="3" fill="none"
transform="matrix(1,0,0,1,150,150)"
d="M-50,-50 L50,-50 50,-100 150,0 50,100 50,50 -50,50 -50,-50z M5 0 L0 -5 -5 0 0 5z"/>
</svg>
</g>
</svg>
以下は non-scaling-size の例である。
| CTM 変更前 | CTM 変更後 |
<path id="ve" vector-effect="non-scaling-size"
stroke="red" stroke-width="3" fill="none"
transform="matrix(1,0,0,1,150,150)"
d="M-50,-50 L50,-50 50,-100 150,0 50,100 50,50 -50,50 -50,-50z M5 0 L0 -5 -5 0 0 5z"/>
以下は non-rotation の例である。
| CTM 変更前 | CTM 変更後 |
<path id="ve" vector-effect="non-rotation"
stroke="red" stroke-width="3" fill="none"
transform="matrix(1,0,0,1,150,150)"
d="M-50,-50 L50,-50 50,-100 150,0 50,100 50,50 -50,50 -50,-50z M5 0 L0 -5 -5 0 0 5z"/>
以下は non-scaling-size non-rotation の例である。
| CTM 変更前 | CTM 変更後 |
<path id="ve" vector-effect="non-scaling-size non-rotation"
stroke="red" stroke-width="3" fill="none"
transform="matrix(1,0,0,1,150,150)"
d="M-50,-50 L50,-50 50,-100 150,0 50,100 50,50 -50,50 -50,-50z M5 0 L0 -5 -5 0 0 5z"/>
以下は fixed-position の例である。
| CTM 変更前 | CTM 変更後 |
<path id="ve" vector-effect="fixed-position"
stroke="red" stroke-width="3" fill="none"
transform="matrix(1,0,0,1,150,150)"
d="M-50,-50 L50,-50 50,-100 150,0 50,100 50,50 -50,50 -50,-50z M5 0 L0 -5 -5 0 0 5z"/>
以下は non-scaling-size fixed-position の例である。
| CTM 変更前 | CTM 変更後 |
<path id="ve" vector-effect="non-scaling-size fixed-position"
stroke="red" stroke-width="3" fill="none"
transform="matrix(1,0,0,1,150,150)"
d="M-50,-50 L50,-50 50,-100 150,0 50,100 50,50 -50,50 -50,-50z M5 0 L0 -5 -5 0 0 5z"/>
以下は non-rotation fixed-position の例である。
| CTM 変更前 | CTM 変更後 |
<path id="ve" vector-effect="non-rotation fixed-position"
stroke="red" stroke-width="3" fill="none"
transform="matrix(1,0,0,1,150,150)"
d="M-50,-50 L50,-50 50,-100 150,0 50,100 50,50 -50,50 -50,-50z M5 0 L0 -5 -5 0 0 5z"/>
以下は non-scaling-size non-rotation fixed-position の例である。
| CTM 変更前 | CTM 変更後 |
<path id="ve" vector-effect="non-scaling-size non-rotation fixed-position"
stroke="red" stroke-width="3" fill="none"
transform="matrix(1,0,0,1,150,150)"
d="M-50,-50 L50,-50 50,-100 150,0 50,100 50,50 -50,50 -50,-50z M5 0 L0 -5 -5 0 0 5z"/>
SVGTransform インターフェイスは、 <transform-function> 値を表すために使用される。これらは transform プロパティ およびそのプレゼンテーション属性 ‘transform’, ‘gradientTransform’ および ‘patternTransform’ に現れる。 SVGTransform は、 単一の scale(…) または matrix(…) 値など、 変換リスト内の単一の成分を表す。
SVGTransform オブジェクトは読み取り 専用として指定できる。 これは、以下で説明するように、オブジェクトを変更しようとすると 例外がスローされることを意味する。
SVGTransform オブジェクトは特定の要素に関連付ける ことができる。関連付けられた要素は、 オブジェクトがその属性を反映する場合に、どの要素の ‘transform’ プレゼンテーション属性を更新するかを決定するために使用される。特に説明されない限り、SVGTransform オブジェクトは どの要素にも関連付けられない。
すべての SVGTransform オブジェクトは 2 つの モードのいずれかで動作する。次のいずれかとなる:
SVGTransform オブジェクトは、 内部に <transform-function> 値を保持し、これをその 値と呼ぶ。 また、SVGMatrix オブジェクトも保持し、 これをその 行列 オブジェクトと呼ぶ。 これは matrix IDL 属性から返されるオブジェクトである。SVGTransform オブジェクトの 行列オブジェクトは、 常にその 値と同期される。
[Exposed=Window] interface SVGTransform { // 変換型 const unsigned short SVG_TRANSFORM_UNKNOWN = 0; const unsigned short SVG_TRANSFORM_MATRIX = 1; const unsigned short SVG_TRANSFORM_TRANSLATE = 2; const unsigned short SVG_TRANSFORM_SCALE = 3; const unsigned short SVG_TRANSFORM_ROTATE = 4; const unsigned short SVG_TRANSFORM_SKEWX = 5; const unsigned short SVG_TRANSFORM_SKEWY = 6; readonly attribute unsigned short type; [SameObject] readonly attribute SVGMatrix matrix; readonly attribute float angle; undefined setMatrix(optional DOMMatrix2DInit matrix = {}); undefined setTranslate(float tx, float ty); undefined setScale(float sx, float sy); undefined setRotate(float angle, float cx, float cy); undefined setSkewX(float angle); undefined setSkewY(float angle); };
SVGTransform 上で定義される数値変換型定数は、 SVGTransform の 値の型を表すために使用される。 その意味は次のとおり:
| 定数 | 意味 |
|---|---|
| SVG_TRANSFORM_MATRIX | matrix(…) 値。 |
| SVG_TRANSFORM_TRANSLATE | translate(…) 値。 |
| SVG_TRANSFORM_SCALE | scale(…) 値。 |
| SVG_TRANSFORM_ROTATE | rotate(…) 値。 |
| SVG_TRANSFORM_SKEWX | skewX(…) 値。 |
| SVG_TRANSFORM_SKEWY | skewY(…) 値。 |
| SVG_TRANSFORM_UNKNOWN | その他の型の値。 |
数値の変換型定数を使用することはアンチパターンであり、 SVGTransform がサポートする どの変換型についても新しい定数値は導入されない。 その他の型の変換がサポートされ使用される場合、SVGTransform は SVG_TRANSFORM_UNKNOWN 型を使用する。これらの変換型で SVGTransform のその他のプロパティが どのように動作するかについては、以下を参照すること。
type IDL 属性は、 SVGTransform の 値である 変換項目の型を表す。 type を取得すると、次の手順を 実行する:
例えば、scaleX(…) または translate3d(…) 変換では、 SVG_TRANSFORM_UNKNOWN が返される。
matrix IDL 属性は、 変換を 4x4 同次行列として表し、取得すると SVGTransform の 行列オブジェクトを返す。 行列オブジェクトが最初に作成されるとき、その 値は SVGTransform の変換 関数 値に一致するよう設定され、 SVGTransform を反映するよう設定される。
異なる変換関数型が 特定の行列値にどのように対応するかについては、 CSS Transforms 仕様を参照すること。
angle IDL 属性は、 rotate(…), skewX(…) または skewY(…) 変換関数の angle パラメーターを表す。 取得すると、次の手順を実行する:
setMatrix メソッドは、 SVGTransform を指定された 行列値に設定するために使用される。 setMatrix(matrix) が呼び出されると、次の手順を実行する:
DOMMatrixReadOnly.fromMatrix(matrix)
の結果とする。
欠落値についての 検証および
修正手順も含む。
そのメソッドがエラーをスローした場合、そのエラーを再スローしてこれらの手順を中止する。
setTranslate, setScale, setRotate, setSkewX および setSkewY メソッドは、 SVGTransform を新しい 変換関数 値に設定するために使用される。これらのメソッドのいずれかが呼び出されると、 次の手順を実行する:
この仕様は、 Geometry Interfaces 仕様で説明されるものに加えて、SVGMatrix オブジェクトの動作に追加要件を課し、 変換値を取るプレゼンテーション属性を 反映するために使用できるようにする。
すべての SVGMatrix オブジェクトは 2 つの モードのいずれかで動作する。 次のいずれかとなる:
SVGMatrix は読み取り 専用として指定できる。 これは、オブジェクトを変更しようとすると例外が スローされることを意味する。読み取り専用の SVGMatrix の IDL 属性のいずれかに代入する場合、または可変変換メソッドのいずれかを呼び出す場合、 内部値を更新する代わりに NoModificationAllowedError 例外がスローされる。
svgwg#706 (2019-10 WG 決議)に従い、SVG 2 は SVG 1.1 の方式に戻ることに注意すること。すなわち、 独立した読み取り専用バリアントのインターフェイスは存在しない。SVGMatrix は内部フラグによって 読み取り専用に指定でき、同じインターフェイス上で書き込みを行うと NoModificationAllowedError がスローされる。
書き込み可能な SVGMatrix の IDL 属性のいずれかに代入する場合、または可変変換メソッドのいずれかを呼び出す場合、 内部行列値の更新後に次の手順を実行する:
SVGTransformList インターフェイスは、 要素が SVGTransform オブジェクトである リストインターフェイスである。 SVGTransformList は、 transform プロパティが取り得る値、 すなわち <transform-list> またはキーワード none のいずれかを表す。
[Exposed=Window] interface SVGTransformList { readonly attribute unsigned long length; readonly attribute unsigned long numberOfItems; undefined clear(); SVGTransform initialize(SVGTransform newItem); getter SVGTransform getItem(unsigned long index); SVGTransform insertItemBefore(SVGTransform newItem, unsigned long index); SVGTransform replaceItem(SVGTransform newItem, unsigned long index); SVGTransform removeItem(unsigned long index); SVGTransform appendItem(SVGTransform newItem); setter undefined (unsigned long index, SVGTransform newItem); // 他のリストインターフェイスに共通しない追加メソッド。 SVGTransform createSVGTransformFromMatrix(optional DOMMatrix2DInit matrix = {}); SVGTransform? consolidate(); };
createSVGTransformFromMatrix メソッドは、行列オブジェクトから新しい SVGTransform オブジェクトを作成するために使用される。 createSVGTransformFromMatrix(matrix) メソッドが呼び出されると、 次の手順を実行する:
consolidate メソッドは、変換リストを単一の変換関数を使用する 等価な変換へ変換するために使用される。 consolidate() メソッドが呼び出されると、次の手順を実行する:
SVGLengthList のその他すべてのインターフェイスメンバーの動作は、 リストインターフェイスで定義される。
SVGAnimatedTransformList オブジェクトは、 transform プロパティと、それに対応する プレゼンテーション属性 (要素に応じて ‘transform’, ‘gradientTransform’ または ‘patternTransform’) を反映するために使用される。
[Exposed=Window] interface SVGAnimatedTransformList { [SameObject] readonly attribute SVGTransformList baseVal; [SameObject] readonly attribute SVGTransformList animVal; };
baseVal および animVal IDL 属性は、 反映されるプレゼンテーション属性の値を表す。 baseVal または animVal を取得すると、 指定されたプレゼンテーション属性を反映する SVGTransformList オブジェクトが返される。
SVGPreserveAspectRatio インターフェイスは、 ‘preserveAspectRatio’ 属性の値を表すために使用される。
SVGPreserveAspectRatio オブジェクトは 読み取り専用として指定できる。 これは、以下で説明するように、オブジェクトを変更しようとすると 例外がスローされることを意味する。
すべての SVGPreserveAspectRatio オブジェクトは、 反映される ‘preserveAspectRatio’ 属性の基本値を反映する (SVGAnimatedPreserveAspectRatio の baseVal または animVal メンバー上のメソッドを通じて公開される)。
[Exposed=Window] interface SVGPreserveAspectRatio { // 配置型 const unsigned short SVG_PRESERVEASPECTRATIO_UNKNOWN = 0; const unsigned short SVG_PRESERVEASPECTRATIO_NONE = 1; const unsigned short SVG_PRESERVEASPECTRATIO_XMINYMIN = 2; const unsigned short SVG_PRESERVEASPECTRATIO_XMIDYMIN = 3; const unsigned short SVG_PRESERVEASPECTRATIO_XMAXYMIN = 4; const unsigned short SVG_PRESERVEASPECTRATIO_XMINYMID = 5; const unsigned short SVG_PRESERVEASPECTRATIO_XMIDYMID = 6; const unsigned short SVG_PRESERVEASPECTRATIO_XMAXYMID = 7; const unsigned short SVG_PRESERVEASPECTRATIO_XMINYMAX = 8; const unsigned short SVG_PRESERVEASPECTRATIO_XMIDYMAX = 9; const unsigned short SVG_PRESERVEASPECTRATIO_XMAXYMAX = 10; // Meet-or-slice 型 const unsigned short SVG_MEETORSLICE_UNKNOWN = 0; const unsigned short SVG_MEETORSLICE_MEET = 1; const unsigned short SVG_MEETORSLICE_SLICE = 2; attribute unsigned short align; attribute unsigned short meetOrSlice; };
SVGPreserveAspectRatio 上で定義される 数値の配置型定数は、 ‘preserveAspectRatio’ が取り得る配置キーワード値を表すために使用される。その意味は次のとおり:
| 定数 | 意味 |
|---|---|
| SVG_PRESERVEASPECTRATIO_NONE | none キーワード。 |
| SVG_PRESERVEASPECTRATIO_XMINYMIN | xMinYMin キーワード。 |
| SVG_PRESERVEASPECTRATIO_XMIDYMIN | xMidYMin キーワード。 |
| SVG_PRESERVEASPECTRATIO_XMAXYMIN | xMaxYMin キーワード。 |
| SVG_PRESERVEASPECTRATIO_XMINYMID | xMinYMid キーワード。 |
| SVG_PRESERVEASPECTRATIO_XMIDYMID | xMidYMid キーワード。 |
| SVG_PRESERVEASPECTRATIO_XMAXYMID | xMaxYMid キーワード。 |
| SVG_PRESERVEASPECTRATIO_XMINYMAX | xMinYMax キーワード。 |
| SVG_PRESERVEASPECTRATIO_XMIDYMAX | xMidYMax キーワード。 |
| SVG_PRESERVEASPECTRATIO_XMAXYMAX | xMaxYMax キーワード。 |
| SVG_PRESERVEASPECTRATIO_UNKNOWN | その他の型の値。 |
同様に、 SVGPreserveAspectRatio 上で定義される 数値の meet-or-slice 型定数は、 ‘preserveAspectRatio’ が 取り得る meet-or-slice キーワード値を表すために使用される。その 意味は次のとおり:
| 定数 | 意味 |
|---|---|
| SVG_MEETORSLICE_MEET | meet キーワード。 |
| SVG_MEETORSLICE_SLICE | slice キーワード。 |
| SVG_MEETORSLICE_UNKNOWN | その他の型の値。 |
align IDL 属性は、 ‘preserveAspectRatio’ 値の配置キーワード部分を表す。取得すると、次の手順を実行する:
align を設定すると、 次の手順を実行する:
meetOrSlice IDL 属性は、 ‘preserveAspectRatio’ 値の meet-or-slice キーワード部分を表す。取得すると、次の手順を実行する:
meetOrSlice を設定すると、 次の手順を実行する:
SVGAnimatedPreserveAspectRatio オブジェクトは、 ‘preserveAspectRatio’ 属性を反映するために使用される。
[Exposed=Window] interface SVGAnimatedPreserveAspectRatio { [SameObject] readonly attribute SVGPreserveAspectRatio baseVal; [SameObject] readonly attribute SVGPreserveAspectRatio animVal; };
baseVal および animVal IDL 属性は、反映される ‘preserveAspectRatio’ 属性の現在の非アニメーション値を表す。baseVal または animVal を取得すると、 SVGPreserveAspectRatio オブジェクトが返され、 そのオブジェクトは、型 SVGAnimatedPreserveAspectRatio の 反映 IDL 属性を持つオブジェクトが取得された SVG 要素上の ‘preserveAspectRatio’ 属性の基本値を反映する。
パスは、塗りつぶしたり ストロークしたりできる図形の輪郭を表す。パスはクリッピングパスとして、アニメーションの記述や テキストの配置にも使用できる。パスはこれらの機能のうち複数に 同時に使用できる。( 塗り、ストローク、およびペイントサーバー、 クリッピングとマスキング、 アニメーション('animateMotion')、 および パス上のテキストを参照。)
パスは現在点の概念を使用して記述される。 紙に描くことに例えると、現在点は ペンの位置と考えることができる。ペンの位置は 変更でき、ペンを直線または 曲線に沿って動かすことで、図形の輪郭(開いていても閉じていてもよい)を描くことができる。
パスはオブジェクトの輪郭のジオメトリを表し、 moveto(新しい現在点を設定する)、 lineto(直線を描く)、curveto( 3 次ベジェを使用して曲線を描く)、arc(楕円 または円弧)、および closepath(最後の moveto に接続して現在の 図形を閉じる)コマンドで定義される。 複合パス(すなわち複数のサブパスを持つパス)も使用でき、 オブジェクト内の「ドーナツ状の穴」のような効果を実現できる。
この章では、SVG パスの構文、動作、および DOM インターフェイスについて説明する。SVG パスに関するさまざまな実装上の注記は、‘path’ 要素の実装上の 注記に記載されている。
SVG では、パスは ‘path’ 要素を使用して定義される。
基本図形はすべて、その 等価パス、すなわち パスとして表現した場合の図形が何であるかという観点から記述される。( ‘path’ 要素の等価パスは、単に パス自身である。)
‘path’ 要素の図形の輪郭は、d プロパティを使用して指定される。以下のパスデータを参照すること。
パスは ‘path’ 要素を含め、その d プロパティで パスデータを指定することで定義される。パスデータには、 moveto, lineto, curveto(3 次および 2 次ベジェの両方)、arc および closepath 命令が含まれる。
triangle01 の例は 三角形の形状のパスを指定する。( M は moveto を示し、 L は lineto を示し、 z は closepath を示す)。
<?xml version="1.0" standalone="no"?>
<svg width="4cm" height="4cm" viewBox="0 0 400 400"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<title>triangle01 の例 - 'path' の簡単な例</title>
<desc>三角形を描くパス</desc>
<rect x="1" y="1" width="398" height="398"
fill="none" stroke="blue" />
<path d="M 100 100 L 300 100 L 200 300 z"
fill="red" stroke="blue" stroke-width="3" />
</svg>
triangle01 の例
パスデータには改行文字を含めることができるため、 読みやすさを向上させるために複数行へ 分割できる。マークアップ内の属性中の改行は、 解析時に空白文字へ正規化される。
多くの SVG ファイルでは パスデータがファイルの大部分を占めるため、パスデータの構文は ファイルサイズを最小限にし、効率よくダウンロードできるよう簡潔になっている。SVG が パスデータのサイズを最小化する方法の一部は次のとおり:
M 100 100 L 200 200M100 100L200 200M 100 200 L 200 100 L -100 -200M 100 200 L 200 100 -100 -200パスデータ構文は前置記法(すなわち、コマンドの後に パラメーターが続く)である。使用できる小数点は Unicode U+002E FULL STOP (".") 文字(Unicode では PERIOD、dot、および decimal point とも呼ばれる)のみであり、その他の区切り 文字は許可されない [UNICODE]。 (例えば、パスデータストリーム内では次の 数値は無効である: "13,000.56"。 代わりに "13000.56" とする。)
コマンドの相対版では、すべての座標 値は、コマンド開始時の現在点を基準とする。
以下の表では、指定されたパスコマンドの構文を 記述するために次の表記を使用する:
パスコマンドの説明では、cpx および cpy は現在点の座標を表す。
| 名前: | d |
|---|---|
| 値: | none | <string> |
| 初期値: | none |
| 適用対象: | ‘path’ |
| 継承: | いいえ |
| パーセント値: | 該当なし |
| メディア: | 視覚 |
| 計算値: | 指定値のまま |
| アニメーション型: | 本文を参照 |
d プロパティは ‘path’ 要素の形状を指定するために使用される。
値 none は、 要素にパスデータがないことを示す。‘path’ 要素では、これは 要素がレンダリングされず、祖先 コンテナー要素の 境界ボックスにも 寄与しないことを意味する。
パスは複数の区間から構成され、明示的または 暗黙的な各コマンドは、moveto または closepath を除いて、 1 つの パス区間を定義する。
パスデータ内で指定されるすべての座標および長さは、 現在のユーザー座標系のユーザー単位であるものとして扱わなければならない。
<string> 値は、 パスデータ文字列を使用して図形を指定する。<string> 値の内容は、以下で定義される svg-path EBNF 文法に一致しなければならず、文字列内のエラーは パスデータのエラー処理の節の 規則に従って処理される。 パスデータ文字列に有効なコマンドが含まれていない場合、 動作は none 値と同じである。
アニメーションでは、2 つの d プロパティ値を 滑らかに補間できるのは、パスデータ文字列が 同じ構造(すなわち、まったく同じ数および型のパスデータ コマンドを同じ順序で含む)を持つ場合だけである。アニメーションが指定され、 パスデータコマンドのリストが同じ構造を持たない場合、 値は 補間 において 離散 アニメーション型を使用しなければならない。
from/by アニメーション または 加算アニメーションで、 指定されたアニメーション値に 互換性がない場合(すなわちパスデータコマンドリストが同じ 構造を持たない場合)、アニメーションは効果値を生成してはならない。 要素はアニメーションの継続中および アニメーション終了後も基本値を使用してレンダリングしなければならない。特に、 ‘fill’='freeze' が指定されている場合、凍結値は基本値でなければならない。
by アニメーションは定義上加算であるため、 基本値の パスデータコマンドリストと by 値に互換性がない場合、加算 合成は未定義となる。SMIL Animation: from, to, by および additive の動作を参照すること。
パスデータコマンドのリストが同じ構造を持つ場合、各 パスデータコマンドの各パラメーターは 補間 されなければならず、個別に実数として 補間される。フラグおよび真偽値は 0 と 1 の間の分数として補間し、0 以外の値は 1/true の値と見なさなければならない。
「d は(名前を 変更せず)パスデータ文字列を値とするプレゼンテーション属性になる」と ロンドン 編集者会議で決議された。
次の節では、パスデータ文字列で使用できる コマンドを列挙する。直線区間を 描くものには lineto コマンド (L, l, H, h, V および v) と close path コマンド (Z および z)がある。次の 3 つのコマンド群は曲線を描く:
"moveto" コマンド(M または m)は、新しい 初期点 と新しい現在点を確立しなければならない。その効果は「ペン」を持ち上げて 新しい位置へ移動したかのようになる。パスデータ区間(存在する場合)は "moveto" コマンドで開始しなければならない。後続の "moveto" コマンド(すなわち、"moveto" が最初のコマンドでない場合)は、新しい サブパスの開始を表す:
| コマンド | 名前 | パラメーター | 説明 |
|---|---|---|---|
| M(絶対) m(相対) |
moveto | (x y)+ | 指定された (x,y) 座標で新しいサブパスを開始する。 M(大文字)は絶対 座標が続くことを示し、m(小文字)は 相対座標が続くことを示す。moveto の後に 複数の座標ペアが続く場合、後続のペアは 暗黙の lineto コマンドとして扱われる。したがって、暗黙の lineto コマンドは、moveto が相対なら相対となり、 moveto が絶対なら絶対となる。相対 moveto (m)がパスの最初の要素として現れる場合、 絶対座標のペアとして扱われる。この 場合、後続の座標ペアは相対として扱われる。 最初の moveto 自体は絶対 moveto として解釈される。 |
相対 m コマンドを使用する場合、 移動先の位置は (cpx + x, cpy + y) である。
"closepath"(Z または z)は、 現在のサブパスをその 初期点へ接続して終了する。 現在点から現在のサブパスの 初期点まで、自動的に 直線が描かれる。この パス区間は長さ 0 でもよい。
"closepath" の直後に "moveto" が続く場合、 "moveto" は次のサブパスの開始点を識別する。 "closepath" の直後にその他のコマンドが続く場合、 次のサブパスは現在の サブパスと同じ初期点から開始する。
サブパスが "closepath" で終わる場合、 ‘stroke-linejoin’ および ‘stroke-linecap’ の 実装方法において、"lineto" コマンドによってサブパスを 「手動で」閉じた場合とは動作が異なる。"closepath" では、 サブパスの最後の区間の終端が、 現在の ‘stroke-linejoin’ の値を使用して、 サブパスの最初の区間の開始点と「結合」される。 代わりに "lineto" コマンドによってサブパスを「手動で」 閉じる場合、最初の区間の開始点と最後の 区間の終端は結合されず、それぞれ 現在の ‘stroke-linecap’ の値を使用してキャップされる。 コマンドの終了時、新しい現在点は 現在のサブパスの初期点に設定される。
| コマンド | 名前 | パラメーター | 説明 |
|---|---|---|---|
| Z または z |
closepath | (なし) | 現在のサブパスを、現在の サブパスの 初期点へ接続して閉じる(上の説明を参照)。 Z および z コマンドはパラメーターを取らないため、効果は同一である。 |
閉じたサブパスは "closepath" コマンドで閉じなければならず、これによって最初と最後の パス区間が「結合」される。 その他のパスはすべて 開いたサブパスである。
閉じたサブパスは、 最終座標がそのサブパスの 初期点である 開いたサブパスとは 動作が異なる。 開いたサブパスの最初と最後の パス区間は、 最後の パス区間の最終座標が サブパスの 初期点であっても、 結合されない。これにより、最初と最後の パス区間は、現在の stroke-linecap の値を使用してキャップされ、 現在の stroke-linejoin の値を使用して結合されることはない。
"closepath" の直後に "moveto" が続く場合、"moveto" は次のサブパスの開始点を 識別する。"closepath" の直後にその他の コマンドが続く場合、次のサブパスは現在のサブパスと同じ 初期 点から開始しなければならない。
各種 "lineto" コマンドは、 現在点から新しい点まで直線を描く:
| コマンド | 名前 | パラメーター | 説明 |
|---|---|---|---|
| L(絶対) l(相対) |
lineto | (x y)+ | 現在点から指定された (x,y) 座標まで線を描き、その座標が新しい現在点になる。 L(大文字)は絶対 座標が続くことを示し、l(小文字)は 相対座標が続くことを示す。複数の 座標ペアを指定してポリラインを描くことができる。 コマンドの終了時、新しい現在点は 最後に指定された座標の組に設定される。 |
| H(絶対) h(相対) |
水平 lineto | x+ | 現在点から水平線を描く。 H(大文字)は 絶対座標が続くことを示し、h (小文字)は相対座標が 続くことを示す。複数の x 値を指定できる(ただし通常 これは意味をなさない)。H または h コマンドは、y 座標に 0 を指定した L または l コマンドと等価である。 コマンドの終了時、新しい現在点は 最後の座標値から取得される。 |
| V(絶対) v(相対) |
垂直 lineto | y+ | 現在点から垂直線を描く。 V(大文字)は 絶対座標が続くことを示し、v (小文字)は相対座標が 続くことを示す。複数の y 値を指定できる(ただし通常 これは意味をなさない)。V または v コマンドは、x 座標に 0 を指定した L または l コマンドと等価である。 コマンドの終了時、新しい現在点は 最後の座標値から取得される。 |
相対 l コマンドを使用する場合、 線の終点は (cpx + x, cpy + y) である。
相対 h コマンドを使用する場合、 線の終点は (cpx + x, cpy) である。これは、 正の x 値を持つ h コマンドが、 正の x 軸方向に水平線を描くことを意味する。
相対 v コマンドを使用する場合、 線の終点は (cpx, cpy + y) である。
3 次ベジェコマンドは次のとおり:
| コマンド | 名前 | パラメーター | 説明 |
|---|---|---|---|
| C(絶対) c(相対) |
curveto | (x1 y1 x2 y2 x y)+ | 現在点から (x,y) まで 3 次ベジェ曲線を 描く。曲線の開始側の制御点として (x1,y1)、 曲線の終了側の制御点として (x2,y2) を使用する。 C(大文字)は 絶対座標が続くことを示し、 c(小文字)は相対 座標が続くことを示す。複数の座標組を 指定してポリベジェを描くことができる。コマンドの 終了時、新しい現在点は、 ポリベジェで使用された最後の (x,y) 座標ペアになる。 |
| S(絶対) s(相対) |
省略形/滑らかな curveto | (x2 y2 x y)+ | 現在点から (x,y) まで 3 次ベジェ曲線を描く。 最初の制御点は、現在点に対する 前のコマンドの 2 番目の制御点の反射であると仮定される。 (前のコマンドが存在しない場合、または前のコマンドが C, c, S, s のいずれでもない場合、最初の制御点は 現在点と一致すると仮定する。)(x2,y2) は 2 番目の制御 点(すなわち曲線の終端側の制御点)である。 S(大文字)は絶対 座標が続くことを示し、s(小文字)は 相対座標が続くことを示す。複数の 座標組を指定して ポリベジェを描くことができる。コマンドの終了時、新しい 現在点は、ポリベジェで使用された最後の (x,y) 座標ペアになる。 |
相対 c または s コマンドを使用する場合、各相対座標ペアは m コマンドの場合と同様に計算される。 例えば、両コマンドの曲線の最終制御点は (cpx + x, cpy + y) である。
cubic01 の例は、 パス内での 3 次ベジェコマンドの簡単な 使用例を示す。この例では内部 CSS スタイルシートを使用して スタイルプロパティを割り当てている。"S" コマンドの制御点は、 "S" コマンドの開始点を基準として 前の "C" コマンドの制御点を反射したものとして 自動的に計算されることに注意すること。
<?xml version="1.0" standalone="no"?>
<svg width="5cm" height="4cm" viewBox="0 0 500 400"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<title>cubic01 の例 - パスデータ内の 3 次ベジェコマンド</title>
<desc>"C" と "S" の両コマンドを使用した
パスデータの簡単な例と、
制御点および終点を示す注釈を
表す図</desc>
<style type="text/css"><![CDATA[
.Border { fill:none; stroke:blue; stroke-width:1 }
.Connect { fill:none; stroke:#888888; stroke-width:2 }
.SamplePath { fill:none; stroke:red; stroke-width:5 }
.EndPoint { fill:none; stroke:#888888; stroke-width:2 }
.CtlPoint { fill:#888888; stroke:none }
.AutoCtlPoint { fill:none; stroke:blue; stroke-width:4 }
.Label { font-size:22; font-family:Verdana }
]]></style>
<rect class="Border" x="1" y="1" width="498" height="398" />
<polyline class="Connect" points="100,200 100,100" />
<polyline class="Connect" points="250,100 250,200" />
<polyline class="Connect" points="250,200 250,300" />
<polyline class="Connect" points="400,300 400,200" />
<path class="SamplePath" d="M100,200 C100,100 250,100 250,200
S400,300 400,200" />
<circle class="EndPoint" cx="100" cy="200" r="10" />
<circle class="EndPoint" cx="250" cy="200" r="10" />
<circle class="EndPoint" cx="400" cy="200" r="10" />
<circle class="CtlPoint" cx="100" cy="100" r="10" />
<circle class="CtlPoint" cx="250" cy="100" r="10" />
<circle class="CtlPoint" cx="400" cy="300" r="10" />
<circle class="AutoCtlPoint" cx="250" cy="300" r="9" />
<text class="Label" x="25" y="70">M100,200 C100,100 250,100 250,200</text>
<text class="Label" x="325" y="350"
style="text-anchor:middle">S400,300 400,200</text>
</svg>
cubic01 の例
次の図は、制御点の位置に応じて 3 次ベジェ曲線の形状がどのように変化するかを示している。 最初の 5 つの例は単一の 3 次ベジェ パス区間を示す。右下の例は "C" コマンドの後に "S" コマンドが続く場合を示す。

この
例を SVG として表示(SVG 対応ブラウザーのみ)
2 次ベジェコマンドは次のとおり:
| コマンド | 名前 | パラメーター | 説明 |
|---|---|---|---|
| Q(絶対) q(相対) |
2 次ベジェ curveto | (x1 y1 x y)+ | 現在点から (x,y) まで、 (x1,y1) を制御点として使用して 2 次ベジェ曲線を描く。 Q(大文字)は絶対 座標が続くことを示し、q(小文字)は 相対座標が続くことを示す。複数の 座標組を指定して ポリベジェを描くことができる。コマンドの終了時、新しい 現在点は、ポリベジェで使用された最後の (x,y) 座標ペアになる。 |
| T(絶対) t(相対) |
省略形/滑らかな 2 次ベジェ curveto | (x y)+ | 現在点から (x,y) まで 2 次ベジェ曲線を描く。 制御点は、現在点を基準とした 前のコマンドの制御点の反射であると仮定される。 (前の コマンドが存在しない場合、または前のコマンドが Q, q, T, t のいずれでもない場合、 制御点は現在点と一致すると 仮定する。)T(大文字)は 絶対座標が続くことを示し、t (小文字)は相対座標が 続くことを示す。コマンドの終了時、新しい現在点は ポリベジェで使用された最後の (x,y) 座標ペアになる。 |
相対 q または t コマンドを使用する場合、各相対座標ペアは m コマンドの場合と同様に計算される。 例えば、両コマンドの曲線の最終制御点は (cpx + x, cpy + y) である。
quad01 の例は、 パス内での 2 次ベジェコマンドの簡単な 使用例を示す。"T" コマンドの制御点は、 "T" コマンドの開始点を基準として 前の "Q" コマンドの制御点を反射したものとして 自動的に計算されることに注意すること。
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="6cm" viewBox="0 0 1200 600"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<title>quad01 の例 - パスデータ内の 2 次ベジェコマンド</title>
<desc>"Q" と "T" コマンドを示し、
制御点および終点を示す注釈を
添えた図</desc>
<rect x="1" y="1" width="1198" height="598"
fill="none" stroke="blue" stroke-width="1" />
<path d="M200,300 Q400,50 600,300 T1000,300"
fill="none" stroke="red" stroke-width="5" />
<!-- 終点 -->
<g fill="black" >
<circle cx="200" cy="300" r="10"/>
<circle cx="600" cy="300" r="10"/>
<circle cx="1000" cy="300" r="10"/>
</g>
<!-- 制御点、および終点から制御点までの線 -->
<g fill="#888888" >
<circle cx="400" cy="50" r="10"/>
<circle cx="800" cy="550" r="10"/>
</g>
<path d="M200,300 L400,50 L600,300
L800,550 L1000,300"
fill="none" stroke="#888888" stroke-width="2" />
</svg>
quad01 の例
| SVG 2 要件: | SVG パス構文で弧をより簡単に描けるようにする。 |
|---|---|
| 決議: | パス内の弧をより簡単にする。 |
| 目的: | 著者が弧を含むパスデータを手書きしやすくするため。 |
| 担当者: | Cameron (ACTION-3151) |
楕円弧コマンドは次のとおり:
| コマンド | 名前 | パラメーター | 説明 |
|---|---|---|---|
| A(絶対) a(相対) |
楕円弧 | (rx ry x-axis-rotation large-arc-flag sweep-flag x y)+ | 現在点から (x, y) まで楕円弧を描く。楕円の大きさと 向きは 2 つの半径 (rx, ry) および x-axis-rotation によって定義される。これは現在の 座標系に対して楕円全体が 何度回転するかを示す。楕円の中心 (cx, cy) は、 その他のパラメーターによって課される制約を満たすよう 自動的に計算される。large-arc-flag および sweep-flag は自動 計算に寄与し、弧の描画方法を決定する。 |
相対 a コマンドを使用する場合、弧の終点は (cpx + x, cpy + y) である。
arcs01 の例は、 パス内での arc コマンドの簡単な使用例を示す。
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="5.25cm" viewBox="0 0 1200 400"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<title>arcs01 の例 - パスデータ内の arc コマンド</title>
<desc>2 つの扇形を持つ円グラフと
弧状の突起を持つ線の図</desc>
<rect x="1" y="1" width="1198" height="398"
fill="none" stroke="blue" stroke-width="1" />
<path d="M300,200 h-150 a150,150 0 1,0 150,-150 z"
fill="red" stroke="blue" stroke-width="5" />
<path d="M275,175 v-150 a150,150 0 0,0 -150,150 z"
fill="yellow" stroke="blue" stroke-width="5" />
<path d="M600,350 l 50,-25
a25,25 -30 0,1 50,-25 l 50,-25
a25,50 -30 0,1 50,-25 l 50,-25
a25,75 -30 0,1 50,-25 l 50,-25
a25,100 -30 0,1 50,-25 l 50,-25"
fill="none" stroke="red" stroke-width="5" />
</svg>
arcs01 の例
楕円弧コマンドは、 次の制約を満たさなければならない楕円の一部分を描く:
ほとんどの場合、実際にはこれらの制約を 満たす 4 つの異なる弧 (2 つの異なる楕円、それぞれに 2 つの異なる弧の掃引)が存在する。 large-arc-flag および sweep-flag は、4 つのうちどの 弧を描くかを次のように示す:
以下は large-arc-flag と sweep-flag の 4 つの組み合わせと、これらのフラグ値に基づいて描かれる 4 つの異なる弧を示す。各場合について、 次のパスデータコマンドを使用した:
<path d="M 125,75 a100,50 0 ?,? 100,50"
style="fill:none; stroke:red; stroke-width:6"/>
ここで "?,?" を "0,0" "0,1" "1,0" および "1,1" に置き換えて、 4 つの可能な場合を生成する。
この 例を SVG として表示(SVG 対応ブラウザーのみ)
パスデータの楕円弧コマンドに関する詳細な実装上の注記については、 範囲外の楕円弧パラメーターの節を参照すること。
実装上の注記の付録には、 SVG の arc 記法を中心点と弧の掃引を使用する形式へ 変換する必要があるソフトウェアに関連する数式が記載されている。
SVG パスデータは次の EBNF 文法に一致する。
svg_path::= wsp* (moveto (wsp* drawto_command)*)? wsp*
drawto_command::=
moveto
| closepath
| lineto
| horizontal_lineto
| vertical_lineto
| curveto
| smooth_curveto
| quadratic_bezier_curveto
| smooth_quadratic_bezier_curveto
| elliptical_arc
moveto::=
( "M" | "m" ) wsp* coordinate_pair_sequence
closepath::=
("Z" | "z")
lineto::=
("L"|"l") wsp* coordinate_pair_sequence
horizontal_lineto::=
("H"|"h") wsp* coordinate_sequence
vertical_lineto::=
("V"|"v") wsp* coordinate_sequence
curveto::=
("C"|"c") wsp* curveto_coordinate_sequence
curveto_coordinate_sequence::=
coordinate_pair_triplet
| (coordinate_pair_triplet comma_wsp? curveto_coordinate_sequence)
smooth_curveto::=
("S"|"s") wsp* smooth_curveto_coordinate_sequence
smooth_curveto_coordinate_sequence::=
coordinate_pair_double
| (coordinate_pair_double comma_wsp? smooth_curveto_coordinate_sequence)
quadratic_bezier_curveto::=
("Q"|"q") wsp* quadratic_bezier_curveto_coordinate_sequence
quadratic_bezier_curveto_coordinate_sequence::=
coordinate_pair_double
| (coordinate_pair_double comma_wsp? quadratic_bezier_curveto_coordinate_sequence)
smooth_quadratic_bezier_curveto::=
("T"|"t") wsp* coordinate_pair_sequence
elliptical_arc::=
( "A" | "a" ) wsp* elliptical_arc_argument_sequence
elliptical_arc_argument_sequence::=
elliptical_arc_argument
| (elliptical_arc_argument comma_wsp? elliptical_arc_argument_sequence)
elliptical_arc_argument::=
number comma_wsp? number comma_wsp? number comma_wsp
flag comma_wsp? flag comma_wsp? coordinate_pair
coordinate_pair_double::=
coordinate_pair comma_wsp? coordinate_pair
coordinate_pair_triplet::=
coordinate_pair comma_wsp? coordinate_pair comma_wsp? coordinate_pair
coordinate_pair_sequence::=
coordinate_pair | (coordinate_pair comma_wsp? coordinate_pair_sequence)
coordinate_sequence::=
coordinate | (coordinate comma_wsp? coordinate_sequence)
coordinate_pair::= coordinate comma_wsp? coordinate
coordinate::= sign? number
sign::= "+"|"-"
exponent::= ("e" | "E") sign? digit+
fractional-constant::= (digit* "." digit+) | digit+
number::= fractional-constant exponent?
flag::= ("0" | "1")
comma_wsp::= (wsp+ ","? wsp*) | ("," wsp*)
wsp::= (#x9 | #x20 | #xA | #xC | #xD)
digit::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
EBNF の処理では、指定された EBNF 生成規則に一致する部分を可能な限り多く消費し、 生成規則を満たさなくなる 文字に遭遇した時点で停止しなければならない。したがって文字列 "M 100-200" では、"moveto" の最初の 座標は文字 "100" を消費し、 マイナス記号に遭遇した時点で停止する。これは "coordinate" の生成規則では数字の後にマイナス記号を 続けることができないためである。その結果、最初の座標は "100"、 2 番目の座標は "-200" となる。
同様に、文字列 "M 0.6.5" では、"moveto" の最初の座標は 文字 "0.6" を消費し、 2 番目の小数点に遭遇した時点で停止する。これは "coordinate" の生成規則では小数点を 1 つだけ許可するためである。 その結果、最初の座標は "0.6"、2 番目の 座標は ".5" となる。
以前の仕様の
文法では、数値に
小数部の数字を伴わない末尾の小数点(例えば 23.)を許可していた。SVG 2 は数値の解析を
CSS [css-syntax-3] と調和させ、
この緩和された数値文法を許可しない。ただし、ユーザーエージェントは
解析が曖昧でない場合、末尾に小数点を持つ数値を引き続き
受け入れてもよい。
著者およびオーサリングツールは、許可されない数値形式を使用してはならない。
EBNF は d プロパティ内のパスデータ文字列が空であることを許可する。 空のパスデータ文字列はパスのレンダリングを無効にする。 d プロパティが none の値を持つ場合もレンダリングは無効になる。
文法に一致しないパスデータに遭遇した場合、パスデータはエラー状態になる (エラー処理を参照)。
マーカーの 向きや 線端の 形状など、 一部の機能は、パス上の指定された距離における パスの方向、または個々の区間の開始点または終点における方向によって 定義される。
パスに沿った指定された距離における パスの方向は、 次のように定義される:
パス区間の開始点における 方向は、次のように定義される:
パス 区間の終点における方向は次のように定義される:
適合 SVG ユーザーエージェントは、パスデータを使用する機能を 次の詳細に従って実装しなければならない:
すべての楕円弧パラメーター (真偽フラグを除く)には任意の数値を指定できるが、 ユーザーエージェントは曲線をレンダリングしたりジオメトリを計算したりするとき、 無効な値に対して次の調整を行わなければならない:
区間の終点 (x, y) が 現在点 (例えば前の区間の終点)と同一である場合、 これは楕円弧区間全体を省略することと等価である。
rx または ry のいずれかが 0 の場合、 この弧は終点同士を結ぶ直線区間 ("lineto")として扱われる。
rx または ry のいずれかに 負の符号がある場合、その符号は除去され、 代わりに絶対値が使用される。
rx, ry および x-axis-rotation の組み合わせに解が存在しない場合 (基本的には、現在点から 新しい終点へ到達するには楕円が小さすぎる場合)、 解がちょうど 1 つになるまで 楕円を一様に拡大する(楕円が ちょうど十分な大きさになるまで)。
この拡大操作の数式については、付録の 範囲外の半径の補正 を参照すること。
この寛容でありながら一貫した範囲外 値の扱いにより、次のことが保証される:
S/s および T/t コマンドは、指定された 3 次ベジェ区間の最初の制御点が、 現在点を基準として 前のパス区間の最後の制御点を反射することで 計算されることを示す。正確な計算は次のとおり。
現在点が (curx, cury) で、前の パス区間の 最後の制御点が (oldx2, oldy2) の場合、反射点(すなわち、現在の パス区間の最初の制御点 (newx1, newy1))は 次のとおり:
(newx1, newy1) = (curx - (oldx2 - curx), cury - (oldy2 - cury))
= (2*curx - oldx2, 2*cury - oldy2)
長さ 0 のパス区間は無効ではなく、 次の場合にはレンダリングに影響する:
パス上のテキスト、モーションアニメーション および各種 ストローク 操作を含むさまざまな操作では、ユーザーエージェントが ‘path’ などのグラフィックス要素の ジオメトリに沿った距離を計算する必要がある。
パスに沿った距離を計算する正確な数学は存在するが、 数式は非常に複雑であり、多大な 計算を必要とする。オーサリング製品およびユーザー エージェントには、可能な限り正確な結果を生成する アルゴリズムを使用することが推奨される。ただし、実装差を 許容し、距離計算が著者の意図に 近い結果を生成できるようにするため、‘pathLength’ 属性を使用して、 パス全体の長さについての著者による計算値を 提供できる。これにより、ユーザーエージェントは、 ‘pathLength’ と ユーザーエージェント自身が計算したパス全体の長さの比率によって、 パスに沿った距離の計算を拡大縮小できる。
‘path’ 要素内の "moveto" 操作は 長さ 0 と定義される。"lineto", "curveto" および "arcto" コマンドのみがパス長の計算に寄与する。
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| pathLength | <number> | (none) | はい |
ユーザー単位による、著者が計算したパス全体の長さ。 この値は、 ユーザーエージェント自身の パスに沿った距離の 計算を著者の計算に合わせて調整するために使用される。ユーザーエージェントは、 すべてのパスに沿った距離の計算を、 ‘pathLength’ と ユーザー エージェント自身が計算したパス全体の長さの比率で拡大縮小する。‘pathLength’ は、 パス上のテキスト、 モーションアニメーション および 各種 ストローク操作の計算に影響する可能性がある。
0 の値は有効であり、無限大の拡大縮小係数として扱わなければならない。 0 を無限大で拡大縮小しても 0 のままでなければならず、0 より大きいパーセント値でない値は +Infinity にならなければならない。
負の値はエラーである(エラー処理を参照)。
‘pathLength’ は、 パーセント値による パスに沿った距離の計算には影響しない。
| 名前: | path-length |
|---|---|
| 値: | none | <length> [0,∞] |
| 初期値: | none |
| 適用対象: | ‘path’, ‘circle’, ‘ellipse’, ‘line’, ‘polygon’, ‘polyline’, ‘rect’ |
| 継承: | いいえ |
| パーセント値: | 該当なし |
| メディア: | 視覚 |
| 計算値: | キーワード none、または絶対長 |
| アニメーション型: | 計算値による |
path-length プロパティは、 パス全体の長さについての著者による 計算値を提供する。この値は、ユーザーエージェント自身の パスに沿った距離の 計算を著者の計算に合わせて調整するために使用される。
値 none は、 著者によるパス長が指定されておらず、 ユーザーエージェント自身が計算した パス長が使用されることを示す。
<length> 値は 0 以上でなければならない。 0 の値は有効であり、無限大の拡大縮小係数として 扱わなければならない。 0 を無限大で拡大縮小しても 0 のままでなければならず、 0 より大きい値は +Infinity にならなければならない。
SVG の ‘pathLength’
属性は、
path-length CSS プロパティへ
プレゼンテーション属性としてマッピングされる。
属性の単位なし数値は、px 単位の
<length> 値として解釈される。
‘pathLength’
属性値が存在せず、
path-length プロパティの計算値が
none の場合、著者による拡大縮小は適用されない。
path-length プロパティは次に影響する:
path-length は、パーセント値による パスに沿った距離の 計算には影響しない。
CSS ワーキンググループは、 path-length を CSS プロパティとして追加し、 ‘pathLength’ をそれへマッピングすることを決議した (2020 年 1 月 22 日の議事録)。
SVGPathElement オブジェクトは、 DOM 内の ‘path’ を表す。
[Exposed=Window] interface SVGPathElement : SVGGeometryElement { };
SVG には次の基本図形要素の集合が含まれる:
数学的には、これらの図形要素は、 同じ図形を構築する ‘path’ 要素と 等価である。基本 図形にはストロークや塗りを適用でき、クリッピングパスとして使用できる。 ‘path’ 要素で利用できるすべてのプロパティは、基本 図形にも適用される。
各図形の 等価パスとストロークを計算するアルゴリズム は、以下の図形の節で定義される。
以下の ‘rect’, ‘circle’ および ‘ellipse’ の 等価パスは、 それぞれ長さ 0 の線を描く closepath で終わる。 これはその直前のコマンドがすでに 初期点で終わっているためである。 長さ 0 の線は、図形の塗りやストロークの方法を変えない。 頂点マーカーが配置される位置には影響し得るが、 これらの要素上のマーカーは 頂点マーカーの規則によって配置され、 各図形について列挙されたコマンド数によって配置されるのではない。
‘rect’ 要素は、 現在の ユーザー座標 系の軸に揃った矩形を定義する。rx および ry ジオメトリプロパティに 0 以外の値を設定することで角丸矩形を作成できる。
x および y 座標は、現在のユーザー座標系における矩形の左辺と上辺を参照する。
width および height プロパティは、矩形全体の幅と高さを定義する。 いずれかのプロパティの負の値は無効であり、無視しなければならない。 いずれかの寸法の計算値が 0 の場合、要素のレンダリングは無効になる。
角丸矩形では、
rx および ry プロパティの計算値が、
矩形の角を丸めるために使用する楕円弧の x 軸半径および y 軸半径を定義する。
弧は常に水平軸と垂直軸の両方に対して対称である。均一でない
角丸を持つ矩形を作成するには、‘path’
を使用して図形を明示的に定義する。
いずれかのプロパティの負の値は無効であり、無視しなければならない。
いずれかの寸法の計算値が 0 の場合、
または両方の寸法の計算値が auto の場合、
角丸のない矩形になる。
x 軸および y 軸の角丸半径の使用値は、
他方の寸法から暗黙に決定される場合があり(auto 値を使用)、
また矩形の直線区間の長さが決して負にならないよう
クランプの対象にもなる。
rx および ry の使用値は、
計算値から次の手順を順に実行して決定される:
auto の場合
(auto は両プロパティの初期値であるため、著者がどちらも
指定しなかった場合や、著者が指定した値がすべて無効な場合も同様)、
rx および ry の使用値は両方とも 0 である。(これにより角は直角になる。)
auto の場合、
rx に相当する絶対長を計算し、パーセント値は矩形の使用 width に対して解決する。
ry の絶対値も同じである。
auto の場合、
ry に相当する絶対長を計算し、パーセント値は矩形の使用 height に対して解決する。
rx の絶対値も同じである。
数学的には、‘rect’ 要素は、次のように 等価な ‘path’ 要素へ写像される。 その前に、 絶対使用値 x, y, width, height, rx, および rx をユーザー座標系のユーザー単位で生成し、 各等価ジオメトリプロパティについて 上記および単位で指定された規則に従う:
パス分解は、 2013 年 6 月 3 日の電話会議で決議された。
rect01 の例は、 角が鋭い矩形を示す。‘rect’ 要素は黄色で塗りつぶされ、 ネイビーでストロークされる。
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="4cm" viewBox="0 0 1200 400"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<desc>rect01 の例 - 角が鋭い矩形</desc>
<!-- 'rect' 要素を使用してビューポートの輪郭を表示 -->
<rect x="1" y="1" width="1198" height="398"
fill="none" stroke="blue" stroke-width="2"/>
<rect x="400" y="100" width="400" height="200"
fill="yellow" stroke="navy" stroke-width="10" />
</svg>
rect01 の例
rect02 の例は 2 つの角丸矩形を示す。rx は、 矩形の角をどのように丸めるかを指定する。 ry 属性には値が指定されていないため、その使用値は rx 属性から導出されることに注意すること。
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="4cm" viewBox="0 0 1200 400"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<desc>rect02 の例 - 角丸矩形</desc>
<!-- 'rect' 要素を使用してビューポートの輪郭を表示 -->
<rect x="1" y="1" width="1198" height="398"
fill="none" stroke="blue" stroke-width="2"/>
<rect x="100" y="100" width="400" height="200" rx="50"
fill="green" />
<g transform="translate(700 210) rotate(-30)">
<rect x="0" y="0" width="400" height="200" rx="50"
fill="none" stroke="purple" stroke-width="30" />
</g>
</svg>
rect02 の例
‘circle’ 要素は、 中心点と 半径に基づいて円を定義する。
r 属性は円の半径を定義する。 負の値は無効であり、無視しなければならない。 計算値が 0 の場合、要素のレンダリングは無効になる。
数学的には、‘circle’ 要素は、 4 つの 楕円 弧区間からなる等価な ‘path’ 要素へ 写像され、それぞれが円の 4 分の 1 を覆う。パスは 半径上の「3 時」の点から始まり、 時計回り方向へ進む(変換前)。 arc コマンドの rx および ry パラメーターは、 ローカルユーザー単位へ変換した後の r プロパティの使用値に どちらも等しく、 x-axis-rotation および large-arc-flag は 0 に設定され、 sweep-flag は 1 に設定される。 座標は次のように計算される。 ここで cx, cy, および r は、等価なプロパティの使用値を ユーザー単位へ変換したものである:
パス分解は、 2013 年 6 月 3 日の電話会議で決議された。
例 circle01 は ‘circle’ 要素からなり、赤で塗りつぶされ、 青でストロークされる。
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="4cm" viewBox="0 0 1200 400"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<desc>circle01 の例 - 赤で塗りつぶし青でストロークした円</desc>
<!-- 'rect' 要素を使用してビューポートの輪郭を表示 -->
<rect x="1" y="1" width="1198" height="398"
fill="none" stroke="blue" stroke-width="2"/>
<circle cx="600" cy="200" r="100"
fill="red" stroke="blue" stroke-width="10" />
</svg>
circle01 の例
‘ellipse’ 要素は、 中心点と 2 つの半径に基づいて、 現在の ユーザー座標 系の軸に揃った楕円を定義する。
rx および ry プロパティは、
楕円の x 軸半径および y 軸半径を定義する。
いずれかのプロパティの負の値は無効であり、無視しなければならない。
いずれかの寸法の計算値が 0 の場合、
または両方の寸法の計算値が auto の場合、
要素のレンダリングは無効になる。
rx または ry のいずれかの auto 値は、
上で矩形について示した規則に従って使用値へ変換される
(ただし width または height に基づくクランプは行わない)。
実質的に、auto 値は、
1 つの次元のみで表現された値によって半径が定義される円形を作成する。
これにより、次のいずれかで定義された半径を持つ円を作成できる:
SVG 2 で新しく追加された。
rx および ry の auto 値は、
楕円と矩形の両方についてこれらのプロパティを一貫して
解析できるよう追加された。
以前は、rx または ry のいずれかが指定されていない場合、
楕円はレンダリングされなかった。
数学的には、‘ellipse’ 要素は、 4 つの 楕円 弧区間からなる等価な ‘path’ 要素へ 写像され、それぞれが楕円の 4 分の 1 を覆う。パスは 半径上の「3 時」の点から始まり、 時計回り方向へ進む(変換前)。 arc コマンドの rx および ry パラメーターは、 ローカルユーザー単位へ変換した後の対応するプロパティの使用値であり、 x-axis-rotation および large-arc-flag は 0 に設定され、 sweep-flag は 1 に設定される。 座標は次のように計算される。 ここで cx, cy, rx, および ry は、対応するプロパティの使用値をユーザー単位へ変換したものである:
パス分解は、 2013 年 6 月 3 日の電話会議で決議された。
以下の ellipse01 の例は、 ‘svg’ 要素上の ‘viewBox’ 属性と、‘g’ および ‘ellipse’ 要素上の transform プロパティによって確立される ユーザー座標系内で 2 つの楕円の座標を指定する。両方の 楕円は、cx および cy 属性(楕円の中心)の 既定値 0 を使用する。2 番目の楕円は回転している。
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="4cm" viewBox="0 0 1200 400"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<desc>ellipse01 の例 - 楕円の例</desc>
<!-- 'rect' 要素を使用してビューポートの輪郭を表示 -->
<rect x="1" y="1" width="1198" height="398"
fill="none" stroke="blue" stroke-width="2" />
<g transform="translate(300 200)">
<ellipse rx="250" ry="100"
fill="red" />
</g>
<ellipse transform="translate(900 200) rotate(-30)"
rx="250" ry="100"
fill="none" stroke="blue" stroke-width="20" />
</svg>
ellipse01 の例
‘line’ 要素は、 ある点から始まり 別の点で終わる線分を定義する。
属性定義:
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| x1, y1 | <length-percentage> | <number> | 0 | はい |
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| x2, y2 | <length-percentage> | <number> | 0 | はい |
将来の仕様では、‘x1’, ‘y1’, ‘x2’, および ‘y2’ 属性をジオメトリ プロパティへ変換する可能性がある。 現在、これらは要素属性によってのみ指定でき、CSS では指定できない。
数学的には、‘line’ 要素は、 単位に従って座標をユーザー座標系のユーザー単位へ変換し、 x1, y1, x2, および y2 の値を生成した後、 次のように等価な ‘path’ 要素へ 写像できる:
‘line’ 要素は 単一の線であり、したがって幾何学的には 1 次元であるため内部を持たない。そのため、‘line’ 要素が 塗りつぶされることはない(fill プロパティを参照)。
以下の line01 の例は、 ‘svg’ 要素上の ‘viewBox’ 属性によって確立されるユーザー座標系で 5 本の線の座標を指定する。各 線の太さは異なる。
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="4cm" viewBox="0 0 1200 400"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<desc>line01 の例 - ユーザー座標で表された線</desc>
<!-- 'rect' 要素を使用してビューポートの輪郭を表示 -->
<rect x="1" y="1" width="1198" height="398"
fill="none" stroke="blue" stroke-width="2" />
<g stroke="green" >
<line x1="100" y1="300" x2="300" y2="100"
stroke-width="5" />
<line x1="300" y1="300" x2="500" y2="100"
stroke-width="10" />
<line x1="500" y1="300" x2="700" y2="100"
stroke-width="15" />
<line x1="700" y1="300" x2="900" y2="100"
stroke-width="20" />
<line x1="900" y1="300" x2="1100" y2="100"
stroke-width="25" />
</g>
</svg>
line01 の例
‘polyline’ 要素は、 接続された直線 区間の集合を定義する。通常、‘polyline’ 要素は開いた 図形を定義する。
属性定義:
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| points | <points> | (none) | はい |
ここで:
ポリラインを構成する点。すべての座標 値はユーザー座標系内にある。
奇数個の座標が指定された場合、要素は エラー状態となり、不正に 指定された ‘path’ 要素の場合と同じユーザーエージェント動作になる。このようなエラーの場合、ユーザーエージェントは 最後の奇数番目の座標を破棄し、それ以外は図形をレンダリングする。
初期値 (none) は、polyline 要素が 有効だがレンダリングされないことを示す。
将来の仕様では、‘points’ 属性を ジオメトリプロパティへ変換する可能性がある。 現在、この属性は要素属性によってのみ指定でき、CSS では指定できない。
数学的には、‘polyline’ 要素は、次のように 等価な ‘path’ 要素へ 写像できる:
以下の polyline01 の例は、 ‘svg’ 要素上の ‘viewBox’ 属性によって確立されるユーザー座標系内で ポリラインを指定する。
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="4cm" viewBox="0 0 1200 400"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<desc>polyline01 の例 - 次第に大きくなる棒</desc>
<!-- 'rect' 要素を使用してビューポートの輪郭を表示 -->
<rect x="1" y="1" width="1198" height="398"
fill="none" stroke="blue" stroke-width="2" />
<polyline fill="none" stroke="blue" stroke-width="10"
points="50,375
150,375 150,325 250,325 250,375
350,375 350,250 450,250 450,375
550,375 550,175 650,175 650,375
750,375 750,100 850,100 850,375
950,375 950,25 1050,25 1050,375
1150,375" />
</svg>
polyline01 の例
‘polygon’ 要素は、 接続された直線区間の集合からなる 閉じた図形を定義する。
属性定義:
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| points | <points> | (none) | はい |
多角形を構成する点。すべての座標 値はユーザー座標系内にある。
奇数個の座標が指定された場合、要素は エラー状態となり、不正に 指定された ‘path’ 要素の場合と同じユーザーエージェント動作になる。
初期値 (none) は、polygon 要素が 有効だがレンダリングされないことを示す。
将来の仕様では、‘points’ 属性を ジオメトリプロパティへ変換する可能性がある。 現在、この属性は要素属性によってのみ指定でき、CSS では指定できない。
数学的には、‘polygon’ 要素は、次のように 等価な ‘path’ 要素へ 写像できる:
以下の 例 polygon01は、‘svg’ 要素上の ‘viewBox’ 属性によって確立される ユーザー座標系内で 2 つの多角形(星形と六角形)を指定する。
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="4cm" viewBox="0 0 1200 400"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<desc>polygon01 の例 - 星形と六角形</desc>
<!-- 'rect' 要素を使用してビューポートの輪郭を表示 -->
<rect x="1" y="1" width="1198" height="398"
fill="none" stroke="blue" stroke-width="2" />
<polygon fill="red" stroke="blue" stroke-width="10"
points="350,75 379,161 469,161 397,215
423,301 350,250 277,301 303,215
231,161 321,161" />
<polygon fill="lime" stroke="blue" stroke-width="10"
points="850,75 958,137.5 958,262.5
850,325 742,262.6 742,137.5" />
</svg>
polygon01 の例
SVGRectElement オブジェクトは、 DOM 内の ‘rect’ 要素を 表す。
[Exposed=Window] interface SVGRectElement : SVGGeometryElement { [SameObject] readonly attribute SVGAnimatedLength x; [SameObject] readonly attribute SVGAnimatedLength y; [SameObject] readonly attribute SVGAnimatedLength width; [SameObject] readonly attribute SVGAnimatedLength height; [SameObject] readonly attribute SVGAnimatedLength rx; [SameObject] readonly attribute SVGAnimatedLength ry; };
x, y, width, height, rx および ry IDL 属性は、 x, y, width, height, rx および ry プロパティの計算値と、それぞれ対応するプレゼンテーション属性を 反映する。
SVGCircleElement オブジェクトは、 DOM 内の ‘circle’ 要素を表す。
[Exposed=Window] interface SVGCircleElement : SVGGeometryElement { [SameObject] readonly attribute SVGAnimatedLength cx; [SameObject] readonly attribute SVGAnimatedLength cy; [SameObject] readonly attribute SVGAnimatedLength r; };
cx, cy および r IDL 属性は、 cx, cy および r プロパティの計算値と、それぞれ対応するプレゼンテーション 属性を 反映する。
SVGEllipseElement オブジェクトは、 DOM 内の ‘ellipse’ 要素を表す。
[Exposed=Window] interface SVGEllipseElement : SVGGeometryElement { [SameObject] readonly attribute SVGAnimatedLength cx; [SameObject] readonly attribute SVGAnimatedLength cy; [SameObject] readonly attribute SVGAnimatedLength rx; [SameObject] readonly attribute SVGAnimatedLength ry; };
cx, cy, rx および ry IDL 属性は、 cx, cy, rx および ry プロパティの計算値 と、それぞれ対応するプレゼンテーション属性を 反映する。
[Exposed=Window] interface SVGLineElement : SVGGeometryElement { [SameObject] readonly attribute SVGAnimatedLength x1; [SameObject] readonly attribute SVGAnimatedLength y1; [SameObject] readonly attribute SVGAnimatedLength x2; [SameObject] readonly attribute SVGAnimatedLength y2; };
x1, y1, x2 および y2 IDL 属性は、 ‘x1’, ‘y1’, ‘x2’ および ‘y2’ コンテンツ属性を、それぞれ 反映する
SVGAnimatedPoints インターフェイスは、 ‘polygon’ または ‘polyline’ 要素上の ‘points’ 属性を 反映するために使用される。これは SVGPolygonElement および SVGPolylineElement インターフェイスにミックスインされる。
interface mixin SVGAnimatedPoints {
[SameObject] readonly attribute SVGPointList points;
[SameObject] readonly attribute SVGPointList animatedPoints;
};
points IDL 属性は、 反映される属性の現在の非アニメーション値を表す。 points を取得すると、 反映される属性の基本 値を反映する SVGPointList オブジェクトが返される。
animatedPoints IDL 属性は、 反映される属性の現在の非アニメーション値を表す。 animatedPoints を取得すると、 反映される属性のアニメーション 値を反映する SVGPointList オブジェクトが返される。
points および animatedPoints から返されるオブジェクトは、 現在その属性に影響するアニメーションがない場合でも異なるオブジェクトでなければならない。
SVGPointList インターフェイスは、 要素が SVGPoint オブジェクトである リストインターフェイスである。SVGPointList オブジェクトは点のリストを表す。
[Exposed=Window] interface SVGPointList { readonly attribute unsigned long length; readonly attribute unsigned long numberOfItems; undefined clear(); SVGPoint initialize(SVGPoint newItem); getter SVGPoint getItem(unsigned long index); SVGPoint insertItemBefore(SVGPoint newItem, unsigned long index); SVGPoint replaceItem(SVGPoint newItem, unsigned long index); SVGPoint removeItem(unsigned long index); SVGPoint appendItem(SVGPoint newItem); setter undefined (unsigned long index, SVGPoint newItem); };
SVGPointList のすべてのインターフェイスメンバーの動作は、 リストインターフェイスで定義される。
この仕様は、 Geometry Interfaces 仕様で説明されるものに加えて、SVGPoint オブジェクトの動作に追加要件を課し、‘points’ 属性の反映に 使用できるようにする。
すべての SVGPoint オブジェクトは 4 つの モードのいずれかで動作する。次のいずれかを行う:
SVGPoint オブジェクトは特定の要素に関連付ける ことができる。関連付けられた要素は、 オブジェクトが属性を反映する場合に、どの要素のコンテンツ属性を更新するかを決定するために 使用される。特に説明されない限り、SVGPoint オブジェクトは どの要素にも関連付けられない。
SVGPoint オブジェクトは 読み取り専用として指定できる。 これは、オブジェクトを変更しようとすると例外が スローされることを意味する。読み取り専用の SVGPoint の x, y, w または z IDL 属性に代入する場合、内部 座標値を更新する代わりに NoModificationAllowedError を スローしなければならない。
svgwg#706 (2019-10 WG 決議)に従い、SVG 2 は SVG 1.1 の方式へ戻ることに注意すること。すなわち、 独立した読み取り専用バリアントのインターフェイスは存在しない。SVGPoint は内部フラグによって 読み取り専用に指定でき、同じインターフェイス上で書き込むと NoModificationAllowedError がスローされる。
書き込み可能な SVGPoint の x, y, w または z IDL 属性に代入するとき、内部座標値を更新した後に 次の手順を実行する:
SVGPolylineElement オブジェクトは、 DOM 内の ‘polyline’ 要素を表す。
[Exposed=Window] interface SVGPolylineElement : SVGGeometryElement { }; SVGPolylineElement includes SVGAnimatedPoints;
SVGPolygonElement オブジェクトは、 DOM 内の ‘polygon’ 要素を表す。
[Exposed=Window] interface SVGPolygonElement : SVGGeometryElement { }; SVGPolygonElement includes SVGAnimatedPoints;
SVG 文書フラグメントの一部としてレンダリングされるテキストは、 ‘text’ 要素を使用して指定される。 ‘text’ 要素内のテキストは、 次のようにレンダリングできる:
テキストレイアウトの節では、 テキストレイアウトを紹介する。その後に、 コンテンツ領域と、 コンテンツ領域内で テキストを配置するアルゴリズムを扱う節が続く。 次に、テキストが 整形済み、 自動折り返し、および パス上にある場合に対応する特殊なレイアウト規則を、 個別の節で扱う。
SVG 1.1 のテキストレイアウト規則は、主に SVG 1.1 仕様内で定義されている。これらの規則は、大部分が CSS にある規則を反映している。SVG 2 では CSS への依存がより明示的である。実際には、 結果として得られるレイアウトは同じである。CSS 仕様へ直接 依存するよう変更することで SVG 仕様は単純化され、 レンダリングエージェントが HTML と SVG の両方のテキストをレンダリングするために 同じコードを使用できることもより明確になる。特に、 SVG 2 の自動折り返しテキストは CSS テキストレイアウトに基づく。
SVG の ‘text’ 要素は、 他のグラフィックス 要素と同様にレンダリングされる。したがって、座標系 変換、ペイント、 クリッピングおよび マスキング機能は、 ‘text’ 要素にも、 パスや 矩形などの 図形に適用されるのと同じ方法で適用される。
SVG テキストは、次のような高度なタイポグラフィ機能をサポートする:
SVG テキストは、次のような国際的なテキスト処理の要件をサポートする:
多言語の SVG コンテンツは、 ユーザーの優先言語に基づいて異なる テキスト文字列を置き換えることで実現できる。
描画される文字は、 ‘text’ 要素内の 文字データ([xml]、 2.4 節)として表現される。その結果:
アクセシビリティ上の理由から、文書に含まれるテキストには、 その機能を示す適切なセマンティックマークアップを 持たせることが推奨される。 例えば、 図の一部に可視ラベルを提供する text 要素には、 関連するグループまたはパス要素上の ‘aria-labelledby’ 属性から参照される ‘id’ を持たせるべきである。 詳細については SVG アクセシビリティガイドラインを参照すること。
本質的には Unicode コードポイントである。 文字は、制御命令(タブ、復帰、改行など)、 レンダリング可能な記号(文字、数字、句読点、その他の記号)、 または修飾子(結合アクセントなど)であり得る。
これらの異なる方法は SVG 1.1 と後方互換性がある。SVG DOM テキストメソッドで UTF-16 コード単位を使用することは、 DOM 2 仕様における DOMString の定義によって要求される。
SVG ワーキンググループは、テキスト配置属性の 対応付けにおいて Unicode コードポイントを置き換えるため、 Unicode Standard Annex #29 で定義される書記素クラスタを 使用できる可能性について、実装者からのフィードバックを求めている。CSS の タイポグラフィ文字を使用することは、 文字を構成するものが文脈(改行、 単語分割など)に依存し得るため適切ではないことに注意すること。
CSS 生成コンテンツのテキストのサポートが将来導入された場合、 それもアドレス可能な文字の配列に含まれることになる。
さまざまな CSS 3 テキストレイアウト仕様でこの用語が使用されているが、 現在のところ正式な定義を確立しているものはない。 したがってリンク先は CSS 2.1 であり、 CSS WG に issue が提出されている。
start側と
end側を定義する(例えば text-anchor プロパティの適用方法に関連する)。 これは direction プロパティによって決定される。 (注記: テキスト行内の文字の順序は主として Unicode 双方向アルゴリズムによって制御され、 インライン基底方向によって制御されるのではない。)
フォントはグリフの集合と、それらの グリフを何らかの視覚媒体上で文字として表示するために必要なその他の 情報(総称してフォントテーブル)から構成される。 グリフの集合とフォントテーブルの組み合わせは フォントデータと呼ばれる。
フォントは置換および配置テーブルを提供でき、 フォーマッター(テキストシェーパー)はそれを使用してグリフ列を並べ替え、結合し、 配置して 1 つ以上の複合 グリフを形成できる。結合は合字のように単純な場合もあれば、 通常はいくらかの 並べ替えを伴って複数の子音および母音グリフを結合するインド系音節のように複雑な場合もある。 テーブルは言語依存である場合があり、 言語に適した文字形を使用できる。
単純または複合のグリフが、組版上の不可分な単位を 表す場合、それは タイポグラフィ 文字と呼ばれる。
合字は高度なテキストレイアウトの重要な機能である。任意の 合字もあれば、必須のもの(例えばアラビア語)もある。 合字形成には次の明示的な規則が適用される:
文字が異なる DOM テキストノード内にある場合、 合字形成を有効にすべきではない。 したがって、マークアップによって分離された文字では合字を使用すべきではない。
文字が異なる テキストチャンク内にある場合、 合字形成を有効にすべきではない。
2 文字間の間隔が 既定の間隔と同じでない場合、任意合字を使用すべきではない (例えば letter-spacing が 既定値以外を持つ場合、または text-align の値が justify で、text-justify の値が distribute の場合)。 ( CSS Text Module Level 3 ([css-text-3])を参照。)
‘dx’, ‘textLength’, および ‘textPath’ の ‘spacing’ など、 タイポグラフィ文字を再配置する可能性がある SVG 属性は、 任意 合字を分断しない。 任意合字が不要な場合は、font-variant-ligatures プロパティを使用して無効にできる。
OpenType フォントでは、任意合字には liga, clig, dlig, hlig, cala 機能で有効化されるものが含まれ、必須合字は rlig 機能にある。
| SVG 2 要件: | Web Open Font Format (WOFF) の明示的なサポートを含める。 |
|---|---|
| 決議: | SVG 2 で WOFF サポートを必須とする。 |
| 目的: | 国際化および高度なタイポグラフィのため、完全な OpenType 機能へアクセスできるようにするため。 |
| 担当者: | Chris (アクションなし) |
| 状態: | 完了 |
正しいテキストレンダリングは、オーサリング時に使用したものと同じ フォントを使用することに依存する場合がある。このため SVG は、 CSS Fonts Module の Font Resources 節で定義される ダウンロード可能なフォントのサポートを要求する。特に Web Open Font Format [WOFF] のサポートが必要である。
SVG 2 で新しく追加された WOFF により、著者はコンテンツを 正しくレンダリングするために必要なフォントを提供できる。これには、 複雑な文字体系、任意合字、スワッシュ、オールドスタイル数字などを サポートする適切な OpenType テーブルを フォントが持つことを保証することも含まれる。WOFF ではフォントを圧縮し、サブセット化し、 ライセンス情報を含めることもできる。
グリフの選択および配置は通常、 CSS の規則に従って処理される。ただし場合によっては、SVG 内のテキストの 最終レイアウトには個々のグリフの ジオメトリプロパティに関する知識が必要である。
フォントの幾何学的特性は、EM ボックスに基づく座標 系で表現される。(EM はフォント内の グリフの高さの相対的な尺度である。)高さ 1 EM、幅 1 EM の ボックスは デザイン空間と呼ばれる。この空間には、 EM を複数の units per em に分割することで幾何学的座標が与えられる。
Units per em はフォント特性である。典型的な units per em の値は 1000 または 2048 である。
EM ボックスの座標空間は デザイン空間 座標系と呼ばれる。スケーラブルフォントでは、グリフの描画に使用される 曲線および直線は、この 座標系を使用して表現される。
多くの場合、この座標系の (0,0) 点は EM ボックスの左端に配置されるが、左下 隅には配置されない。ローマ字の大文字の下端の Y 座標は 通常 0 である。ローマ字の小文字の ディセンダーは負の座標値を持つ。
Em ボックス(青い正方形)内の 'M'。'M' は ベースライン(青い線)上にある。座標系の原点は 小さな黒い円で示される。
SVG は、フォントテーブルが少なくとも 3 つのフォント 特性、すなわちアセント、ディセント、および ベースラインテーブルの集合を提供すると仮定する。アセントはフォントの (0,0) 点から EM ボックス上端までの距離であり、ディセントは フォントの (0.0) 点から EM ボックス下端までの距離である。 ベースラインテーブルについては以下で説明する。
OpenType フォント([OPENTYPE])内では、 水平書字モードの場合、 アセントおよびディセントは OS/2 テーブルの sTypoAscender および sTypoDescender エントリによって与えられる。垂直書字モードの場合、 ディセント(この場合は (0,0) 点から グリフ左端までの距離)は、(0,0) 点が左端にあるため通常 0 である。 垂直書字モードのアセントは 1 em であるか、 垂直書字モード用 OpenType Base テーブルの ideographic top baseline 値によって指定される。
グリフは、各グリフ上の 整列点と呼ばれる特定の点を基準に配置される。水平 書字モードではグリフの 整列点が垂直方向に 揃えられ、垂直書字モードでは水平方向に 揃えられる。整列点の位置は 文字体系に依存する。例えば、西洋文字のグリフは 大文字の下端に、北部インド系グリフは グリフ上部近くの水平線の上端に、東アジア グリフはグリフの下端または中央に揃えられる。
文字体系内、および単一の font-size を持つテキスト行内では、整列点の列が インライン基底方向において、 ベースラインと呼ばれる幾何学的な線を定義する。 西洋文字およびその他の多くのアルファベット文字や 音節文字のグリフは "alphabetic" ベースラインに、 北部インド系グリフは "hanging" ベースラインに、東アジア グリフは "ideographic" ベースラインに揃えられる。
3 つの異なる文字体系におけるベースライン(赤い線)の例。左から 右へ: alphabetic, hanging, ideographic。EM ボックスは ideographic 文字体系について青で示される。
グリフがベースラインに沿って順次配置されるとき、 グリフの 整列点は通常、 現在のテキスト位置に配置される( vertical-align などの 一部のプロパティは配置を変更する場合がある)。各 グリフが配置された後、現在のテキスト位置は、 グリフの advance 値(通常、水平テキストでは幅、 垂直テキストでは高さ)に、カーニングやその他の間隔調整、 および整形済みまたは自動折り返しテキストの改行による 補正を加えた分だけ進められる。最初と最後の 現在のテキスト位置は配置に使用される(例えば text-anchor の値が 'middle' または 'end' の場合)。 グリフの advance は、パスに沿ってテキストを配置するときに必要である。
フォントメトリクスの例。青いボックスは 3 つのグリフの幾何学的 ボックスを示す。ラベル付きの小さな円は、グリフ配置前の 現在のテキスト位置を示す。 小さな正方形は、最後のグリフを配置した後の 最終 現在のテキスト位置を示す。 カーニングにより、'a' グリフのボックスの左端は 'V' グリフのボックスの右端と揃っていないことに注意すること。
グリフが現在のグリフ方向に対応する明示的な advance 値を 提供しない場合は、適切な 近似値を使用すべきである。垂直テキストでは、 em サイズが推奨される近似値である。
最初の 現在のテキスト位置は、 整形済みテキスト、または コンテンツ領域が inline-size プロパティによって決定される 自動折り返しテキストの場合、‘text’ 要素または最初に レンダリングされる ‘tspan’ 要素上の ‘x’ および ‘y’ 属性によって確立される。 その他の自動折り返しテキストでは、最初の 現在のテキスト位置は、 CSS 行折り返しアルゴリズムを適用した後の 最初にレンダリングされるグリフの位置によって決定される。
最初の 現在のテキスト位置を確立する ‘x’(‘y’)属性が 存在しない場合、その X(Y)座標は 現在のユーザー座標系で 0 となる。
ベースラインテーブルは、 デザイン空間座標系内の 1 つ以上の ベースラインの位置を指定する。ベースラインテーブルの機能は、 同じテキスト行で異なる文字体系が混在するとき、 それらを互いに整列しやすくすることである。望ましい相対配置は、 行(またはブロック)内でどの文字体系が支配的かに依存する場合があるため、 文字体系ごとに異なるベースラインテーブルが存在する場合がある。さらに、 水平および垂直書字 モードでは異なる整列位置が必要である。したがって、フォントは ベースラインテーブルの集合を持つ場合がある: 通常、水平書字モード用に 1 つ以上、 垂直書字モード用に 0 個以上。
一部のフォントにはベースラインテーブルの値がない場合がある。 指定されたフォントがベースラインテーブルを提供しない場合に ベースラインテーブルを近似するためのヒューリスティックが CSS Inline Layout Module Level 3 [css-inline-3] で提案されている。
テキスト列の途中で異なるフォント(または font size の変更)が 指定された場合、支配的 ベースラインが、 新しいフォント(新しいサイズ)のグリフを以前のフォントのグリフに整列するために 使用するベースラインを決定する。 dominant-baseline プロパティは、 支配的 ベースラインを設定するために使用される。
親を基準としたオブジェクト間の整列は、 整列ベースラインによって決定される。 通常は支配的ベースラインと同じ ベースラインであるが、省略形の vertical-align プロパティ(推奨)または詳細指定の alignment-baseline を使用して別のベースラインを 選択できる。
支配的ベースラインは、上付き文字や下付き文字のために必要に応じて 一時的にシフトできる。そのためには省略形の vertical-align プロパティ(推奨)または詳細指定の baseline-shift プロパティを使用する。 シフトは入れ子にでき、各シフトが前のシフトに加算されることに注意すること。
'vertical-align' プロパティを使用する例。 左: 'vertical-align:mathematical' ('alignment-baseline:mathematical') が '[z]' を含む ‘tspan’ に適用される。 水色の線は mathematical ベースラインの位置を示す。 右: 'vertical-align:super' ('baseline-shift:super') が '2' を含む ‘tspan’ に適用される。 水色の線は ベースラインのシフトを示す。
SVG はさらに、フォントデータ内の各グリフについて、 水平書字モードと垂直書字モードそれぞれに 1 つずつ、 2 つの幅値、2 つの整列ベースライン、2 つの 整列点があると仮定する。(幅として指定されているが、 垂直書字モードでは幅は 垂直方向に使用される。)整列点の インライン基底方向の位置はグリフの開始端上にある。
ベースラインに関する追加情報は、 CSS Inline Layout Module Level 3 仕様にある。 [css-inline-3] (次も参照: CSS Writing Modes Level 3 仕様。 [css-writing-modes-3])
| SVG 2 要件: | 異なるベースラインに整列されたテキストをサポートする。 |
|---|---|
| 決議: | SVG 2 は、既存または改善された CSS プロパティを使用するなどして、 異なるベースラインにグリフを整列できるようサポートする。 |
| 目的: | 水平テキスト内のグリフに、スタイル効果のため異なる垂直配置を持たせられるようにするため。 |
| 担当者: | Chris (アクションなし) |
| 状態: | 完了 |
1 行のテキストは 1 つの 行ボックス内に配置される。 複数行テキストはこれらのボックスを積み重ねることで生成される。 行ボックスの高さは、 line-height プロパティの効果を適用した後、 テキスト行内のすべてのグリフについて最大アセントと 最大ディセントを求めることで決定される。 行ボックスの幅は通常、 それを含むテキストブロックの幅である。SVG では、包含するテキストブロックが 固定されたジオメトリを持たない場合(整形済みテキストなど)、行ボックスは ボックス内のグリフボックスを密接に囲む。
行ボックスの高さを決定する例。 まず、各グリフボックス(小さな水色のボックス)は、 line-height プロパティに従って上下方向へ拡張される。この場合 line-height プロパティは 125% である。大きいグリフの font-size は 96px なので、 追加の高さは 24px(96px の 25%)となる。この追加高さは 上下に均等に分割され、赤いボックスとなる。( 分かりやすくするため、同じインライン要素内のすべてのグリフを 一緒にグループ化している)。 最後に、ベースラインの上下にある赤いボックスの 最大範囲を使用して、最終的な 行ボックス(大きな水色のボックス)が 求められる。
さまざまな国際的書記体系をサポートするため、行ボックスは 水平または垂直方向に配置できる。 垂直 行ボックス内のテキストは上から下へ流れる。 水平 行ボックス内のテキストは、左から右 (例えば現代ラテン文字)、右から左(例えばヘブライ語や アラビア語)、または左から右と右から左の混在 (双方向テキスト)で流れる場合がある。
双方向テキストの処理モデルは次のとおり:
カーニングや合字処理は フォント固有の場合があるが、推奨モデルでは 文字が並べ替えられた後に、文字またはグリフの組み合わせ間で カーニングおよび合字処理が行われる。
行ボックスの方向、および それらが積み重ねられる方向(ブロックフロー方向)は、 writing-mode プロパティによって決定される。 水平テキスト(writing-mode の値が horizontal-tb)では 行ボックスは 上から下へ積み重ねられる。垂直テキストでは、行ボックスは 右から左(writing-mode の値が vertical-rl)または左から右 (writing-mode の値が vertical-lr)に積み重ねられる。
‘text’ 要素は、 テキストからなるグラフィックス 要素を定義する。‘text’ または別の ‘tspan’ 要素内の ‘tspan’ 要素を使用すると、 スタイルを切り替えたり、 ‘tspan’ 要素内でレンダリングされるテキストの位置を親要素に対して調整したりできる。
‘text’ および ‘tspan’ 要素内の文字データは、関連する属性およびプロパティと、 フォント自体の文字からグリフへの対応表とともに、 レンダリングされるグリフを定義する。 ‘text’ および ‘tspan’ 要素上の属性およびプロパティは、 書字方向、フォント指定、レンダリング方法を正確に記述する ペイント属性などを示す。 この章の後続の節では、 関連するテキスト固有の属性およびプロパティについて説明する。
‘text’ および ‘tspan’ 要素は、 他のグラフィックス要素と同じレンダリング方法を使用して レンダリングされるため、 パスや 矩形などの 図形に適用される ペイント機能はすべて、 ‘text’ および ‘tspan’ 要素にも適用されるが、 マーカーは例外である。 さらに、 座標系変換、 クリッピング、および マスキングを、 ‘text’ 要素全体に 適用できる。
CSS の用語では、‘text’ 要素はブロック 要素として動作する。テキストコンテンツ要素の子孫である ‘tspan’, ‘textPath’, および ‘a’ 要素はインライン要素として動作する。
テキストにグラデーション、パターン、クリッピングパス、マスク、 またはフィルターを適用できる。これらの機能のいずれかをテキストに適用し、 キーワード 'objectBoundingBox' を使用して ( オブジェクト境界ボックス 単位を参照)"object bounding box" を基準にグラフィック効果を指定する場合、 オブジェクト境界ボックス単位は、すべての場合に ‘text’ 要素全体を基準として計算される。 同じ ‘text’ 要素内の異なる ‘tspan’ または ‘textPath’ 要素に異なる効果が適用されている場合でも同様である。
‘text’ 要素は、 (双方向性の 並べ替え後の)最初のグリフを、 最初の 現在のテキスト位置にレンダリングする (text-anchor プロパティまたは text-align プロパティの値による 調整が行われる場合がある)。 整形済みテキスト、および コンテンツ領域が inline-size プロパティによって決定される自動折り返しテキストでは、 最初の 現在のテキスト位置は、 最初にレンダリングされる文字を含む ‘text’ または ‘tspan’ 要素の ‘x’ および ‘y’ 値によって決定される。 図形内の自動折り返しテキストまたはパス上のテキストについては、 それぞれ 自動折り返しテキストまたは パス上のテキストの節を参照して、 最初の 現在のテキスト位置を決定すること。 指定された文字に対応するグリフが レンダリングされた後、次の 文字のために現在のテキスト位置が更新される。最も単純な場合、新しい現在のテキスト位置は、 前の現在のテキスト位置にグリフの advance 値 (水平または垂直)を加えたものになる。グリフ配置およびグリフ advance の説明については、 テキストレイアウトを参照すること。
テキスト文字列 こんにちは、世界!
は、
Verdana フォントファミリを使用し、グリフを青色で塗りつぶして
キャンバス上にレンダリングされる。
<?xml version="1.0" standalone="no"?>
<svg width="10cm" height="3cm" viewBox="0 0 1000 300"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<text x="250" y="180"
font-family="Verdana" font-size="64" fill="blue" >
こんにちは、世界!
</text>
</svg>
‘tspan’ を使用して、
単語 not
のスタイルを変更する。
<?xml version="1.0" standalone="no"?>
<svg width="10cm" height="3cm" viewBox="0 0 1000 300"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<g font-family="Verdana" font-size="64" >
<text x="160" y="180" fill="blue" >
あなたは
<tspan font-weight="bold" fill="red" >違います</tspan>
バナナではありません。
</text>
</g>
</svg>
2 つの ‘tspan’ 要素は、 ‘x’ および ‘y’ 属性を使用して水平方向および 垂直方向に再配置される。すべてのテキストが単一の ‘text’ 要素内にあるため、 テキスト選択と クリップボード操作をサポートするユーザーエージェントでは、 ユーザーはすべてのテキストを通して選択し、 システムクリップボードへコピーできる。
<?xml version="1.0" standalone="no"?>
<svg width="10cm" height="3cm" viewBox="0 0 1000 300"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<g font-family="Verdana" font-size="64" >
<text x="100" y="180" fill="blue" >
でもあなたは
<tspan dx="2em" dy="-50" font-weight="bold" fill="red" >
です
</tspan>
<tspan dy="100">
桃です!
</tspan>
</text>
</g>
</svg>
| SVG 2 要件: | ‘tspan’ 上で transform を許可する。 |
|---|---|
| 決議: | SVG 2 は ‘tspan’ 上の transform を許可する。 |
| 目的: | すでに transform を許可している ‘a’ などの他の要素と整合させるため。 |
| 担当者: | Cameron (アクションなし) |
| 状態: | 完了 |
この決定は取り消された。次を参照: GitHub Issue 210。CSS/HTML はインライン要素上の transform を許可しておらず、 SVG と HTML の両方で、インラインの場合の ‘a’ 要素上の transform を サポートするレンダラーも存在しない。
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| x, y | [ [ <length-percentage> | <number> ]+ ]# | (none) | はい |
単一の <length> が 指定された場合、その値は、この要素またはその子孫内の 最初の文字に対応するグリフをレンダリングするための 現在のテキスト位置の新しい絶対 X(Y) 座標を表す。
コンマまたは空白で区切られた n 個の <length> のリストが指定された場合、その値は、 この要素またはその 子孫内の最初の n 個の アドレス可能な文字それぞれに 対応するグリフをレンダリングするための 現在のテキスト 位置の新しい絶対 X(Y)座標を表す。
文字数より多くの <length> が 指定された場合、 余分な <length> は グリフ配置に影響しない。
<length> の数より文字数が多い場合、 または属性が指定されていない場合、 追加の各文字について:
SVG 2 では、‘text’ および ‘tspan’ の ‘x’ および ‘y’ 属性はプレゼンテーション属性ではなく、 CSS から設定することはできない。これは将来の SVG バージョンで 変更される可能性がある。
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| dx, dy | [ [ <length-percentage> | <number> ]+ ]# | (none) | はい |
単一の <length> が指定された場合、この値は この要素またはその 子孫内の最初の文字に対応するグリフをレンダリングするための 現在の テキスト位置の新しい相対 X(Y)座標を表す。 最初の文字のグリフがレンダリングされる前に、 現在のテキスト位置は、現在のユーザー座標系の x 軸(y 軸)に沿って <length> だけシフトされる。
コンマまたは空白で区切られた n 個の <length> のリストが指定された場合、その値は、 この要素またはその子孫内の 最初の n 個の アドレス可能な 文字に対応するグリフをレンダリングする前の 現在のテキスト位置について、 x 軸(y 軸)に沿った増分シフトを表す。したがって、 各文字に対応するグリフがレンダリングされる前に、 現在の ‘text’ 要素内の 前の文字のグリフを描画した結果の 現在のテキスト 位置が、現在のユーザー 座標系の x 軸(y 軸)に沿って <length> だけシフトされる。
文字数より多くの <length> が 指定された場合、 余分な <length> は グリフ配置に影響しない。
<length> の数より文字数が多い場合、 または属性が指定されていない場合、 追加の各文字について:
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| rotate | [ <number>+ ]# | (none) | はい(非加算)。 |
この要素内の各文字に対応するすべてのグリフへ適用される、 現在の テキスト位置を中心とする度単位の追加回転。
コンマまたは空白で区切られた <number> のリストが 指定された場合、最初の <number> は この要素またはその子孫内の 最初の文字に対応するグリフの追加回転を表し、 2 番目の <number> は 2 番目の文字に対応するグリフの 追加回転を表し、以後同様である。
文字数より多くの <number> が 指定された場合、 余分な <number> は 無視される。
<number> の数より文字数が多い場合、 それらの余分な各文字には 最後の数値で指定された回転値を使用しなければならない。
属性が指定されておらず、‘tspan’ 要素の 祖先が、 ‘rotate’ 属性によって 指定された文字の追加回転を指定している場合 (最も近い祖先が優先される)、 指定された追加回転をその文字に適用する。 祖先の ‘rotate’ 属性で 指定された <number> の数より 文字数が多い場合、 それらの余分な各文字には、最後の 数値で指定された回転値を使用しなければならない。
この追加回転は、 グリフがレンダリングされる際に 現在のテキスト位置が 変更される規則には影響せず、 パス上のテキストによる回転、および text-orientation, glyph-orientation-horizontal, または glyph-orientation-vertical による回転に追加される。
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| textLength | <length-percentage> | <number> | 以下を参照 | はい |
この要素内の文字データに対応するすべての advance 値の合計についての著者による計算値。これには、 グリフの advance 値(水平または垂直)、 letter-spacing および word-spacing プロパティの効果、 およびこの ‘text’ または ‘tspan’ 要素、 あるいはその子孫上の ‘dx’ および ‘dy’ 属性による調整が含まれる。 この値は、 ユーザーエージェント自身の計算を著者の計算に 合わせて調整するために使用される。
この属性の目的は、 双方向 並べ替え後の視覚的レンダリング順序で、 この要素に対応する最初と最後にレンダリングされるグリフの 正確な整列を著者が実現できるようにすることである。したがって、 双方向 並べ替え後の視覚的レンダリング順序で最後にレンダリングされる 文字については、ユーザーエージェントが 長さ ‘textLength’ に収まるよう テキスト文字列を伸長または圧縮する適切な量を決定するとき、 通常のグリフ advance を超える追加の文字間隔は (ほとんどの場合)無視される。
指定された 要素上に ‘textLength’ 属性が指定され、 祖先にも指定されている場合、この要素内の すべての文字データに対する調整は、 この要素上の ‘textLength’ の値のみで制御される。 その副作用として、 この要素のコンテンツに対する調整比率が、 同じ祖先を共有する他のコンテンツに使用される 調整比率と異なる場合がある。ユーザーエージェントは、 その祖先内の他のコンテンツに対する総 advance 値が、その祖先上の advance 値と この要素の advance 値との差であると仮定しなければならない。
この属性は、テキストを縮小または拡大するような 効果を得るために使用することを意図していない。
負の値はエラーである (エラー 処理を参照)。
‘textLength’ 属性は、 折り返し領域が inline-size プロパティによって定義されていない場合にのみ適用される。 また、 white-space の値が pre または pre-line であるために 強制改行を持つ ‘text’ または ‘tspan’ 要素には 適用されない。
‘text’ 要素内の どこにも属性が指定されていない場合、その効果は 著者の計算値がユーザー エージェントによって計算された値と正確に一致したかのようになり、 advance の調整は行われない。 DOM で属性を反映する目的では、 初期値は、暗黙の ユーザー単位で表された現在のユーザーエージェント計算長である。
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| lengthAdjust | spacing | spacingAndGlyphs | spacing | はい |
ユーザーエージェントはテキスト文字列の正しい開始位置と終了 位置を実現する必要があるが、 中間グリフの位置は予測できない。これはユーザーエージェントが、 正しい開始位置と終了位置のバランスと 最適なタイポグラフィを両立するために、 テキスト文字列を伸長または圧縮する高度なアルゴリズムを 使用する場合があるためである。
n 個の 文字を含むテキスト文字列では、advance 値の調整は 多くの場合 n−1 個の文字に対してのみ行われる (属性 ‘textLength’ の説明を参照)が、 グリフの伸長または 圧縮はすべての n 個の 文字に適用されることに注意すること。
‘text’ および ‘tspan’ 要素上の ‘x’, ‘y’, ‘dx’, ‘dy’, および ‘rotate’ は、 個々のグリフに 正確な配置が必要な高度なタイポグラフィの状況で役立つ。 これらの属性は、文字間の小さな配置 調整や、テキストの一部を新しい位置へ移動して 新しいテキスト行の視覚的効果を実現するような大きな配置 調整(SVG 1.1 と互換)に役立つ。 ‘x’, ‘y’, ‘dx’, ‘dy’, および ‘rotate’ 属性は、 自動折り返しテキストでは 無視されることに注意すること(ただし、コンテンツ領域が inline-size プロパティによって指定される場合の 最初の 現在のテキスト 位置を除く)。
2015 年のシドニー F2F で、'dx', 'dy', 'rotate' は 自動折り返しテキストでは無視することが決定された。(技術的には、 それらを適用することは難しくないが、実際にはあまり有用ではないと判断された。)
高度なタイポグラフィ制御のために微細な配置調整が 必要な状況では、SVG コンテンツ 設計者は必要なフォントが文書のすべての閲覧者に 利用可能であることを保証する必要がある(例えば、必要な フォントデータを SVG フォントまたは、SVG コンテンツと同じ Web サイトに保存された 代替 WebFont 形式でパッケージ化する)。 また、表示ソフトウェアがフォントを 期待どおりに処理することも保証する必要がある(機能、特性、フォントレイアウト 機構はシステムごとに大きく異なる)。SVG コンテンツが、 特定の表示ソフトウェア群によって処理される特定のフォントに対応することを 意図した ‘x’, ‘y’, ‘dx’, または ‘dy’ 属性値を 含み、 これらの要件のいずれかが満たされない場合、 テキストは低品質で表示される可能性がある。
次の追加規則は、‘x’, ‘y’, ‘dx’, ‘dy’, および ‘rotate’ 属性が 数値のリストを含む場合に適用される:
<tspan dx="11 12 13 14 15 0 21 22 23 0 31 32 33 34 35 36">Latin and Hebrew</tspan>
tspan04 の例では、 ‘tspan’ 要素上の ‘rotate’ 属性を使用して、レンダリングされる グリフを回転する。この例は、 ‘rotate’ 属性で指定された値の数より 多くの文字を含む、単一の ‘tspan’ 要素内のテキスト文字列を示す。この 場合、‘tspan’ の ‘rotate’ 属性で最後に指定された値を、文字列内の残りの 文字へ適用しなければならない。
<?xml version="1.0" standalone="no"?>
<svg width="10cm" height="3cm" viewBox="0 0 1000 300"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<desc>
tspan04 の例 - rotate 値の数が
文字列内の文字数より少ない。
</desc>
<text font-family="Verdana" font-size="55" fill="blue" >
<tspan x="250" y="150" rotate="-30,0,30">
こんにちは、世界
</tspan>
</text>
<!-- 'rect' 要素を使用してビューポートの輪郭を表示 -->
<rect x="1" y="1" width="998" height="298"
fill="none" stroke="blue" stroke-width="2" />
</svg>
tspan04 の例
tspan05 の例では、 ‘text’ 要素と、1 つを除くすべての子 ‘tspan’ 要素上に ‘rotate’ 属性を指定して、レンダリングされるグリフを 回転する。この例は、 ‘rotate’ 属性の伝播を示す。
<?xml version="1.0" standalone="no"?>
<svg width="100%" height="100%" viewBox="0 0 500 120"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<desc>
tspan05 の例 - 入れ子になった tspan 要素への回転値の伝播。
</desc>
<text id="parent" font-family="Arial, sans-serif" font-size="32" fill="red" x="40" y="40"
rotate="5,15,25,35,45,55">
すべての
<tspan id="child1" rotate="-10,-20,-30,-40" fill="orange">
文字が
<tspan id="child2" rotate="70,60,50,40,30,20,10" fill="yellow">
内で
<tspan id="child3">
同じ
</tspan>
</tspan>
<tspan id="child4" fill="orange" x="40" y="90">
テキスト
</tspan>
回転を
</tspan>
<tspan id="child5" rotate="-10" fill="blue">
指定している
</tspan>
わけではない
</text>
<!-- 'rect' 要素を使用してビューポートの輪郭を表示 -->
<rect x="1" y="1" width="498" height="118" fill="none"
stroke="blue" stroke-width="2" />
</svg>
tspan05 の例
‘text’ 要素内の赤いテキストの回転:
"child1" ‘tspan’ 要素内のオレンジ色のテキストの回転:
"child2" ‘tspan’ 要素内の黄色いテキストの回転:
"child5" ‘tspan’ 要素内の青いテキストの回転:
次の図は、回転値が ‘text’ 要素内に入れ子になった ‘tspan’ 要素へ どのように伝播するかを示す:
| SVG 2 要件: | SVG Tiny 1.2 のテキストレイアウト改善を含める。 |
|---|---|
| 決議: | SVG 2 は、文字とグリフ、テキストレイアウト、テキスト選択、テキスト 検索について SVG Tiny 1.2 の改善されたテキストを含める。 |
| 目的: | テキストレイアウトの説明をより明確にするため。機能変更はない。 |
| 担当者: | Chris (ACTION-3236) |
| SVG 2 要件: | 図形内のテキストをサポートする。 |
|---|---|
| 決議: | SVG 2 は CSS と互換性のある自動テキスト 折り返しを要求する。 |
| 目的: | フローチャートなどのテキスト。 |
| 担当者: | Tav (アクションなし) |
この節では SVG テキストレイアウトの短い概要を示す。その後に、 テキストレイアウトのさまざまな側面を より詳しく扱う節が続く。
SVG のテキストレイアウトは複数段階の処理であり、 ‘text’ 要素のサブツリーと そのプロパティ値を入力として受け取り、 各 テキストコンテンツ要素の座標系で レンダリングするグリフ列とその位置を生成する。
まず、‘text’ 要素と その子孫を、 ‘text’ がブロック 要素であり、その ‘tspan’, ‘textPath’, および ‘a’ 子孫が インライン要素であるかのように、CSS に従って コンテンツ領域または 折り返し 領域内に配置する。このレイアウトでは、この章で説明するすべての段落 レベルおよびフォント関連の CSS プロパティを考慮する。
コンテンツ領域は、 inline-size プロパティを設定することで明示的に宣言できる。 コンテンツ領域が宣言されていない場合、 既定では幅と高さが無限大の矩形となる。
次に、‘x’, ‘y’, ‘dx’ および ‘dy’ 属性による配置を、 CSS レイアウト処理から得られたグリフ位置に 適用する。 許可される変換の規則は、 コンテンツ領域が明示的に宣言されたかどうかによって異なる。 明示的に宣言されていない場合、その規則は 整形済みテキストのレイアウトを定義する。宣言されている場合、その規則は 自動折り返しテキストのレイアウトを定義する。
3 番目に、必要に応じて text-anchor プロパティの効果を 適用する。
最後に、‘textPath’ 要素のグリフ配置を 実行し、整形済みテキストを パス上のテキストへ変換する。
各種テキストレイアウトの例:
複数行の整形済みテキストの例。
<svg xmlns="http://www.w3.org/2000/svg"
width="300" height="100" viewBox="0 0 300 100">
<text x="20" y="45" style="font: 24px sans-serif;">
複数行の、
<tspan x="20" y="75">整形済みテキストの例。</tspan>
</text>
</svg>
‘tspan’ 要素を 使用して複数行テキストを作成した整形済みテキスト。
自動折り返しテキストの例。
<svg xmlns="http://www.w3.org/2000/svg"
width="300" height="100" viewBox="0 0 300 100">
<text x="20" y="45" style="font: 24px sans-serif; inline-size: 250px;">
自動的に折り返されるテキストの例。</text>
</svg>
自動折り返しテキスト。inline-size プロパティは、高さが無限大の矩形コンテンツ領域を定義する (水色で表示)。
パス上のテキストの例。
<svg xmlns="http://www.w3.org/2000/svg"
width="300" height="100" viewBox="0 0 300 100">
<path id="MyPath" stroke="lightblue" fill="none"
d="M 50,50 C 100,0 200,100 250,50"/>
<text style="font: 24px sans-serif;">
<textPath href="#MyPath">パス上のテキスト。</textPath>
</text>
</svg>
SVG 2 は、コンテンツ領域を指定することで、 矩形またはその他の図形内でテキストを自動的に折り返す機能を導入する。 SVG の折り返しテキストの設計は、 CSS テキスト折り返しをサポートするレンダラーが SVG テキスト折り返しを容易に実装できるようにするため、 SVG のテキスト折り返しを CSS のテキスト折り返しと できる限り互換にしたいという意図に基づく (ただし HTML 非互換の SVG レンダラーに HTML 実装を要求しない)。SVG と CSS のテキスト折り返しにはいくつかの 違いがある。最も重要なのは、SVG では コンテンツ領域を明示的に提供する必要があることである。 SVG には自動的な有限(または半有限)の コンテンツ領域(CSS ではボックスモデルによって提供される)がないためである。 もう 1 つの違いは、SVG には 改行を作成する <p></p> および <br/> 要素がないことである。代わりに SVG は、 white-space の pre および pre-line 値を使用して 改行を提供する。SVG の折り返しテキストでは、 ‘text’ および ‘tspan’ 要素内の ‘x’ および ‘y’ 属性を使用して、 折り返しテキストをサポートしない SVG 1.1 レンダラー向けに コンテンツ作成ツールが自然なフォールバックを提供することもできる (これらの属性は、 自動折り返しテキストについて SVG 2 レンダラーでは無視される)。
SVG のテキストレイアウトオプションは、多くの一般的な ユースケースをカバーするよう設計されている。より複雑なレイアウト (箇条書き、表など)が必要な場合、テキストは ‘foreignObject’ 要素内へインラインで埋め込まれた XHTML [HTML] など、別の XML 名前空間で レンダリングできる。
コンテンツ領域は、 ‘text’ 要素内で inline-size プロパティを指定することで定義される。 コンテンツ領域が 提供されていない場合、コンテンツ領域の既定値は 幅と高さが無限大の矩形となる( 整形済みテキストの節を参照)。
折り返しテキストは 折り返し領域内に配置される。 折り返し領域は コンテンツ領域と同じである。
折り返し領域が定義されると、 テキストは CSS の規則に従って 折り返し領域内に配置される (この節で示す特殊な規則を尊重する)。
'extent' は 2015 年 2 月 12 日の決議によって追加された。'extent' は、 2013 年 6 月 27 日の決議で追加された 'width' および 'height' 属性を置き換える。 Linkoping F2F, 2015 年 6 月 11 日の決議により、'inline-size' プレゼンテーション属性へ置き換えられた。
inline-size プロパティを使用すると、 折り返し領域を矩形に設定できる。プロパティの計算値は、 水平テキストでは矩形の幅、 垂直テキストでは矩形の高さを設定する。もう一方の 寸法(水平テキストでは高さ、垂直テキストでは幅)は 無限長である。値が 0 の場合、 折り返し領域は作成されない。
最初の 現在のテキスト位置は、 ‘text’ 要素の ‘x’ および ‘y’ 属性から得られる (これらの属性が ‘text’ 要素に指定されていない場合は、 最初の子 ‘tspan’ 要素から得る)。 左から右のテキストでは、最初の 現在のテキスト位置は 矩形の左側にある。右から左のテキストでは 矩形の右側にある。 垂直テキストでは、最初の 現在のテキスト位置は 矩形の上端にある。
次に、矩形(折り返し領域)は、 text-anchor プロパティに従って、 折り返し領域の端を使用して開始、中間、終了 位置を決定することでアンカーされる。
inline-size プロパティでテキストを折り返す方法は、 著者が単にテキストブロックの幅または高さに 制限を与える整形済み SVG テキストの拡張である。したがって、 ‘x’ および ‘y’ 属性を、 direction および text-anchor プロパティとともに使用して、 最初のテキスト行を配置する。
| 名前: | inline-size |
|---|---|
| 値: | auto | <length-percentage> |
| 初期値: | auto |
| 適用対象: | ‘text’ 要素 |
| 継承: | いいえ |
| パーセント値: | 現在の SVG ビューポートの幅(水平テキストの場合)または高さ(垂直テキストの場合)を参照する (単位を参照) |
| メディア: | 視覚 |
| 計算値: | 絶対長またはパーセント値 |
| アニメーション型: | 計算値による |
inline-size を使用して 水平テキストを折り返す例。
<svg xmlns="http://www.w3.org/2000/svg"
width="300" height="100" viewBox="0 0 300 100">
<text x="50" y="30" style="font: 20px sans-serif; inline-size: 200px">
このテキストは 200 ピクセルで折り返されます。
</text>
</svg>
inline-size を使用して 右から左の水平テキストを折り返す例。
<svg xmlns="http://www.w3.org/2000/svg"
width="300" height="100" viewBox="0 0 300 100">
<text x="250" y="30"
style="font: 20px PakType Naqsh; inline-size: 200px; direction: rtl;">
هذا النص يلتف في 200 بكسل.</text>
</svg>
一部のブラウザーは、この SVG 1.1 の図を正しくレンダリングしない場合がある。Batik と Firefox は正しく表示するようである。 Chrome に対してバグが報告されている。
inline-size を使用して 垂直テキストを折り返す例。
<svg xmlns="http://www.w3.org/2000/svg"
width="100" height="300" viewBox="0 0 100 300">
<text x="62.5" y="25" inline-size="200"
style="font: 25px IPAMincho; inline-size: 200px; writing-mode: vertical-rl;">
テキストは10文字後に折り返されます。</text>
</svg>
この SVG 1.1 画像は nightly を含む Firefox では動作しない。Firefox は プレゼンテーション属性 'writing-mode' をサポートしていない。Firefox に対してバグが報告されている。
inline-size を使用して 中央にアンカーされた水平テキストを折り返す例。
<svg xmlns="http://www.w3.org/2000/svg"
width="300" height="100" viewBox="0 0 300 100">
<text x="50" y="30" style="font: 20px sans-serif; inline-size: 200px; text-anchor: middle">
このテキストは 200 ピクセルで折り返されます。
</text>
</svg>
テキストレイアウトは、 テキストデータとスタイル情報、および塗りつぶす 1 つ以上の 図形の記述を含む ‘text’ 要素のコンテンツを CSS ベースのテキストレンダラーへ渡すことで開始する。 ‘text’ 要素はブロック要素として扱われ、 その子孫の ‘tspan’, ‘textPath’ および ‘a’ 要素は インライン要素として扱われる。CSS レンダラーは、テキストが絶対配置されているかのように テキストを配置した結果の位置とともに、 タイポグラフィ文字の集合を返す。
タイポグラフィ文字は複数の グリフを含む場合がある。ここでは、 タイポグラフィ文字内の グリフの相対配置は タイポグラフィ文字にカプセル化され、 ユーザーが制御できないものと仮定する。
コンテンツ領域が定義された後、 指定された ‘text’ 要素の タイポグラフィ 文字とその位置を決定するために、次の アルゴリズムを使用する:
これは、writing-mode が horizontal-tb の場合は ボックス幅を inline-size 値に設定して テキストを配置し、それ以外の場合は ボックス高さを inline-size 値に設定して 配置することを意味する。
多くの CSS プロパティは SVG テキスト レイアウトに影響しないか、影響が限定される:
これにより、‘text’ 要素は ブロック要素であるかのように扱われる。
これにより、‘tspan’, ‘textPath’ および ‘a’ 要素は インライン要素であるかのように扱われる。 注記: transform プロパティは インライン要素には影響しない。
これにより、‘text’ 要素内のグラフィックス要素およびメタデータ要素はレンダリングされない。
さまざまな SVG 属性およびプロパティは、 コンテンツ領域の定義方法に応じて タイポグラフィ文字を再配置する場合がある:
次の SVG テキストレイアウトアルゴリズムは、 ‘text’ 要素のサブツリー内の DOM の各文字について出力情報を返す。その情報には次が含まれる:
SVG 属性 ‘x’, ‘y’, ‘dx’, ‘dy’, および ‘rotate’ で指定される配列は、アドレス可能な文字によってインデックス付けされる。 しかし、再配置は タイポグラフィ文字へ適用される。 タイポグラフィ文字が複数の文字に 対応する場合(例えば合字)、その タイポグラフィ文字の配置には 最初の文字に対応する配列値のみが使用される。 タイポグラフィ文字内の その他の文字に対応する配列値は、 ‘x’ および ‘y’ ではスキップされ、 ‘dx’ および ‘dy’ では 累積して次の タイポグラフィ 文字へ適用され、 ‘rotate’ では、配列内の最後の 値である場合に後続の タイポグラフィ 文字へ適用される。これにより例えば、 フォントに特定の合字が存在するかどうかにかかわらず、 属性値が同じ文字へ適用されることが保証される。
SVG 固有のテキストレイアウトアルゴリズムは次のとおり:
これは、 white-space プロパティによって改行が生じない限り、1 行のテキストになる。
result 内のインデックス i を持つ 各配列要素について:
次の ‘text’ 要素にはグリフ 配置属性から参照できない折りたたみ可能な空白があるため (標準フォントを使用する場合)、"B" グリフは x=300 に配置される。
<text x="100 200 300"> A B </text>
これは "A" の前の空白、および "A" と "B" の間の 1 文字を除くすべての空白文字が折りたたまれるかトリムされるためである。
これにより、text-anchor によって移動されるチャンクが 複数行にまたがらないことが保証される。
ノードによって指定された位置調整(例えば ‘x’ 属性内の値)は、 そのノード内のすべての文字(ノードの子孫内の文字を含む)に適用される。 ただし、子孫ノードで指定された調整は祖先 ノードからの調整を上書きする。この節では、どの調整を どの文字に適用するかを解決する。また、result の rotate 座標も直接設定する。
入力として node を受け取る再帰的手続きであり、 その手順は次のとおり:
このループは ‘x’, ‘y’, ‘dx’, ‘dy’ および ‘rotate’ 属性を node 内のコンテンツに適用する。
フラグを false に設定することで、‘x’ および ‘y’ 属性が ‘text’ 要素に設定されていても、必要でない場合に ‘textPath’ 要素内でアンカーチャンクを作成しないことが保証される。
‘x’ 属性は、パス上の 縦書きテキストでは無視される。
‘y’ 属性は、パス上の 横書きテキストでは無視される。
‘textPath’ 要素は常にアンカーチャンクを作成する。
‘dx’ および ‘dy’ による調整は、 ‘textLength’ 属性による調整より前に適用される一方、 ‘x’, ‘y’ および ‘rotate’ による調整は後に適用される。
入力として node を受け取る再帰的手続きであり、その手順は次のとおり:
子ノードは親ノードより先に調整される。
このループは、node 内の タイポグラフィ文字の 最も左(上)および最も右(下)の範囲を求め、 強制改行を確認する。
ユーザーエージェントは、node 内の最後の タイポグラフィ 文字を delta だけ移動する必要があり、 "horizontal" フラグが true かつ direction が lrt の場合は正の x 方向、 "horizontal" フラグが true かつ direction が rtl の場合は負の x 方向、 それ以外の場合は正の y 方向へ移動する。ユーザーエージェントは 最適なタイポグラフィのために中間の タイポグラフィ 文字を自由に調整できる。次の手順は、 ‘lengthAdjust’ の値が spacing の場合に、 タイポグラフィ 文字を調整する方法の 1 つを示す。
各解決済み子孫ノードは、この コンテキストでは単一の タイポグラフィ 文字であるかのように扱われる。
このループは ‘x’ および ‘y’ 値を適用し、 text-anchor チャンクが タイポグラフィ文字の途中から 開始しないことを保証する。
このループは各アンカーチャンクを処理する。
このループはアンカーチャンク内の タイポグラフィ文字の 最も左(上)および最も右(下)の範囲を求める。
ここでテキストのアンカー配置を行う。
ここで ‘textPath’ の配置を適用する。
ユーザーエージェントは、 ‘spacing’ の値が 'auto'、または ‘method’ の値が 'stretch' であることによって高品質な組版を保証するために必要な、 mid への任意の追加調整を自由に行える。
これは単一の 閉じたサブパスに対する特別な折り返し条件を実装する。
mid = mid mod length とする。
これは、‘textPath’ 要素の後に 現れる任意の文字をレンダリングする開始点を、 パスの終端に設定する。
| SVG 2 要件: | テキストレイアウト機能について CSS と整合させる。 |
|---|---|
| 決議: | SVG 2 は SVG に固有でないテキストレイアウト (空白、bidi など)について CSS3 の定義を使用する。 |
| 目的: | HTML と SVG におけるテキストレイアウトの仕様と実装の共有を容易にするため。 |
| 担当者: | Cameron および Chris (ACTION-3004, ACTION-3005) |
このオプションは基本的な SVG 1.1 のテキストレイアウトに対応する。
これは既定のテキストレイアウト方式であり、明示的に定義された コンテンツ領域がない場合に使用される。また、 パス上のテキストをレイアウトする最初の手順としても使用される(若干 修正された規則を使用する)。このレイアウト方式では、自動改行 または単語の折り返しは行われない。通常、テキストは 無限の幅と高さを持つ矩形の コンテンツ領域内に 1 行でレンダリングされる。複数行のテキストは、 あらかじめ改行位置を計算し、次のいずれかの方法を使用して得られる:
SVG 2 で新しく追加された。
次のプロパティは整形済みテキストには適用されない: text-align, text-align-last, line-break, word-break, hyphens, word-wrap, および overflow-wrap。
複数行の整形済みテキストは、 white-space の値 pre または pre-line を使用して作成できる。この場合、 ラインフィードまたはキャリッジリターンは強制的な 改行として保持され、新しい 行ボックスを作成する。行 ボックスは CSS の規則に従って積み重ねられる。
基本的な CSS テキストレイアウト 規則に従ってテキストをレイアウトした後、SVG 固有の規則を使用してタイポグラフィ文字を再配置できる。 絶対座標を ‘x’ および ‘y’ 属性で指定するか、 強制改行によって絶対 再配置を指定できる。絶対再配置は text-anchor プロパティの影響を受ける場合がある。相対再配置は、 相対座標を ‘dx’ および ‘dy’ 属性で指定できる。 また、 タイポグラフィ文字は、 ‘rotate’ 属性に値のリストを指定して任意に回転できる。絶対 再配置( text-anchor プロパティによる調整を含む)は、相対 再配置および回転より前に行われる。
コンテンツ領域が ‘text’ 要素に指定されている場合、テキストは自動的に折り返される。コンテンツ領域は、 テキストを折り返す最外部のコンテナーを定義する。 折り返し領域は コンテンツ領域と同じである。
コンテンツ領域が inline-size プロパティによって定義される場合、 最初にレンダリングされる タイポグラフィ文字に対応する ‘x’ および ‘y’ 属性が、 初期 現在のテキスト位置を定義する。
初期 現在のテキスト位置を決定する場合を除き、 ‘x’ および ‘y’ のすべての値は、 自動折り返しテキスト内の ‘text’ および ‘tspan’ 要素では無視される。
‘x’ および ‘y’ 属性は、 折り返しテキストについて SVG1.1 レンダラーに自然なフォールバック機構を提供できる。 コンテンツ制作者は、テキストをあらかじめレイアウトするために 行を ‘tspan’ 要素に分割し、 ‘x’ および ‘y’ 属性を指定してもよい。すると、 例えばフォールバックフォントが テキストのレンダリングに使用される場合、SVG2 レンダラーは ‘x’ および ‘y’ 属性を無視して テキストを フォールバックフォントのフォントメトリクスを使用して再フローする。SVG1.1 レンダラーは ‘x’ および ‘y’ 属性をテキストのレンダリングに使用するため、通常は レンダリングが図形と一致しなくても読みやすいテキストになる。 この節のテキスト折り返し例の多くは、 テキスト折り返しを実装していないブラウザーでもテキストをレンダリングできるよう、この 機構に依存している。
次の例は、図形内に テキストをレイアウトするときのいくつかの問題を示す。
任意の形状の 折り返し領域では、最初の 行ボックスが上端(縦書きテキストの場合は側端)にぴったり収まらないことがある。 この場合、最初の 行ボックスは、 収まるまで移動される。
CSS では、図形の辺は 1 ピクセル × 1 ピクセルの float の列として扱われる。
将来の CSS 仕様では、異なる 折り返し領域間でテキストを整列できるよう、 最初のテキスト行の位置を制御するための行グリッドが定義される可能性がある。
最上部の 行ボックス(小さな水色の矩形)は、 可能な限り小さいテキストブロックで構成され、 行ボックスが 折り返し 領域(水色の パス)内に収まるまで下へ移動される。行ボックスには line-height プロパティの効果が含まれ、ここでは 1.25 に設定されている。 赤い 矩形は各 行ボックス内のグリフをぴったり囲んでいる。
これは、折り返し領域の 上端を行グリッドの原点としていた SVG 1.2 草案とは異なるように見える。 最初の行は、図形内に収まるまで 行高だけ下へ移動されていた。
任意の形状の 折り返し領域では、1 行の テキストが複数の部分に分割される場合がある。この場合、 各部分について 行ボックスが作成される。1 行のテキスト内にある すべての 行ボックスの高さは同じでなければならない (すべての部分が同じベースラインを持つことを保証する)。この高さは、 そのテキスト行内のすべてのグリフを調べて計算される。
この既定の動作は、2016 年シドニーの CSS/SVG 合同ワーキング グループ会議で合意された。
将来の CSS 仕様では、異なる部分に 分割された図形のどの部分を埋めるかを制御できるようになる可能性がある(例えば、 最も右側の部分だけを埋める、最も左側の部分だけを埋める、など)。
SVG は、‘path’ 要素または 基本図形の等価パスによって定義されたパスに沿ってテキストを配置できる。これは、 ‘textPath’ 要素内にテキストを含め、 ‘href’ 属性に URL 参照を指定して ‘path’ 要素または 基本図形を指すか、‘path’ 属性の値を 指定して パスデータを直接指定することで行う。
基本図形に沿ってテキストを配置する機能は SVG 2 で新しく追加された。
基本図形に沿ったテキスト配置は、 シドニー (2015) 会議で決議された。
パスを指定するために 'd' 属性を直接使用する機能が SVG 2 に追加された。'd' 属性は、 ロンドン (2016) 編集者会議で、'd' が プレゼンテーション属性へ昇格したのと同時に 'path' へ改名された。
概念的に、パス上のテキストは 1 行の 整形済みテキストを パスに沿うよう変換したものと考えられる。特に示されない限り、 整形済みテキストに適用されるすべてのプロパティがパス上のテキストにも適用される。
| SVG 2 要件: | テキストパスの stretch 方式をより正確に説明する。 |
|---|---|
| 決議: | method="stretch" を >'textPath' 要素上で明確化する。 |
| 目的: | この機能の相互運用性を改善するため。 |
| 担当者: | Cameron(アクションなし) |
‘path’ 属性と ‘href’ 属性の両方が、 タイポグラフィ文字がレンダリングされる パスを指定する。
両方の属性が ‘textPath’ 要素に指定されている場合、 使用するパスは次の 優先順位に従わなければならない:
‘path’ 属性が指定されているが、 パスデータから 有効なパス区間が生成されない場合(例えば値が空 文字列である場合、またはパスデータ内でエラーが発生し、 有効なパス区間が 1 つも生成されない場合)、 ‘href’ 属性を代わりに使用しなければならない。 ‘path’ 属性が最初のエラーより前に有効なパス区間を含む場合、 パスはエラーまで使用され、 パスデータのエラー処理の規則に従い、 ‘href’ 属性はフォールバックとして使用されない。
初期の現在の テキスト位置についてのパス開始点からのオフセットであり、ユーザーエージェントの パスに沿った 距離アルゴリズムを使用して、 パスを ‘textPath’ 要素の座標系へ変換した後に計算される。
パーセント値以外の <length> が指定された場合、 ‘startOffset’ はパスに沿った距離を表し、 ‘textPath’ 要素の現在のユーザー座標系で測定される。
パーセント値が指定された場合、‘startOffset’ は パス全体に沿った距離のパーセント値を表す。したがって、 startOffset="0%" は パスの開始点を示し、 startOffset="100%" は パスの終点を示す。
負の値、およびパス長より大きい値 (例えば 150%)も許可される。
値を 0%-100% の範囲に制限すると、 パスに沿って移動するテキストのような効果を簡単に作成できなくなる。
中点がパス上にない タイポグラフィ文字は、 レンダリングされない。
‘startOffset’ 属性のさまざまな値によるレンダリング。上から順に: 既定値、50%、-50%。
一番下のパスでは、パスの左側に "path." だけが表示されるべきである。 Chrome と Safari はどちらも 0% から 100% の範囲外のオフセットを 正しく処理しない。Chrome のバグ: https://bugs.chromium.org/p/chromium/issues/detail?id=476554
単一の 閉じたサブパスからなるパス (基本図形の等価パスを含む)では、タイポグラフィ文字は パスを 1 周する範囲に沿ってレンダリングされる。テキストは、 text-anchor プロパティによって決定されるように、 ‘startOffset’ 属性で設定されたパス上の位置に配置される。 start (end)値では、テキストは 行の開始(終了)から、パス上の初期 位置へ再び到達するまでレンダリングされる。 middle では、テキストは 中点から両方向へ、パス上の初期 位置から両方向に等距離の点へ到達するまでレンダリングされる。
‘circle’ を参照するパス上のテキストで、‘startOffset’ 属性の値を変えた場合のレンダリング。左: 0。右: 75% または -25%。 赤い円はパスの開始点を示す( 円をパスへ標準分解した後)。
‘circle’ を参照するパス上のテキストで、text-anchor 属性の値を変えた場合のレンダリング。 左: 'start'。 中央: 'middle'。 右: 'end'。 赤い円はパスの開始点を示す( 円をパスへ標準分解した後)。 青い正方形はレンダリング開始の基準点を示す( パス開始点から ‘startOffset’ 値 75% だけ移動している)。灰色の矢印は タイポグラフィ文字を配置する方向と、 タイポグラフィ 文字の 配置が停止する点を示す。direction プロパティの値が rtl の場合、矢印の向きは反転する。
すべてのグリフをレンダリングすることは、基本図形について シドニー (2015) 会議で合意された(ただし議事録には記載されていない)。折り返しを 単一の閉じたサブパスを持つパスの 1 周に制限し、'startOffset' 属性によって制御することは、 ロンドン (2016) 編集者会議で合意された。
テキストをパスに沿ってどの方法でレンダリングすべきかを 示す。
align の値は、 タイポグラフィ文字を単純な 2×3 行列変換を使用して、 タイポグラフィ文字の伸長や変形が 生じないようレンダリングすることを示す。 通常、レンダリングする各 タイポグラフィ文字について、追加の回転、拡大縮小、 平行移動変換が行われる。その 結果、align では、 タイポグラフィ文字が連結するよう設計されたフォント (例えば筆記体フォント)で、テキストをパスに沿ってレンダリングすると 連結部分が正しく揃わない場合がある。
stretch の値は、 タイポグラフィ文字の輪郭を パスへ変換し、その後すべての終点および制御 点をパスからの垂直ベクトルに沿うよう 調整し、それによって グリフを伸長し、場合によっては変形することを示す。この方法では、筆記体のような連結する タイポグラフィ 文字も 連結を維持する。(垂直でない直線パス区間は、 水平な直線パスが タイポグラフィ文字がレンダリングされるパスから (ほぼ)一定のオフセットを持つように、ベジェ曲線へ変換すべきである。)
‘method’ の異なる値によるパス上のテキストのレンダリング: 左: 'align'。 右: 'stretch'。
パスに沿ってレンダリングされる タイポグラフィ文字間の間隔を、 ユーザーエージェントがどのように決定すべきかを示す。
exact の値は、 タイポグラフィ文字を パス上のテキストのレイアウト 規則で指定される間隔規則に正確に従って レンダリングすべきことを示す。
auto の値は、 ユーザーエージェントが視覚的に好ましい結果を得るため、 パス上のテキストのレイアウトアルゴリズムを使用して タイポグラフィ文字間の間隔を 調整すべきことを示す。
テキストを配置するパスの側 (パスの方向に対して)を決定する。 right の値を指定すると、実質的に パスが反転する。
テキストを 閉じたサブパスおよび 基本図形(例えば矩形、 円、楕円)の内側または外側に配置できるよう SVG 2 で追加された。
'side' の追加は、 シドニー (2015) 会議で決議された。
パスデータ 文字列は、タイポグラフィ 文字が レンダリングされるパスを記述する。 属性が指定されていない場合、または パスデータから 有効なパス区間が生成されない場合(例えば値が空 文字列である場合、または有効なパス区間より前にエラーが発生した場合)、 ‘href’ で指定されたパスが代わりに使用される。 パスデータにエラーが含まれていても、エラーより前に少なくとも 1 つの有効な パス区間が生成される場合、パスの有効な部分が パスデータのエラー処理の規則に従って使用される。
‘path’ 属性が指定されていない場合に、 グリフがレンダリングされる ‘path’ 要素 または 基本図形要素への URL 参照。 属性が使用され、<url> が無効な 参照である場合(例えば、そのような要素が存在しない、または参照される 要素が ‘path’ 要素でも 基本図形でもない場合)、 ‘textPath’ 要素はエラー状態となり、その コンテンツ全体をユーザーエージェントはレンダリングしてはならない。
URL 参照 属性および 非推奨の XLink 属性について定義された共通の処理を参照すること。
参照される ‘path’ 要素または 基本図形 要素内のパスデータ座標は、 その ‘path’ 要素が 定義された座標系ではなく、現在の ‘text’ 要素と 同じ座標系にあるものと仮定される。参照される ‘path’ 要素または 基本図形 要素上の transform 属性は、現在の ‘text’ 要素の現在のユーザー 座標系に対する追加の変換を表し、 現在の ‘text’ 要素上の可能な transform プロパティによる 現在のユーザー座標系への調整も含む。例えば、次の SVG コンテンツ断片:
<svg xmlns="http://www.w3.org/2000/svg"> <g transform="translate(25,25)"> <defs> <path id="path1" transform="scale(2)" d="M0,10 L40,20 80,10" fill="none" stroke="red"/> </defs> </g> <text transform="rotate(45)"> <textPath href="#path1">パス上のテキスト</textPath> </text> </svg>
は次と同じ効果を持つべきである:
<svg xmlns="http://www.w3.org/2000/svg"> <g transform="rotate(45)"> <defs> <path id="path1" transform="scale(2)" d="M0,10 L40,20 80,10" fill="none" stroke="red"/> </defs> <text> <textPath href="#path1">パス上のテキスト</textPath> </text> </g> </svg>
そして次と等価である:
<svg xmlns="http://www.w3.org/2000/svg"> <text transform="rotate(45)"> <textPath path="M0,20 L80,40 160,20" >パス上のテキスト</textPath> </text> </svg>
transform="translate(25,25)" は
‘textPath’ 要素には影響しないが、
transform="rotate(45)" は
‘text’ と、
パス上のテキストの参照図形として使用される
‘path’
要素の両方に適用されることに注意すること。さらに、
transform="scale(2)" は
パスを拡大縮小する(単純な線形パスでは各座標を 2 倍することと等価)が、
パスに沿って配置されるテキストは拡大縮小しないことにも注意すること。
toap01 の例は、 パス上のテキストの簡単な例を示す:
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="3.6cm" viewBox="0 0 1000 300" version="1.1"
xmlns="http://www.w3.org/2000/svg">
<defs>
<path id="MyPath"
d="M 100 200
C 200 100 300 0 400 100
C 500 200 600 300 700 200
C 800 100 900 100 900 100" />
</defs>
<desc>toap01 の例 - パス上の簡単なテキスト</desc>
<use href="#MyPath" fill="none" stroke="red" />
<text font-family="Verdana" font-size="42.5" fill="blue" >
<textPath href="#MyPath">
上へ行き、次に下へ行き、そしてまた上へ行く
</textPath>
</text>
<!-- 'rect' 要素を使用してビューポートの輪郭を表示 -->
<rect x="1" y="1" width="998" height="298"
fill="none" stroke="blue" stroke-width="2" />
</svg>
toap01 の例
toap02 の例は、 ‘tspan’ 要素を ‘textPath’ 要素内に含めて、スタイル属性を調整し、 特定のグリフをレンダリングする前に現在のテキスト位置を 調整する方法を示す。"up" という単語の最初の出現箇所は 赤色で塗りつぶされる。‘dy’ 属性は "up" という単語を ベースラインから持ち上げるために使用される。
‘x’, ‘y’, ‘dx’, ‘dy’, および ‘rotate’ 属性は、 ‘text’ および ‘tspan’ 要素にのみ 指定できる(ただし、パス上のテキストのグリフのレンダリングに影響する場合がある — パス上のテキストのレイアウト 規則を参照)。
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="3.6cm" viewBox="0 0 1000 300" version="1.1"
xmlns="http://www.w3.org/2000/svg">
<defs>
<path id="MyPath"
d="M 100 200
C 200 100 300 0 400 100
C 500 200 600 300 700 200
C 800 100 900 100 900 100" />
</defs>
<desc>toap02 の例 - textPath 内の tspan</desc>
<use href="#MyPath" fill="none" stroke="red" />
<text font-family="Verdana" font-size="42.5" fill="blue" >
<textPath href="#MyPath">
私たちは
<tspan dy="-30" fill="red" >
上へ
</tspan>
<tspan dy="30">
行き、
</tspan>
次に下へ行き、そしてまた上へ行く
</textPath>
</text>
<!-- 'rect' 要素を使用してビューポートの輪郭を表示 -->
<rect x="1" y="1" width="998" height="298"
fill="none" stroke="blue" stroke-width="2" />
</svg>
toap02 の例
toap03 の例は、 ‘textPath’ 要素上の ‘startOffset’ 属性を使用して、 テキスト文字列の開始位置を パスに沿った特定の位置として指定する方法を示す。パスの 終端を越えたグリフはレンダリングされないことに注意すること (パス上のテキストのレイアウト 規則を参照)。
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="3.6cm" viewBox="0 0 1000 300" version="1.1"
xmlns="http://www.w3.org/2000/svg">
<defs>
<path id="MyPath"
d="M 100 200
C 200 100 300 0 400 100
C 500 200 600 300 700 200
C 800 100 900 100 900 100" />
</defs>
<desc>toap03 の例 - startOffset 属性を持つパス上のテキスト</desc>
<use href="#MyPath" fill="none" stroke="red" />
<text font-family="Verdana" font-size="42.5" fill="blue" >
<textPath href="#MyPath" startOffset="80%">
上へ行き、次に下へ行き、そしてまた上へ行く
</textPath>
</text>
<!-- 'rect' 要素を使用してビューポートの輪郭を表示 -->
<rect x="1" y="1" width="998" height="298"
fill="none" stroke="blue" stroke-width="2" />
</svg>
toap03 の例
概念的には、パス上のテキストでは対象パスを 水平または垂直の直線区間へ引き伸ばす。水平 テキストレイアウトフローでは、パスを仮想的な 水平線分へ引き伸ばし、 パスの開始点を線分の左側に対応付ける。垂直テキスト レイアウトフローでは、パスを仮想的な 垂直線分へ引き伸ばし、 パスの開始点を線分の上端に対応付ける。標準の テキストレイアウト規則を 仮想的な直線区間に適用し、その結果を 対象パスへ戻して対応付ける。縦書きおよび 双方向の テキストレイアウト規則も パス上のテキストに適用される。
パスに沿った各グリフの向きは個別に決定される。
水平テキストレイアウトフローでは、指定されたグリフの既定の向き(上
方向)は、そのグリフが
取り付けられるパス上の交点から始まり、
その交点における曲線の角度から反時計回りに 90 度の
方向を向くベクトルに沿う。垂直テキストレイアウトフローでは、
指定されたグリフの既定の向きは、そのグリフが取り付けられる
パス上の交点から始まり、
その交点における曲線の角度から
180 度の方向を向くベクトルに沿う。
パスに沿ったグリフの既定の向き。 左は横書きテキスト。右は縦書きテキスト。
toap04 の例は、 直線上の横書きまたは縦書き テキストに対する基本的な テキスト レイアウト規則を補う、 パス上のテキスト固有のレイアウト規則を示すために使用する。
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="3.6cm" viewBox="0 0 1000 300" version="1.1"
xmlns="http://www.w3.org/2000/svg">
<defs>
<path id="MyPath"
d="M 100 125
C 150 125 250 175 300 175
C 350 175 450 125 500 125
C 550 125 650 175 700 175
C 750 175 850 125 900 125" />
</defs>
<desc>toap04 の例 - パス上のテキストのレイアウト規則</desc>
<use href="#MyPath" fill="none" stroke="red" />
<text font-family="Verdana" font-size="60" fill="blue" letter-spacing="2" >
<textPath href="#MyPath">
恥を選ぶか、それとも戦争を得るか
</textPath>
</text>
<!-- 'rect' 要素を使用してビューポートの輪郭を表示 -->
<rect x="1" y="1" width="998" height="298"
fill="none" stroke="blue" stroke-width="2" />
</svg>
toap04 の例
次の図は、‘text’ 要素内の 最初のグリフを最初に拡大して示す。
上の小さな点は、グリフが パスへ取り付けられる点を示す。グリフの周囲のボックスは、 グリフの水平軸が、 グリフがパスへ取り付けられる点における 曲線の接線と平行になるよう回転していることを示す。この ボックスは、グリフの 文字幅 (すなわち、水平テキスト レイアウトを使用してグリフを描画するときに、現在のテキスト位置が 水平方向へ進む量)も示す。
次の図は、詳細な レイアウト規則を示すため、さらに拡大している。
パスに沿った左から右への水平テキストレイアウト (すなわち、グリフの向きが インライン基底方向に対して垂直である場合)のレイアウト規則は次のとおり:
パスに沿った上から下への縦書きテキスト レイアウト(すなわち、グリフの向きが インライン基底方向と平行である場合)には、 比較可能な規則が使用され、レイアウト規則は次のとおり:
上記の計算で、パス上の開始点または パス上の終点がパスの終端を越える場合、 パスの終点における接線と 平行な直線でパスを終点の外側まで延長し、 パス上の中点を引き続き計算できるようにする。
インライン基底方向が 水平の場合、‘text’ または ‘tspan’ 要素上の ‘x’ 属性は、 パスに沿った新しい絶対オフセットを表し、 パス上の開始点に明示的な新しい値を提供する。‘text’ または ‘tspan’ 要素上の ‘y’ 属性は無視される。 インライン基底方向が 垂直の場合、‘text’ または ‘tspan’ 要素上の ‘y’ 属性は、 パスに沿った新しい絶対オフセットを表し、 パス上の開始点に明示的な新しい値を提供する。‘text’ または ‘tspan’ 要素上の ‘x’ 属性は無視される。
‘textPath’ 内のすべての文字を配置した後、 現在のテキスト位置はパスの終点に設定される。 単一の閉じたループであるパスの場合は ‘startOffset’ を考慮して調整する。 言い換えると、 ‘textPath’ 要素の後に続くテキスト (ただし引き続き ‘text’ 要素内にあるもの)で、 明示的な配置 情報(‘x’ および ‘y’ 属性)を持たないものは、 パスの終点から配置される。
明示的な配置情報を持たない ‘textPath’ 要素の後のテキストの開始点は、 パスの終点(赤い点)にある。
最後の文字の位置ではなくパスの終点を選んだのは、 著者にとって予測しやすい (フォントなどに依存しない)ためである。 ロンドン (2016) 編集者会議で決定された。 GitHub Issue 84 も参照。
‘text’ 要素は、 1 つ以上のチャンクとしてレンダリングされる。 各チャンク(テキストレイアウトアルゴリズムによって生成される)は、 文書順に 1 つずつレンダリングされる。それぞれの レンダリングされるチャンクは 1 つ以上のグリフから構成され、 単一のパスであるかのように塗りつぶされ、ストロークされる。
これは、チャンク内のすべてのグリフをまず塗りつぶし、 その後すべてのグリフを一度にストロークするか、 paint-order プロパティの値に従ってその逆を行うことを意味する。
ペイントの目的では、‘text’ は 0 個、1 個、または複数の 等価パスを持ち、各チャンクにつき 1 つである。各等価パスは、 そのチャンク内の各グリフにつき 1 つのサブパスから構成される。
fill-rule プロパティは SVG テキスト要素には適用されないため、 等価パス内のサブパスの具体的な順序は重要ではない。
各サブパスの開始位置、およびグリフ形状の周囲を パスが進む方向は定義されない。 ただし、ユーザーエージェントは指定されたフォントとグリフについて一貫しているべきである。
これは、テキスト上の破線ストロークでは、 異なる実装間で破線パターンが同じ位置に配置されない可能性があることを意味する。
CSS はテキストをスタイル付けするための多数のプロパティを提供する。 一般に SVG に適用できるのは 2 種類のプロパティだけである: どのグリフをレンダリングするかを決定するもの (font-family, font-style など)と、 段落レベルで 適用されるもの(direction, writing-mode, line-height, letter-spacing など)である。
SVG テキスト要素でサポートしなければならない CSS プロパティの一覧は、 スタイル付けの章にある。
text-indent, line-break, word-break, hyphens, word-wrap, overflow-wrap。
さらに、フォント選択について @font-face 規則をサポートしなければならず、 ::first-line および ::first-letter 擬似要素も ‘text’ 要素でサポートしなければならない。 インタラクティブモードでは、::selection 擬似要素もサポートしなければならない。
テキストのレイアウトおよびレンダリングに影響するその他の CSS プロパティも SVG ユーザーエージェントによってサポートしてよい。その効果は、 SVG テキストレイアウト処理全体の CSS テキストレイアウト手順の一部として考慮すべきである。
例えば、SVG 2 は text-combine-upright プロパティのサポートを要求しないが、SVG コンテキストでのその動作は明白であるべきである。
多くの CSS プロパティは SVG テキスト要素に一切影響してはならない:
さらに、::before および ::after 生成コンテンツ擬似要素は SVG テキスト要素に適用してはならない。
将来の仕様では、 ::before および ::after 生成コンテンツ擬似要素のサポートが導入される可能性がある。 著者は、それらが無視されることに依存すべきではない。
この節では、この仕様の他の箇所では扱われておらず、 SVG に固有のプロパティを扱う。
text-anchor プロパティは、 整形済みテキストの文字列、または 折り返し領域が inline-size プロパティから決定される 自動折り返しテキストを、指定された点に対して (開始、中央、または終了に)揃えるために使用される。その他の種類の 自動折り返しテキストには適用されない。代わりに text-align を参照すること。 複数行テキストでは、各行について配置が行われる。
text-anchor プロパティは、 指定された ‘text’ 要素内の個々の テキストチャンクに適用される。各テキスト チャンクには初期 現在のテキスト位置があり、 これは、コンテキストに応じて、‘text’ 要素上の ‘x’ および ‘y’ 属性の適用、 ‘tspan’ 要素上の ‘x’ または ‘y’ 属性値が テキストチャンク内で最初にレンダリングされる 文字へ明示的に割り当てられた結果、または ‘textPath’ 要素の初期の現在の テキスト位置の決定によって生じるユーザー座標系内の点を表す。各テキストチャンクには 最終 現在のテキスト位置もあり、これは テキストチャンク内の最後のグリフを配置した後の 現在のテキスト位置である。これらの位置は、 text-anchor プロパティを適用する前に決定される。
| 名前: | text-anchor |
|---|---|
| 値: | start | middle | end |
| 初期値: | start |
| 適用対象: | テキストコンテンツ要素 |
| 継承: | はい |
| パーセント値: | 該当なし |
| メディア: | 視覚 |
| 計算値: | 指定値のまま |
| アニメーション型: | 離散 |
各値の意味は次のとおり:
複数行テキスト上で text-anchor を使用する例。
<svg xmlns="http://www.w3.org/2000/svg"
width="300" height="100" viewBox="0 0 300 100">
<text x="150" y="30" style="font: 20px sans-serif; white-space: pre-line;
text-anchor: middle;">
この複数行テキストは
中央にアンカーされる。</text>
</svg>
保持されたラインフィードによって 2 つの テキストチャンクが作成され、それぞれ 独立してアンカーされる。
複数行テキスト上で text-anchor を使用する 別の例。
<svg xmlns="http://www.w3.org/2000/svg"
width="200" height="150" viewBox="0 0 200 150">
<path d="m 100,0 0,150" style="fill:none;stroke:#add8e6"/>
<text x="100 100 100" y="50 95 140"
style="font-size: 42px; text-anchor: middle">I❤SVG</text>
</svg>
このプロパティは SVG 2 で削除された。
このプロパティは縦書きテキストにのみ適用される。SVG 2 では廃止され、 CSS Writing Modes Level 3 の text-orientation プロパティによって一部置き換えられた。次の SVG 1.1 の値は、引き続きこのプロパティを text-orientation の短縮形として別名化することでサポートしなければならない:
その他の値はすべて無効として扱わなければならない。
‘kerning’ プロパティは SVG 2 で削除された。
SVG 1.1 は 'kerning' プロパティを使用して、 フォントのカーニングテーブルをグリフ間 間隔の調整に使用するかどうかを決定する。また、 <length> 値も許可し、 指定された場合はグリフ間の間隔に追加される( letter-spacing プロパティによるものに追加される)。この プロパティは SVG 2 で、 フォントのカーニングテーブルを使用するかどうかだけを制御する CSS font-kerning プロパティに置き換えられる。
Chrome の UseCounter データは 2014 年に 0.01% の使用率を示した。GitHub issue 80 を参照。
この節では、この仕様の他の箇所では扱われておらず、 SVG 固有の調整があるか、SVG 1.1 から大幅に 変更された CSS プロパティを扱う。
| SVG 2 要件: | CSS3 Fonts を参照する。 |
|---|---|
| 決議: | SVG 2 は CSS3 Fonts に依存する。 |
| 目的: | Web フォント機能について CSS 2.1 および CSS3 と整合し、 フォントの高度なタイポグラフィ機能へアクセスできるようにするため。 |
| 担当者: | Chris (ACTION-3123) |
font-variant プロパティは CSS Font Module ([css-font-3]) で定義される。
CSS Font Module は、 font-variant プロパティの意味を CSS 2.1 の定義から変更した。このプロパティは、 単一フォント内からフォント バリアントを選択するための短縮形として再利用され( 機能も大幅に拡張された)。
SVG 2 はすべての font-variant ロングハンドプロパティ (例えば font-variant-ligatures)をサポートする。
SVG は line-height プロパティを使用して、 複数行テキストの行間に追加される リーディング量を決定する (横書きおよび縦書きテキストの両方)。パス上の テキストには適用されない。
ここで提供される追加情報を除き、 line-height プロパティの 規範的な 定義は CSS 2.1 仕様 ([CSS2]) にある。
CSS Inline Module Level 3 は 'line-height' の定義を更新する可能性がある。
writing-mode プロパティは CSS Writing Modes Module ([css-writing-modes-3]) で定義される。
このプロパティは ブロックフロー方向、言い換えると、 テキスト行が積み重ねられる方向を設定する。その結果、 テキストが水平向きか垂直向きかも決定する。
SVG 2 は CSS Writing Modes Level 3 を 'writing-mode' プロパティの定義として参照する。この仕様は、このプロパティに新しい値を導入する。 SVG 1.1 の値は廃止されているが、 指定値を次のように計算値へ変換することで引き続きサポートしなければならない:
SVG 1.0 では、このプロパティは インライン基底方向も設定すると解釈できたため、 direction プロパティとの役割の違いについて混乱を招いた。SVG 1.1 は direction の役割について若干 具体的であった(例えば direction が text-anchor プロパティの基準点を設定すること)が、 依然として解釈の余地があった。SVG 1.0 と SVG 1.1 のどちらも 複数行テキストを許可しなかったことも混乱を増した。
このプロパティは ‘text’ または ‘tspan’ 要素の
インライン基底方向を指定する。これは、
text-anchor および inline-size プロパティで使用されるテキスト行の
start
および end
の点を定義する。また、
unicode-bidi
プロパティの値が
embed または
bidi-override の場合、
文字が配置される方向にも影響する場合がある。
direction プロパティは、 インライン基底方向に対して垂直に向けられたグリフにのみ適用される。 これには通常の水平方向のラテン文字または アラビア語テキスト、および上から下への インライン基底方向に対して時計回りに 90 度回転した 狭いセルのラテン文字またはアラビア文字が含まれる。
レビュー担当者は、これが CSS3 Writing Modes と一致していることを特に注意して確認してほしい。
ここで提供される追加情報を除き、 direction プロパティの 規範的な 定義は CSS Writing Modes Level 3 ([css-writing-modes-3]) にある。
多くの場合、Unicode [UNICODE] の双方向アルゴリズムが目的の 結果を自動的に生成するため、その場合著者は これらのプロパティを使用する必要がない。右から左へ書く言語を使用する場合など その他の場合では、 direction プロパティを 最外部の svg 要素に追加し、 その方向をすべてのテキスト要素に継承させるだけで十分な場合がある。次の 例のように(テンプレートとして使用できる):
<svg xmlns="http://www.w3.org/2000/svg"
width="100%" height="100%" viewBox="0 0 600 72"
direction="rtl" xml:lang="fa">
<title direction="ltr" xml:lang="en">右から左へのテキスト</title>
<desc direction="ltr" xml:lang="en">
主に右から左へ書く言語を使用する文書で
'direction' プロパティを使用する簡単な例。
</desc>
<text x="300" y="50" text-anchor="middle" font-size="36">داستان SVG 1.1 SE طولا ني است.</text>
</svg>
例
次は、暗黙的な bidi 並べ替えだけでは不十分な別の例である:
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg"
width="100%" height="100%" viewBox="0 0 600 72"
direction="rtl" xml:lang="he">
<title direction="ltr" xml:lang="en">右から左へのテキスト</title>
<desc direction="ltr" xml:lang="en">
主に右から左へ書く言語を使用する文書で
'direction' および 'unicode-bidi' プロパティを使用する例。
</desc>
<text x="300" y="50" text-anchor="middle" font-size="36"> כתובת MAC:‏
<tspan direction="ltr" unicode-bidi="embed">00-24-AF-2A-55-FC</tspan>
</text>
</svg>
例
このプロパティは CSS Line Layout Module 3 仕様で定義される。 'dominant-baseline' を参照。 [css-inline-3]
SVG 2 はこのプロパティの定義にいくつかの変更を導入する。 特に:
SVG は dominant-baseline プロパティの値を使用して、 ‘x’ および ‘y’ 属性に対してグリフを揃える。 text-orientation の値 sideways では、 dominant-baseline の auto 値は alphabetic である。ただし後方 互換性のため、グリフは ‘x’ および ‘y’ 属性に、 central の値を使用して揃えるべきである。
このプロパティは CSS Line Layout Module 3 仕様で定義される。 'alignment-baseline' を参照。 [css-inline-3]
新しいコンテンツでは、 vertical-align プロパティの短縮形を優先すべきである。
SVG 2 はこのプロパティの定義にいくつかの変更を導入する。 特に、'auto', 'before-edge', および 'after-edge' の値が削除された。後方互換性のため、'text-before-edge' は 'text-top' に、'text-after-edge' は 'text-bottom' にマッピングすべきである。'text-before-edge' と 'text-after-edge' のどちらも vertical-align プロパティと共に使用すべきではない。
このプロパティは CSS Line Layout Module 3 仕様で定義される。 'baseline-shift' を参照。 [css-inline-3]
新しいコンテンツでは、 vertical-align プロパティの短縮形を優先すべきである。
'vertical-align' を 'alignment-baseline' および 'baseline-shift' の短縮形へ変更したことに伴い、'baseline' 値は削除された。 これは 'alignment-baseline' の値でもあり、 長さ値 '0' と重複するためである。
| SVG 2 要件: | ベースライン配置機能について CSS と整合させる。 |
|---|---|
| 決議: | SVG 2 は ‘baseline-shift’ を非推奨とし、代わりに ‘vertical-align’ を使用する。 |
| 目的: | CSS と整合させるため。 |
| 担当者: | Cameron (ACTION-3281) |
'baseline-shift' は下付き文字と上付き文字を揃えるために重要である(Inkscape は この目的でこれに依存している)。これは CSS Inline Layout Module Level 3 に残っている。 'vertical-align' は、'baseline-shift' を含む 複数のプロパティを一度に変更する短縮形である。
特に注記されない限り、 letter-spacing の定義については CSS Text Level 3 を参照すること。([css-text-3])。
SVG 1.1 は letter-spacing プロパティでパーセント値を許可していた。 SVG ビューポートに基づくパーセント値は 有用ではないと判断されたため、SVG 2 では削除された。これにより 'letter-spacing' の定義は CSS と整合する。
特に注記されない限り、 word-spacing の定義については CSS Text Level 3 を参照すること。([css-text-3])。
SVG 2 は word-spacing プロパティのパーセント値の意味を変更する。SVG 1.1 では、パーセント値は SVG ビューポート サイズのパーセント値として追加間隔を定義する。SVG ビューポートに基づくパーセント値は 有用ではないと判断された。SVG 2 では、CSS Text Level 3 に従い、パーセント値は 影響を受ける文字の 幅のパーセント値として追加間隔を定義する。 これにより 'word-spacing' の定義は CSS と整合する。
| SVG 2 要件: | text-overflow 機能を追加する。 |
|---|---|
| 決議: | SVG 2 に text-overflow を追加する。 |
| 目的: | CSS と整合させ、すべてのテキストが表示されていないことを示せるようにするため。 |
| 担当者: | Erik (ACTION-3003) |
SVG 2 で新しく追加された。 あらかじめ定義された折り返し領域を越えるテキスト文字列を ユーザーエージェントがより有用な方法で処理できるよう追加された。SVG と HTML/CSS の テキスト処理を整合させる。
'text-overflow' の定義については CSS3 Overflow 仕様を参照すること。 [css-overflow-3]
SVG は text-overflow プロパティを使用して、 テキストコンテンツブロック要素内のテキストが 行ボックスを越える場合、例えば white-space プロパティの値が nowrap の場合に、 どのようにレンダリングするかを制御する。このプロパティは 整形済みテキストまたはパス上のテキストには適用されない。
SVG では text-overflow は、 折り返し領域が有効に 指定されていれば、 テキストコンテンツブロック要素上の overflow プロパティの計算値に関係なく効果を持つ。
text-overflow プロパティの値が ellipsis の場合、レンダリングされる テキストが 折り返し領域を越えると、 指定された領域内に収まるよう省略記号を レンダリングする。レンダリングの目的では、 省略記号は挿入位置の文字を置き換えたものとして扱われる。
text-overflow プロパティの値が clip の場合、 折り返し領域を越えるテキストはクリップされる。 文字は部分的にレンダリングされる場合がある。
text-overflow のその他の値は、 指定されていなかったかのように 扱われる。
text-overflow の効果は純粋に 視覚的であり、 省略記号自体が DOM の一部になることはない。すべての DOM メソッドでは text-overflow が 適用されておらず、 折り返し領域がテキストを制約していないかのように扱われる。
次の例は text-overflow の使用を示す。 最上部の行は、通常どおりレンダリングされるテキストを示す( white-space の値 pre によりテキストが越えるが、 overflow の値 visible により表示される)。 中央の行は text-overflow の値 clip を持つテキストを示し、 最下部の行は text-overflow の値 ellipsis を持つテキストを示す。
<svg xmlns="http://www.w3.org/2000/svg"
width="300" height="150" viewBox="0 0 300 150">
<style>
text { font: 25px sans-serif; white-space: pre; }
path { fill: none; stroke: #add8e6; }
</style>
<path d="m 50,0 0,150"/>
<path d="m 200,0 0,150"/>
<text x="50" y="35" inline-size="100" style="overflow:visible">SVG は素晴らしい</text>
<text x="50" y="85" inline-size="100" style="text-overflow:clip">SVG は素晴らしい</text>
<text x="50" y="135" inline-size="100" style="text-overflow:ellipsis">SVG は素晴らしい</text>
</svg>
text-overflow プロパティを テキスト要素に使用したもの。最下部の行では省略記号を適用した テキストが示される。
このプロパティは役に立たないという意見がある。 隠されたテキストを公開する機構 (省略記号にホバーしたときのツールチップなど)と組み合わせれば、より有用になるだろう。text-overflow プロパティは行の終端を越えるテキストだけを扱う。 折り返し領域の終端を越えるテキストは扱わない。
SVG 2 で新しく追加された。空白の処理をより有用に 制御できるよう white-space が追加された。 SVG と HTML/CSS のテキスト処理を整合させる。‘xml:space’ は新しいコンテンツでは非推奨だが、 後方互換性のため保持される。
SVG 2 の空白のレンダリングは white-space プロパティによって制御される。これは 2 つのことを指定する:
値とその意味は、 CSS Text Module Level 3 で定義される。[css-text-3]
white-space の値 pre-line を使用する例。
<svg xmlns="http://www.w3.org/2000/svg">
width="200" height="200" viewBox="0 0 200 200">
<text x="150" y="30" style="font: 20px IPAMincho; writing-mode: vertical-rl;
white-space: pre-line;">
千利奴流乎和加
餘多連曽津祢那
良牟有為能於久
耶万計不己衣天
阿佐伎喩女美之
恵比毛勢須</text>
</svg>
改行を含む複数行の縦書きテキストの例。テキストは 日本の詩いろはから取られている。行は 伝統的な位置で改行される。
互換性のため、SVG 2 は XML 属性 ‘xml:space’ もサポートし、 指定された ‘text’ 要素の文字データ内の 空白文字の処理を指定できる。新しいコンテンツでは ‘xml:space’ を使用せず、 代わりに white-space プロパティを使用すべきである。
この節は、xml:space に関する説明を限定するよう 簡略化し、代わりにユーザーエージェントスタイルシートで white-space プロパティを使用して定義すべきである。 CSS Text 4 仕様の preserve-spaces 値は、 'white-space-collapse' プロパティについて、 xml:space=preserve と一致させることを意図している。 (fantasai は 合意した。white-space に適切な値を追加して、 SVG 1.1 の特殊な xml:space="preserve" の動作と一致させる。)
‘text’ 要素の任意の子要素も ‘xml:space’ 属性を持つことができ、それは その子要素のテキストコンテンツに適用されることに注意すること。SVG ユーザーエージェントには、 以下で説明するように、この属性に関連する特別な 処理規則がある。これらは XML の構文解析 [XML] および DOM の構築後に生じる動作である。
‘xml:space’ は、 次の 2 つの値のいずれかを取ることができる 継承可能な属性である:
"a b"("a" と
"b" の間に 3 個の空白)は、"a b"("a" と "b" の間に 1 個の空白)より
大きな間隔を生成する。
次の例は、 xml:space="default" を使用するときに 行のインデントが重要になり得ることを示す。下の断片は、 似た 2 組の ‘text’ 要素を示し、 両方の ‘text’ 要素が xml:space="default" を使用する。 これらの例では、どの行の末尾にも余分な空白はない (すなわち、改行は最後の 可視文字の直後に発生する)。
[01] <text xml:space='default'> [02] WS の例 [03] インデントされた行 [04] </text> [05] <text xml:space='preserve'>WS の例 インデントされた行</text> [06] [07] <text xml:space='default'> [08]WS の例 [09]インデントされていない行 [10] </text> [11] <text xml:space='preserve'>WS の例インデントされていない行</text>
上の最初の ‘text’ 要素の組は、 インデントされた文字データの効果を示す。最初の ‘text’ 要素内の属性 xml:space="default" は、 ユーザーエージェントに次を指示する:
上の 2 番目の ‘text’ 要素の組は、 インデントされていない文字データの効果を示す。3 番目の ‘text’ 要素内の属性 xml:space="default" は、 ユーザーエージェントに次を指示する:
XML パーサーは、改行を表す標準的な 表現(例えば、文字通りの 2 文字シーケンス "U+000D U+000A"、CARRIAGE-RETURN LINE-FEED、 または単独の U+000D もしくは U+000A)を、 文字データを アプリケーションへ渡す前に単一の文字 U+000A へ変換する必要があることに注意すること。したがって SVG 内の各改行は、 元のリソースでどの表現が 改行に使用されていたかに関係なく、 単一の文字 U+000A で表される。( XML の 行末処理を参照。)
SVG 言語または SVG DOM 内の、 ‘text’ および ‘tspan’ 要素上の ‘x’, ‘y’, ‘dx’, ‘dy’ および ‘rotate’ 属性など、文字位置番号に基づくすべての機能は、 ここで説明する空白処理規則を適用した後の 文字位置に基づく。特に、 xml:space="default" の場合、 処理の一部として空白文字が削除されることが多い。 文字位置番号は、この節の規則に従って 空白文字が削除された後のテキスト文字列を参照する。
空白文字に対応するグリフは、 グリフ自体が空白でない場合でも、 可視だが空白のスペースとしてのみ表示すべきであることに注意すること。 未対応文字の 表示 [UNICODE] を参照。
‘xml:space’ 属性は:
アニメーション可能: いいえ。
古い SVG 1.1 コンテンツは ‘xml:space’ を使用する。新しいコンテンツ、 および修正される古いコンテンツは、 white-space を使用し、既存の ‘xml:space’ を削除する。ただし、 ユーザーエージェントは同じ要素で 両方の方式を使用するコンテンツに遭遇する場合がある。 white-space プロパティが任意の要素に設定されている場合、 ‘xml:space’ の値は 無視される。
SVG 内のテキストには、下線、上線、 および/または取り消し線で装飾できる。装飾の位置とスタイルは、 text-decoration-line および text-decoration-style プロパティ、 または 線 装飾の節で定義される text-decoration 短縮プロパティによってそれぞれ決定される。 CSS Text Decoration Module Level 3 [(css-text-decor-3)] 仕様を参照。
テキスト装飾の塗りとストロークは、 テキスト装飾が宣言された位置における テキストの塗りとストロークによって与えられる(下の例を参照)。
text-decoration-line および text-decoration-style プロパティは SVG 2 で新しく追加された。 SVG 1.1/CSS 2.1 の text-decoration プロパティは、 後方互換性を保つ方法でこれらの プロパティの短縮形へ変換される。
テキストおよび装飾を描く順序は、 テキスト装飾の ペイント順序の節で定義される。 CSS Text Decoration Module Level 3 を参照。テキスト 装飾自体のペイント順序(塗り/ストローク)は、 テキスト装飾が宣言された位置における paint-order プロパティの値によって決定される。
textdecoration01 の例は、 text-decoration の例を示す。最初のテキスト行には text-decoration の値がないため、初期 値 text-decoration:none が 使用される。2 行目は text-decoration:line-through を示す。 3 行目は text-decoration:underline を示す。 4 行目は、装飾が text-decoration が指定された 要素に存在するものと同じ塗りおよびストロークプロパティを使用してレンダリングされるという規則を示す。 text-decoration は ‘text’ 要素に指定されているため、‘text’ 要素内のすべてのテキストの 下線は、‘text’ 要素に 存在するものと同じ塗りおよびストロークプロパティ (すなわち青い塗り、赤いストローク)でレンダリングされる。 さまざまな単語が異なる塗りおよびストローク プロパティ値を持っていても同様である。ただし、"different" という単語は text-decoration の値を明示的に指定するため、その 下線は、 "different" という単語を囲む ‘tspan’ 要素の 塗りおよびストロークプロパティ (すなわち黄色の塗り、darkgreen のストローク)を使用してレンダリングされる:
<?xml version="1.0" standalone="no"?>
<svg width="12cm" height="4cm" viewBox="0 0 1200 400"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<desc>textdecoration01 の例 - 'text-decoration' プロパティの動作</desc>
<rect x="1" y="1" width="1198" height="398" fill="none" stroke="blue" stroke-width="2" />
<g font-size="60" fill="blue" stroke="red" stroke-width="1" >
<text x="100" y="75">通常のテキスト</text>
<text x="100" y="165" text-decoration="line-through" >取り消し線付きテキスト</text>
<text x="100" y="255" text-decoration="underline" >下線付きテキスト</text>
<text x="100" y="345" text-decoration="underline" >
<tspan>1 つの </tspan>
<tspan fill="yellow" stroke="purple" >単語だけ </tspan>
<tspan fill="yellow" stroke="black" >下線が </tspan>
<tspan fill="yellow" stroke="darkgreen" text-decoration="underline" >異なって </tspan>
<tspan fill="yellow" stroke="blue" >いる</tspan>
</text>
</g>
</svg>
textdecoration01 の例
テキスト選択が可能なシステム(例えば、 マウスなどのポインティングデバイスを備えたシステム)上で動作し、 コピー/貼り付け操作用のシステムクリップボードを持つ 適合 SVG ビューアーは、次をサポートする必要がある:
テキスト選択操作は、次のすべてが発生したときに開始する:
テキスト選択操作が進行している間(例えばユーザーが指定した
マウスボタンを押し続けている間)、他の
グラフィックス要素に関連付けられたすべてのイベントは無視される(すなわちテキスト選択操作は
モーダルである)。SVG ユーザーエージェントは、
::selection 擬似クラス用のスタイルを適用して、
選択されている文字を動的に示さなければならない。
テキスト選択中に
ポインターが移動すると、テキスト選択操作の終端グリフは、
同じ ‘text’ 要素内で、
グリフセルが
ポインターに最も近いグリフとなる。‘text’ 要素内で、
‘text’
要素内の位置が
選択の開始と終了の間にあるすべての文字は、
キャンバス上の位置や、
選択終端点の上に存在する可能性のあるグラフィックス要素に関係なく、
強調表示しなければならない。
テキスト選択操作が終了すると(例えばユーザーが 指定したマウスボタンを離すと)、選択されたテキストは、 ポインティングデバイスのアクティベーションイベント(例えばマウスボタンを押す)など、 テキスト選択を取り消すイベントが発生するまで強調表示されたままになる。
テキスト選択操作中にどの文字を強調表示するかを決定する 詳細な規則は、 テキスト 選択の実装上の注記に記載される。
システムクリップボードを持つシステムでは、SVG ユーザーエージェントは 現在選択されているテキストを システムクリップボードへコピーするためのユーザーインターフェイスを提供する必要がある。 SVG ユーザーエージェントが、選択されたテキスト文字列を プレーンテキスト用の適切なシステムクリップボード形式で配置するだけでも十分だが、 指定されたテキスト文字列に関連付けられた さまざまなフォントプロパティを保持するリッチテキスト形式も 配置することが望ましい。
双方向テキストでは、ユーザーエージェントは 論理順でのテキスト選択をサポートしなければならず、 文字の双方向並べ替えによりグリフの強調表示が不連続になる。 ユーザーエージェントは、視覚的レンダリング順 (すなわち双方向 テキストレイアウトアルゴリズムの適用後)で双方向テキストを選択する代替機能を提供してもよい。その結果、 選択された文字データは論理的に不連続になる場合がある。この 場合、ユーザーが双方向テキストを クリップボードへコピーするよう要求した場合、ユーザーエージェントは、 視覚的に選択された文字だけを クリップボードへコピーするよう適切に調整する必要がある。
SVG 著者および SVG ジェネレーターは、 Web ブラウザーなどの SVG 表示アプリケーション内で 正しい順序のテキスト選択が行いやすいよう、 テキスト文字列を並べるべきである。言い換えると、テキストの DOM 順序は、 テキストの自然な読み順と一致すべきである。
次の実装上の注記は、 テキスト選択操作中にどの文字が選択されるかを 決定するアルゴリズムについて説明する。
テキスト選択操作が行われると(例えばユーザーが マウスをクリックしてドラッグし、選択範囲を指定している間)、ユーザー エージェントは選択開始位置と 選択終了位置を決定し、それぞれ 2 つの文字間にあるテキスト文字列内の位置を表す。 選択開始位置および選択終了 位置を決定した後、ユーザーエージェントは適切な文字を選択し、 結果として得られるテキスト選択は次のいずれかからなる:
ポインティングデバイスを持つシステムでは、選択 開始位置を決定するため、SVG ユーザーエージェントは、 選択操作を開始するイベント (例えばマウスダウンイベント)時の現在のポインター位置に基づいて、 レンダリングされたグリフに対応する文字間のどの境界が 最適な対象(例えば最も近いもの)かを決定する。その後、ユーザーエージェントは、 選択操作の完了(例えばマウス ドラッグ、その後最終的なマウスアップ)を追跡する。選択操作の終了時に、 ユーザーエージェントは、 選択終了位置について文字間のどの境界が 最適な対象(例えば最も近いもの)かを決定する。
双方向性による文字の並べ替えが行われていない場合、 選択範囲は 選択開始位置と選択終了 位置の間のすべての文字からなる。例えば、‘text’ 要素が 文字列 "abcdef" を含み、選択開始位置と 選択終了位置がそれぞれ 0 と 3 である場合("a" の左側を 位置 0 と仮定)、 選択範囲は "abc" となる。
ユーザーエージェントが 双方向テキストの選択を実装し、選択の開始(または終了)が 論理順で連続していない文字間にある場合、 選択範囲の一部と見なせる 文字の組み合わせが複数存在する場合がある。 選択候補の組み合わせから選ぶアルゴリズムは、 テキスト文字列の視覚的レンダリング順に最も近い 選択候補を選ばなければならない。
複数の文字が分離不能な形で 1 つ以上のグリフの集合へ対応する場合、ユーザーエージェントは グリフ集合の途中から選択を開始することを禁止するか、 グリフ集合が占める領域の一部を グリフに対応する文字へ割り当てることを試みてもよい。
マウスなどのポインティングデバイスをサポートするシステムでは、 指定されたテキストにイベントハンドラーや リンクが関連付けられ、イベント処理の 優先順位規則(ポインターイベントを参照)によりテキスト選択が妨げられる場合でも、 ユーザーエージェントはテキストを選択する機構を提供する必要がある。 実装方法の一例: マウスなどのポインティング デバイスをサポートするプラットフォームでは、ユーザーエージェントは、 文字セルの周囲に小さな 追加領域を設け、そこではテキスト 選択操作を開始するが、イベントハンドラーや リンクは開始しないようにしてもよい。
| SVG 2 要件: | ‘text’ 要素をアウトラインパスデータへ変換する DOM メソッドを持つ。 |
|---|---|
| 決議: | ‘text’ 要素をアウトラインパスデータへ変換する DOM メソッドを追加し、その機能を FXTF へ移す可能性もある。 |
| 目的: | テキストをパスとして操作できるようにするため。 |
| 担当者: | Cameron (ACTION-3076) |
| 状態: | 将来の要望リスト |
SVGTextContentElement インターフェイスは、子テキストコンテンツのレンダリングを サポートする要素によって実装される。
このインターフェイス上のメソッドで文字の インデックスまたは文字数を参照するものでは、それぞれ UTF-16 コード単位のインデックスまたは UTF-16 コード単位の数として解釈される。これは DOM Level 2 Core と整合させるためであり、そこでは CharacterData インターフェイス上のメソッドが 文字 データ内のインデックスおよび数として UTF-16 コード単位を使用する。したがって例えば、‘text’ 要素のテキストコンテンツが U+10000 のような単一の非 BMP 文字である場合、 その要素上で getNumberOfChars を呼び出すと 2 が返される。これは、その 1 文字を表すために 2 つの UTF-16 コード単位 (サロゲートペア)が使用されるためである。
[Exposed=Window] interface SVGTextContentElement : SVGGraphicsElement { // lengthAdjust の型 const unsigned short LENGTHADJUST_UNKNOWN = 0; const unsigned short LENGTHADJUST_SPACING = 1; const unsigned short LENGTHADJUST_SPACINGANDGLYPHS = 2; [SameObject] readonly attribute SVGAnimatedLength textLength; [SameObject] readonly attribute SVGAnimatedEnumeration lengthAdjust; long getNumberOfChars(); float getComputedTextLength(); float getSubStringLength(unsigned long charnum, unsigned long nchars); SVGPoint getStartPositionOfChar(unsigned long charnum); SVGPoint getEndPositionOfChar(unsigned long charnum); SVGRect getExtentOfChar(unsigned long charnum); float getRotationOfChar(unsigned long charnum); long getCharNumAtPosition(optional DOMPointInit point = {}); undefined selectSubString(unsigned long charnum, unsigned long nchars); };
SVGTextContentElement 上で定義される数値の長さ調整型定数は、 ‘lengthAdjust’ 属性が 取り得るキーワード値を表すために使用される。その意味は次のとおり:
| 定数 | 意味 |
|---|---|
| LENGTHADJUST_SPACING | spacing キーワード。 |
| LENGTHADJUST_SPACINGANDGLYPHS | spacingAndGlyphs キーワード。 |
| LENGTHADJUST_UNKNOWN | その他の値。 |
textLength IDL 属性は、 ‘textLength’ コンテンツ 属性を反映する。
‘textLength’ コンテンツ 属性の初期値は、 要素についてユーザーエージェントが計算した長さと等しいと定義される。 言い換えると、コンテンツ属性が存在しない場合、 IDL プロパティは、 同じ要素上の getComputedTextLength の戻り値に等しい基本長で、ユーザー単位の長さとして初期化される。
lengthAdjust IDL 属性は、 ‘lengthAdjust’ コンテンツ 属性を反映する。‘lengthAdjust’ の 数値型値は、 上記の数値長さ調整型 定数表で説明したとおりである。
getNumberOfChars メソッドは、現在の要素内でレンダリング可能な アドレス可能な 文字の総数を、それらが実際にレンダリングされるかどうかに関係なく返す。 getNumberOfChars() が呼び出されると、次の手順を実行する:
getComputedTextLength メソッドは、要素内のテキストの「長さ」を計算するために使用される。 getComputedTextLength() が呼び出されると、次の手順を実行する:
getSubStringLength メソッドは、要素内のテキストの部分文字列について、 整形後のテキストの advance 距離を計算するために使用される。 getSubStringLength(charnum, nchars) が呼び出されると、次の手順を実行する:
これは例えば、 部分文字列に一部だけ含まれる合字がある場合、 タイポグラフィ文字の advance およびその後の letter-spacing または word-spacing の空間は、最初の 文字のテキスト長へ割り当てられることを意味する。
以前のバージョンの SVG では、このメソッドと getComputedTextLength が、 子要素上の ‘dx’ または ‘dy’ による インライン方向の配置調整も含め、 返される値がユーザーエージェントの ‘textLength’ の計算と等価になることを 要求していた。しかし、これは仕様が不十分で、 実装も不十分で、 利点も疑わしかったため、 実装に合わせて簡略化された。
テキスト長メソッドへの変更は、 2015 年 8 月のパリ対面会議で 決議された。
要素 element 内のインデックス index の 文字について対応する タイポグラフィ 文字を見つけるには、次の手順を実行する:
getStartPositionOfChar メソッドは、テキスト レイアウト後の タイポグラフィ 文字の位置を取得するために使用される。 getStartPositionOfChar(charnum) が 呼び出されると、次の手順を実行する:
getEndPositionOfChar メソッドは、テキスト レイアウト後の タイポグラフィ文字の 後端位置を取得するために使用される。 getEndPositionOfChar(charnum) が 呼び出されると、次の手順を実行する:
getExtentOfChar メソッドは、指定された タイポグラフィ文字に対応する グリフセルの密接な境界ボックスを計算するために使用される。 getExtentOfChar(charnum) が呼び出されると、次の手順を実行する:
getRotationOfChar メソッドは、タイポグラフィ 文字の回転を取得するために使用される。 getRotationOfChar(charnum) が呼び出されると、次の手順を実行する:
getCharNumAtPosition メソッドは、座標系内の指定された位置に テキストグリフをレンダリングさせた文字を見つけるために使用される。 文字とグリフの関係は 1 対 1 ではないため、 関連する タイポグラフィ 文字の最初の文字だけが返される。 getCharNumAtPosition(point) が呼び出されると、次の手順を実行する:
selectSubString メソッドは要素内のテキストを選択するために使用される。 selectSubString(charnum, nchars) が呼び出されると、 次の手順を実行する:
この要素内のテキストの部分文字列を、文字 インデックス charnum から開始して前方へ nchars 文字分選択する。このメソッドが呼び出されると、次の手順に従わなければならない:
引数の検証と例外のスローを無視すれば、これは 次を実行することと等価である:
var selection = document.getSelection(); selection.removeAllRanges(); var range = new Range(); range.setStart(textContentElement, charnum); range.setEnd(textContentElement, charnum + nchars); selection.addRange(range);
このメソッドは Selection API の機能と重複するため非推奨である。
SVGTextPositioningElement インターフェイスは、個々のテキストグリフを配置する属性を サポートする要素によって実装される。これは SVGTextElement および SVGTSpanElement に継承される。
[Exposed=Window] interface SVGTextPositioningElement : SVGTextContentElement { [SameObject] readonly attribute SVGAnimatedLengthList x; [SameObject] readonly attribute SVGAnimatedLengthList y; [SameObject] readonly attribute SVGAnimatedLengthList dx; [SameObject] readonly attribute SVGAnimatedLengthList dy; [SameObject] readonly attribute SVGAnimatedNumberList rotate; };
x, y, dx, dy および rotate IDL 属性は、 それぞれ ‘x’, ‘y’, ‘dx’, ‘dy’ および ‘rotate’ コンテンツ属性を反映する。
SVGTextElement オブジェクトは、 DOM 内の ‘text’ 要素を 表す。
[Exposed=Window] interface SVGTextElement : SVGTextPositioningElement { };
SVGTSpanElement オブジェクトは、 DOM 内の ‘tspan’ 要素を 表す。
[Exposed=Window] interface SVGTSpanElement : SVGTextPositioningElement { };
SVGTextPathElement オブジェクトは、 DOM 内の ‘textPath’ 要素を表す。
[Exposed=Window] interface SVGTextPathElement : SVGTextContentElement { // textPath の Method 型 const unsigned short TEXTPATH_METHODTYPE_UNKNOWN = 0; const unsigned short TEXTPATH_METHODTYPE_ALIGN = 1; const unsigned short TEXTPATH_METHODTYPE_STRETCH = 2; // textPath の Spacing 型 const unsigned short TEXTPATH_SPACINGTYPE_UNKNOWN = 0; const unsigned short TEXTPATH_SPACINGTYPE_AUTO = 1; const unsigned short TEXTPATH_SPACINGTYPE_EXACT = 2; [SameObject] readonly attribute SVGAnimatedLength startOffset; [SameObject] readonly attribute SVGAnimatedEnumeration method; [SameObject] readonly attribute SVGAnimatedEnumeration spacing; }; SVGTextPathElement includes SVGURIReference;
SVGTextPathElement 上で定義される数値 method 型定数は、 ‘method’ 属性が取り得るキーワード値を表すために使用される。その意味は次のとおり:
| 定数 | 意味 |
|---|---|
| TEXTPATH_METHODTYPE_ALIGN | align キーワード。 |
| TEXTPATH_METHODTYPE_STRETCH | stretch キーワード。 |
| TEXTPATH_METHODTYPE_UNKNOWN | その他の値。 |
SVGTextPathElement 上で定義される数値 spacing 型定数は、 ‘spacing’ 属性が取り得るキーワード値を表すために使用される。その意味は次のとおり:
| 定数 | 意味 |
|---|---|
| TEXTPATH_SPACINGTYPE_AUTO | auto キーワード。 |
| TEXTPATH_SPACINGTYPE_EXACT | exact キーワード。 |
| TEXTPATH_SPACINGTYPE_UNKNOWN | その他の値。 |
startOffset IDL 属性は、 ‘startOffset’ コンテンツ 属性を反映する。
method IDL 属性は、 ‘method’ コンテンツ属性を 反映する。 ‘method’ の 数値型値は、 上記の数値 method 型定数表で説明したとおりである。
spacing IDL 属性は、 ‘spacing’ コンテンツ属性を 反映する。 ‘spacing’ の 数値型値は、 上記の数値 spacing 型定数表で説明したとおりである。
図形を定義するグラフィックス要素 – ‘path’ 要素、基本図形、 および テキストコンテンツ要素 – は、 オブジェクトの内部をペイントする塗りと、 オブジェクトの輪郭に沿ってペイントするストロークによってレンダリングされる。塗りとストロークはどちらも ペイント操作である。SVG 2 は、 グラフィックス要素の塗りとストロークをペイントできる複数の異なるペイントをサポートする:
要素の塗りとストロークに使用するペイントは、 fill および stroke プロパティを使用して指定する。次の節では、 これらのプロパティに使用できるさまざまな値について説明する。
fill-opacity や stroke-width などのその他のプロパティも、 塗りとストロークのペイントを キャンバスへ適用する方法に影響する。以下の 塗りプロパティおよび ストロークプロパティ の節では、これらのプロパティについて説明する。
一部のグラフィックス要素 – ‘path’ 要素および 基本図形 – では、パスの頂点または それらが記述するパスに沿ったその他の位置へマーカー 記号を 描画することもできる。以下の マーカーの節では、 マーカーを定義して使用する方法について説明する。
SVG 2 では図形上のマーカーが追加された。 東京 F2Fで決議された。
| SVG 2 要件: | 現在の塗りペイント、ストロークペイントなどを参照する新しいペイント値を追加する。 |
|---|---|
| 決議: | SVG 2 に currentFillPaint、currentStrokePaint などの新しいペイント値を追加する |
| 目的: | 特に、マーカーの色をストロークの色と簡単に一致させる方法を提供するため。 |
| 担当者: | Chris (ACTION-3094) |
| SVG 2 追加事項: | fill と stroke で複数のペイントを許可する。 |
|---|---|
| 決議: | SVG 2 では fill および stroke プロパティで複数のペイントを許可する。 |
| 目的: | クロスハッチングの作成、単色の塗りの上に半透明のパターンを配置する場合などに有用。 |
| 担当者: | Tav (ACTION-3500) |
| 延期: | これは SVG 2 では削除されたが、後で CSS Fill and Stroke Level 3 と同期して追加される。 |
以下で定義される fill および stroke プロパティは、 図形とテキストの内部および 周囲のストロークをレンダリングするために使用される ペイントを指定するために使用される。ペイント指定は、 キャンバス上に色値を置く方法を記述し、1 つ以上のペイントレイヤーから構成される。 これらのペイントレイヤー内では 4 種類のペイントがサポートされる: 単色、 グラデーション、および パターン。
<paint> 値は次のように定義される:
<paint> = none | <color> | <url> [none | <color>]? | context-fill | context-stroke
取り得る値は次のとおり:
<paint> では、ペイントサーバー参照の後に任意で <color> またはキーワード none を 続けることができる。 この任意の値が指定された場合、<color> 値または none の値は、レイヤー内のペイント サーバー参照が無効な場合(存在しない要素や 有効なペイントサーバーでない要素を指しているため)に使用するフォールバック値となる。
これは CSS background 構文とはわずかに異なることに注意すること。CSS では、 background 値の最後のレイヤーに指定された 背景画像と色の両方がレンダリングされる。
<paint> 内のペイントサーバー参照が無効で、 フォールバック値が指定されていない場合、そのレイヤーにはペイントをレンダリングしない。
これは、ペイントサーバー参照が無効でフォールバック 色が指定されていない場合に文書がエラーとなる SVG 1.1 の動作から変更されている。
<rect width="100" height="100" fill="url(#MyHatch) powderblue">
左の矩形は MyHatch が定義されている場合に期待される塗りを示す。 右の矩形は MyHatch が存在しない場合に期待される塗りを示す。
任意の <color> 値について、 CSS Color Module Level 3 で定義されるすべての色構文をサポートしなければならない。これには rgb(), rgba(), hsl(), hsla(), 拡張色キーワードおよび currentColor 値が含まれる。
context-fill および context-stroke 値は、ペイントされる要素の コンテキスト要素の fill または stroke プロパティについて生成されたペイントレイヤーへの参照である。 要素のコンテキスト要素は次のように定義される:
コンテキスト要素が存在せず、これらのキーワードが使用された場合、 ペイントは適用されない。
コンテキストペイントレイヤーにペイントサーバー参照が含まれる場合、 ペイントサーバー要素およびコンテンツを拡大縮小するために使用される 座標空間と境界ボックスは、 コンテキスト要素のものとなる。 言い換えると、これらのキーワードで参照されるグラデーションおよびパターンは、 メイン図形からマーカーへ、 または use 要素のシャドウツリー内のある要素から 別の要素へ連続しているべきである。
参照される fill または stroke の値が context-fill または context-stroke 値の場合、そのコンテキスト参照は再帰的である。
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<style>
path {
fill: none;
stroke-width: 4px;
marker: url(#diamond);
}
</style>
<path d="M 10,50 v -20 h 40 v -20" stroke="red"/>
<path d="M 30,70 v -20 h 40 v -20" stroke="green"/>
<path d="M 50,90 v -20 h 40 v -20" stroke="blue"/>
<marker id="diamond" markerWidth="12" markerHeight="12" refX="6" refY="6"
markerUnits="userSpaceOnUse">
<circle cx="6" cy="6" r="3"
fill="white" stroke="context-stroke" stroke-width="2"/>
</marker>
</svg>
color の定義については、 CSS Color Module Level 3 仕様を参照すること。 [css-color-3]
color プロパティは、 fill, stroke, stop-color, flood-color および lighting-color プロパティに対して、間接的に使用できる値 currentColor を提供するために使用される。 このプロパティは SVG 要素にその他の効果を持たない。
次の例は、HTML 文書から継承された color プロパティの値を使用して、 インライン SVG フラグメント内の SVG テキストの色を 設定する方法を示す。
<!DOCTYPE html>
<style>
body { color: #468; font: 16px sans-serif }
svg { border: 1px solid #888; background-color: #eee }
</style>
<p>下の図を参照してください:</p>
<svg width="200" height="100">
<g fill="currentColor">
<text x="70" y="55" text-anchor="end">開始</text>
<text x="130" y="55">停止</text>
<path d="M 85,45 h 25 v -5 l 10,10 -10,10 v -5 h -25 z"/>
</g>
</svg>
下の図を参照してください:
SVG フラグメント内のテキストと矢印は、 継承された color プロパティと同じ色で塗られる。
| 名前: | fill |
|---|---|
| 値: | <paint> |
| 初期値: | black |
| 適用対象: | 図形および テキスト コンテンツ要素 |
| 継承: | はい |
| パーセント値: | 該当なし |
| メディア: | 視覚 |
| 計算値: | 指定値のまま。ただし <color> 値は 計算され、 <url> 値は絶対化される |
| アニメーション型: | 計算値による |
fill プロパティは、指定されたグラフィックス 要素の内部をペイントする。ペイントされる領域は、図形の輪郭 の内側にあるすべての領域で構成される。図形の内部を決定するには、すべてのサブパスを 考慮し、現在の fill-rule プロパティの値に関連付けられた規則に従って 内部を決定する。 図形の幅 0 の幾何学的輪郭も、ペイントされる領域に 含まれる。
塗り操作は、サブパスの最後の点を最初の点へ接続するための 追加の "closepath" コマンドがパスへ追加されたかのように塗り操作を行うことで、 開いたサブパスを塗る。 したがって、塗り操作は、 ‘path’ 要素内の 開いたサブパス (すなわち closepath コマンドを持たないサブパス)と ‘polyline’ 要素の両方に適用される。
| 名前: | fill-rule |
|---|---|
| 値: | nonzero | evenodd |
| 初期値: | nonzero |
| 適用対象: | 図形および テキスト コンテンツ要素 |
| 継承: | はい |
| パーセント値: | 該当なし |
| メディア: | 視覚 |
| 計算値: | 指定値のまま |
| アニメーション型: | 離散 |
fill-rule プロパティは、 キャンバスのどの部分が図形の内部に含まれるかを決定するために使用する アルゴリズム(または 巻き数規則)を示す。 単純で交差しないパスの場合、どの領域が「内部」にあるかは直感的に明らかである。 しかし、自身と交差するパスや、 あるサブパスが別のサブパスを囲むような、より複雑なパスでは、 「内部」の解釈はそれほど明白ではない。
fill-rule プロパティは、 図形の内部を決定する方法について 2 つの選択肢を提供する:
この規則は、キャンバス上のある点から任意の方向へ 無限遠まで光線を引き、その光線を 図形の区間が横切る箇所を調べることで、その点の「内部性」を 決定する。カウントを 0 から始め、 パス区間が光線を左から右へ横切るたびに 1 を加え、 右から左へ横切るたびに 1 を引く。交差を数えた後、 結果が 0 ならその点はパスの外部である。 それ以外の場合は内部である。次の 図は nonzero 規則を示す:
自己交差と囲まれたサブパスを持つパスに対する nonzero 塗り規則の効果。
この規則は、キャンバス上のある点から任意の方向へ 無限遠まで光線を引き、その光線が 指定された図形のパス区間を横切る回数を数えることで、 その点の「内部性」を決定する。この数が奇数なら、 点は内部にあり、偶数なら外部にある。次の 図は evenodd 規則を示す:
自己交差と囲まれたサブパスを持つパスに対する evenodd 塗り規則の効果。
上記の説明では、パス区間が 光線と一致する場合や接する場合にどうするかは指定していない。 どの光線でもよいため、 そのような問題のある交差を持たない別の光線を選べばよい。
| 名前: | fill-opacity |
|---|---|
| 値: | <'opacity'> |
| 初期値: | 1 |
| 適用対象: | 図形および テキスト コンテンツ要素 |
| 継承: | はい |
| パーセント値: | 該当なし |
| メディア: | 視覚 |
| 計算値: | 指定値を数値へ変換し、範囲 [0,1] にクランプした値 |
| アニメーション型: | 計算値による |
fill-opacity は、 現在のオブジェクトの塗りをペイントするために使用される ペイント操作の不透明度を指定する。( 図形とテキストのペイントを参照)。
グループ不透明度を指定する opacity プロパティも参照すること。
| SVG 2 要件: | 拡大縮小されないストロークをサポートする。 |
|---|---|
| 決議: | SVG 2 は拡大縮小されない
ストロークを含む。 SVG 2 は ‘vector-effect’ プロパティを持つ。 |
| 目的: | 例えば地図で一般的な、ページをズームしても幅が変化しないストロークをサポートするため。 |
| 担当者: | Chris または Erik(アクションなし) |
| 注記: | これは、より一般的な拡大縮小されない機能の一部になり得ることに注意すること。 |
この節では、ペイント、 太さ、破線の使用、パス区間の結合とキャップなど、 ストロークのさまざまな側面を著者が制御できる複数のプロパティを定義する。
すべての場合において、破線パターンに関係するものなど、 方向性の影響を受けるすべてのストロークプロパティは、 ストローク操作がグラフィックス要素の開始点と同じ点から 開始するようにレンダリングしなければならない。特に、‘path’ 要素では、パスの開始点は最初の "moveto" コマンドの最初の点である。
計算がグラフィックス要素の輪郭に沿った進行に依存する 破線パターンなどのストロークプロパティでは、 距離の計算に SVG ユーザーエージェントの 標準 パスに沿った距離 アルゴリズムを使用する必要がある。
グラデーションやパターンなどの複雑なペイントサーバーを使用して ストロークを行う場合、ストローク操作は、 現在のグラフィックス要素のジオメトリと関連するストローク プロパティによって定義される幾何学的図形を、等価な ‘path’ 要素へ変換し、 その後指定されたペイントサーバーで塗った場合に得られる結果と同一でなければならない。
| 名前: | stroke |
|---|---|
| 値: | <paint> |
| 初期値: | none |
| 適用対象: | 図形および テキスト コンテンツ要素 |
| 継承: | はい |
| パーセント値: | 該当なし |
| メディア: | 視覚 |
| 計算値: | 指定値のまま。ただし <color> 値は 計算され、 <url> 値は絶対化される |
| アニメーション型: | 計算値による |
stroke プロパティは、 指定されたグラフィックス要素の 輪郭に沿ってペイントする。
‘path’ 要素をストロークするとき、 moveto のみからなり、 後続する線描画コマンドを持たないサブパスはストロークされないことに注意すること。 'M 10,10 L 10,10' や 'M 30,30 Z' のような、 その他の種類の長さ 0 のサブパスも、stroke-linecap プロパティの値が butt の場合にはストロークされない。 パスのストロークを計算する詳細については、以下の ストローク図形の定義を参照すること。
| SVG 2 要件: | ストローク位置を指定する方法を含める。 |
|---|---|
| 決議: | SVG 2 は ストローク位置を指定する方法を含むものとする。 |
| 目的: | ストロークをパスの内側または外側に置けるようにするため。 |
| 担当者: | Cameron (ACTION-3162) |
| 注記: | 提案 ページを参照。 |
| 名前: | stroke-opacity |
|---|---|
| 値: | <'opacity'> |
| 初期値: | 1 |
| 適用対象: | 図形および テキスト コンテンツ要素 |
| 継承: | はい |
| パーセント値: | 該当なし |
| メディア: | 視覚 |
| 計算値: | 指定値を数値へ変換し、範囲 [0,1] にクランプした値 |
| アニメーション型: | 計算値による |
stroke-opacity プロパティは、 現在のオブジェクトをストロークするために使用される ペイント操作の不透明度を指定する。( 図形とテキストのペイントを参照。) fill-opacity と同様である。
グループ不透明度を指定する opacity プロパティも参照すること。
| 名前: | stroke-width |
|---|---|
| 値: | <length-percentage> | <number> |
| 初期値: | 1px |
| 適用対象: | 図形および テキスト コンテンツ要素 |
| 継承: | はい |
| パーセント値: | 現在の SVG ビューポートの正規化された対角線を参照する(単位を参照) |
| メディア: | 視覚 |
| 計算値: | 絶対長またはパーセント値。数値は最初に絶対長へ変換される |
| アニメーション型: | 計算値による |
このプロパティは現在のオブジェクト上のストローク幅を指定する。 値 0 の場合、ストロークはペイントされない。負の値は 無効である。<number> 値は ユーザー単位の値を表す。
| 名前: | stroke-linecap |
|---|---|
| 値: | butt | round | square |
| 初期値: | butt |
| 適用対象: | 図形および テキスト コンテンツ要素 |
| 継承: | はい |
| パーセント値: | 該当なし |
| メディア: | 視覚 |
| 計算値: | 指定値のまま |
| アニメーション型: | 離散 |
stroke-linecap は、 開いたサブパスをストロークするとき、その端で 使用する図形と、 開いているか閉じているかにかかわらず、長さ 0 の サブパスに描画する図形を指定する。 取り得る値は次のとおり:
この値は、各サブパスの各端で、 ストロークを表す図形が、 ストローク幅と等しい直径を持つ半円によって延長されることを示す。サブパスが 開いているか閉じているかにかかわらず、長さ 0 の場合、 結果として、そのサブパスのストロークは サブパスの点を中心とする完全な円だけで構成される。
この値は、各サブパスの端で、 ストロークを表す図形が、幅がストローク幅と同じで、 長さがストローク幅の半分である矩形によって延長されることを示す。 サブパスが 開いているか閉じているかにかかわらず、長さ 0 の場合、結果としてそのサブパスのストロークは、 辺の長さがストローク幅と等しく、サブパスの点を中心とし、 その 2 辺がそのサブパスの点における実効接線と 平行になるよう向けられた正方形だけで構成される。 長さ 0 のサブパスにおける接線の決定方法の詳細については、 ‘path’ 要素の実装上の注記を参照すること。
3 種類のラインキャップ。
ラインキャップが持つ図形のより正確な説明については、以下の キャップ図形の定義を参照すること。
| 名前: | stroke-linejoin |
|---|---|
| 値: | miter | round | bevel |
| 初期値: | miter |
| 適用対象: | 図形および テキスト コンテンツ要素 |
| 継承: | はい |
| パーセント値: | 該当なし |
| メディア: | 視覚 |
| 計算値: | 指定値のまま |
| アニメーション型: | 離散 |
stroke-linejoin は、 パスまたは基本図形をストロークするときに、その角で 使用する図形を指定する。詳細については path の実装上の注記を参照すること。
3 種類の線の結合。
| 名前: | stroke-miterlimit |
|---|---|
| 値: | <number> |
| 初期値: | 4 |
| 適用対象: | 図形および テキスト コンテンツ要素 |
| 継承: | はい |
| パーセント値: | 該当なし |
| メディア: | 視覚 |
| 計算値: | 指定値のまま |
| アニメーション型: | 計算値による |
2 つの線分が鋭い角度で交わり、 stroke-linejoin に miter の値が指定されている場合、 結合がパスをストロークする線の太さを 大きく越えて延びる可能性がある。 stroke-miterlimit は、 線の結合が延びる範囲に上限を課す。
SVG 仕様の以前のバージョンでは、 0 から 1 の間の値もエラーであるとされていたが、 ユーザーエージェントの CSS パーサーでは十分に実装されていなかった。 実際には、どの miter 結合も 0 から 1 の間の miter limit を超える。
miter 値について、ユーザー座標系内の 区間間の角度 θ が与えられた場合、 miter の長さは次のように計算される:
miter length = stroke-width / sin(theta / 2)
歴史的に、miter の長さは、交差するパス区間の 内側のストローク辺から miter の先端までの距離として定義される。 実際には、これは直線のパス区間についてのみ従われる。 上記の角度に基づく miter 長の定義は、 結合点におけるパス区間の接線だけに依存するため、 パス区間の曲率に依存せず一貫した結果を与える。
左: miter 長の歴史的な定義。 右: パス区間が結合する点において 同じ接線を持つ 2 つの異なるパス。 miter 結合の動作(bevel へのフォールバックまたはクリッピング位置)は 両方のパスで同じである。内側のストローク辺が 交差する位置には依存しない。
miter の長さをストローク幅で割った値が stroke-miterlimit を超える場合、 次の値について:
stroke-miterlimit を超えた場合の線結合への効果。 オリーブグリーンの破線は、 stroke-miterlimit の値が 3 の場合の miter limit の位置を示す。灰色の領域は、miter limit がない場合の結合の外観を示す。
線結合が持つ図形のより正確な説明については、以下の 線結合図形の定義を参照すること。
| 名前: | stroke-dasharray |
|---|---|
| 値: | none | <dasharray> |
| 初期値: | none |
| 適用対象: | 図形および テキスト コンテンツ要素 |
| 継承: | はい |
| パーセント値: | 現在の SVG ビューポートの正規化された対角線を参照する(単位を参照) |
| メディア: | 視覚 |
| 計算値: | 絶対長またはパーセント値のコンマ区切りリスト。数値は最初に絶対 長へ変換されるか、指定されたキーワード |
| アニメーション型: | 本文を参照 |
ここで:
<dasharray> = [ [ <length-percentage> | <number> ]+ ]#
stroke-dasharray プロパティは、 パスのストローク図形を形成するために使用される ダッシュと間隔のパターンを制御する。
使用する破線パターンを指定する。<dasharray> は、 コンマおよび/または空白で区切られた <number> または <length-percentage> 値のリストである。 <number> 値は ユーザー単位の値を表す。 各値は、ストロークをペイントするパスに沿った長さ(ダッシュ)と、 ペイントしない長さ(間隔)を指定する。 リストの最初の値と、それ以降の 1 つおきの値が ダッシュの長さを指定し、残りの各値がダッシュ間の間隔の長さを指定する。 リストの値の個数が奇数の場合、偶数個になるように 繰り返される。(したがって、 stroke-dasharray: 5,3,2 のレンダリング動作は stroke-dasharray: 5,3,2,5,3,2 と等価である。)
結果として得られる偶数長の破線パターンは、各サブパスに沿って繰り返される。 破線パターンは各サブパスの開始時にリセットされ、再び開始する。
リスト内のいずれかの値が負の場合、 <dasharray> 値は 無効である。リスト内のすべての値が 0 の場合、 ストロークは破線を使用せず実線としてレンダリングされる。
破線のストローク。破線パターンは 20,10。 赤い線は実際にストロークされるパスを示す。
‘path’ 要素上の ‘pathLength’ 属性は stroke-dasharray に影響する。各ダッシュと間隔の 長さは、‘pathLength’ で指定された 著者のパス長を基準に解釈される。
stroke-dasharray 値は 加算不可である。補間では、 stroke-dasharray 値は次のように 結合される:
path {
stroke-dasharray: 20 40 10;
}
path:hover {
transition-property: stroke-dasharray;
transition-duration: 0.5s;
stroke-dasharray: 40 20;
}
2 つの値リストを補間するため、まず両方のリストでダッシュパターンを繰り返す:
stroke-dasharray: 20 40 10 20 40 10;
stroke-dasharray: 40 20 40 20 40 20;
その後、各項目を計算値によって結合する。
| 名前: | stroke-dashoffset |
|---|---|
| 値: | <length-percentage> | <number> |
| 初期値: | 0 |
| 適用対象: | 図形および テキスト コンテンツ要素 |
| 継承: | はい |
| パーセント値: | 現在の SVG ビューポートの正規化された対角線を参照する(単位を参照) |
| メディア: | 視覚 |
| 計算値: | 絶対長またはパーセント値。数値は最初に絶対長へ変換される |
| アニメーション型: | 計算値による |
stroke-dashoffset プロパティは、 パスの開始点でストロークの破線を開始する、 繰り返し破線パターン内の距離を指定する。値が負の場合、 効果は次のダッシュオフセット d と同じである:
d = s - (abs(stroke-dashoffset) mod s)
ここで s はダッシュ配列の値の合計である。
0 ではないダッシュオフセットを持つ破線ストローク。破線 パターンは 20,10、ダッシュオフセットは 15。赤い線は実際にストロークされる パスを示す。
stroke-dasharray と同様に、stroke-dashoffset は、 ‘path’ 要素上の ‘pathLength’ 属性で指定された著者のパス長を基準に解釈される。
次の例は、実際のパス長と大きく異なる ‘pathLength’ を使用して、 ストロークの破線をより簡単に制御する方法を示す。
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="300" height="150">
<defs>
<path id="p" d="M -50,0 A 50,50 0 0 0 50,0 A 50,50 0 0 0 -50,0 z"
pathLength="80"/>
<g id="chip" stroke-width="10">
<circle cy="5" r="55" fill="#000" fill-opacity="0.15" stroke="none"/>
<use xlink:href="#p"/>
<use xlink:href="#p" fill="none" stroke="#eee" stroke-width="10"
stroke-dasharray="10 10" stroke-dashoffset="5"/>
<g fill="none" stroke-width="5" stroke-dasharray="0 20" stroke-linecap="round">
<use xlink:href="#p" stroke="#eee" stroke-dashoffset="10"/>
<use xlink:href="#p" stroke-dashoffset="0"/>
</g>
<circle r="40" fill="#000" fill-opacity="0.15"
stroke-width="2" stroke="white"/>
</g>
</defs>
<rect width="100%" height="100%" fill="#063"/>
<use xlink:href="#chip" x="140" y="75" fill="#00c" stroke="#00c"/>
<use xlink:href="#chip" x="160" y="85" fill="#000" stroke="#000"/>
<use xlink:href="#chip" x="170" y="65" fill="#c00" stroke="#c00"/>
</svg>
各チップの周囲にある 4 本の幅広い白いダッシュと 8 個の小さな円形 ダッシュは、著者が指定した ‘pathLength’ の '80' を基準に配置されるため、 目的の stroke-dasharray および stroke-dashoffset の値を簡単に計算できる。
パスに沿ってダッシュを配置する位置のより正確な説明については、以下の ダッシュ位置の定義を参照すること。
| SVG 2 要件: | ストロークの破線をより正確に指定する。 |
|---|---|
| 決議: | SVG 2 はストロークの破線を より正確に指定するものとする。 |
| 目的: | 基本図形およびパス区間上のダッシュ開始点を定義するため。 |
| 担当者: | Cameron(アクションなし) |
要素の ストローク図形とは、 stroke プロパティによって塗られる 図形である。 ‘text’ 要素は複数のチャンクとしてレンダリングできるため、各チャンクは独自の ストローク図形を持つ。次のアルゴリズムは、 上記のストロークプロパティを考慮した ‘path’、基本図形、または個々の ‘text’ チャンクの 理想的なストローク図形を説明する。ここで説明する理想的なストローク図形は 最良の場合の実装を定義するが、実装はパフォーマンス上の理由から この説明からある程度逸脱することが許される。
ストロークに対してペイントされる図形が プラットフォーム間で異なる場合の例。
<svg viewBox="0 0 10 10" xmlns="http://www.w3.org/2000/svg"> <path d="M 1,3 C 8,2 8,6 7,6" stroke-width="4" fill="none" stroke="skyblue"/> <path d="M 1,3 C 8,2 8,6 7,6" stroke-width="0.075" fill="none" stroke="black"/> </svg>
index および last を選ぶとき、 長さ 0 の区間を含めるかどうかは重要ではない。
‘path’ または 基本図形の 等価パスの指定されたサブパスについての ダッシュ位置とは、 サブパスのストロークを形成する各ダッシュの サブパスに沿った開始距離と終了距離を表す値の組の列である。 次のように決定される:
サブパスに沿った指定された position における開始および終了 キャップ 図形は、次のように決定される:
単一の長さ 0 でないサブパスを持つパスに使用される 3 つの異なる stroke-linecap 値。 白い線はパス自体で、太い灰色の領域はストロークである。 上段では、緑色の線がパス終点における接線への 垂線を示し、ピンク色の領域がキャップである。 下段は垂線とキャップの強調表示なしのストロークを示す。
サブパスの指定された区間についての 線結合図形は、 次のように決定される:
これは例えば 'M 100,100 h 100 h 100' では 2 つの直線区間の間に線結合図形が生成されないが、 'M 100,100 h 100 h -100' では生成されることを意味する。
ピンクで示された丸い線結合図形の構築。 白い線は 2 つの区間が 1 点で交わる元のパスであり、 灰色の領域はストロークである。
この章では、ペイントに関連する vector-effect について説明する。 vector-effect の観点については こちらを参照すること。
| SVG 2 要件: | マーカーを改善する。 |
|---|---|
| 決議: | SVG 2 でマーカーを改善する。 |
| 目的: | 著者が SVG マーカーで抱える一般的な問題を解決するため。 |
| 担当者: | Cameron (ACTION-3286) |
マーカーとは、任意の 図形要素に沿った 特定の位置へペイントされるグラフィカルオブジェクトである。
marker-start および marker-end プロパティは、 図形の最初と最後の頂点へ マーカーを配置するために使用でき、marker-mid プロパティは、 その他すべての頂点(最初と最後を除く)へマーカーを配置するために使用できる。 marker-start および marker-end は例えば、 パスへ矢印の先端を追加するために使用できる。これらのプロパティで配置されるマーカーは 頂点マーカーと呼ばれる。
SVG 2 では、頂点マーカーが利用できる唯一の種類のマーカーである。 その他の仕様で新しい種類のマーカーが追加される。
マーカーのグラフィックスは ‘marker’ 要素によって定義される。 marker-start, marker-end および marker-mid プロパティは、 総称して マーカー プロパティと呼ばれ、 ‘marker’ 要素を参照する。
マーカーはアニメーション可能であり、‘use’ 要素と同様に、 アニメーションの効果は文書内で現在使用されているすべてのマーカーに現れる。
指定された要素上のマーカーは、下から 上へ次の順序でペイントされる:
‘marker’ 要素は、 図形上へマーカーを描画するために 使用されるグラフィックスを定義する。
属性定義:
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| markerUnits | strokeWidth | userSpaceOnUse | strokeWidth | はい |
‘markerUnits’ 属性は、 属性 ‘markerWidth’, ‘markerHeight’ および ‘marker’ の内容の 座標系を定義する。値の意味は次のとおり:
‘markerUnits’ の値が strokeWidth の場合、 マーカーのサイズは、 ストロークの ユーザー座標 系内でストローク幅に影響する変換を適用した後の stroke-width を基準とする。これは例えば、 値が non-scaling-stroke の vector-effect 属性によって、 マーカーも拡大縮小されなくなることを意味する。
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| markerWidth, markerHeight | <length-percentage> | <number> | 3 | はい |
‘markerWidth’ および ‘markerHeight’ 属性は、 ‘viewBox’ および ‘preserveAspectRatio’ 属性に従ってマーカーを収める SVG ビューポートのサイズを表す。 いずれかの属性の値が 0 の場合、 マーカーには何もレンダリングされない。いずれかの属性の負の値は エラーである( エラー処理を参照)。
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| refX | <length-percentage> | <number> | left | center | right | 0 | はい |
| refY | <length-percentage> | <number> | top | center | bottom | 0 | はい |
SVG 2 で新しく追加された: 幾何学的キーワード(‘symbol’ での使用と一致)。
marker/symbol 上の refX/refY に top/center/bottom, left/center/right キーワードを 追加する。ロンドン F2Fで決議された。値は 'background-position' から着想を得ている。
‘refX’ および ‘refY’ 属性は、 マーカーの基準 点を定義する。この点は 図形上のマーカーの 位置へ正確に配置される。長さと数値は、 ‘viewBox’ および ‘preserveAspectRatio’ 属性を適用した後の、マーカー内容の座標系内にあるものとして 解釈しなければならない。パーセント 値は、‘refX’ では ‘viewBox’ の幅に対するパーセント値、 ‘refY’ では ‘viewBox’ の高さに対する パーセント値として解釈しなければならない。
キーワード値は次のパーセント値として評価しなければならない:
| キーワード | 等価なパーセント値 |
|---|---|
| left | 0% |
| center | 50% |
| right | 100% |
| top | 0% |
| bottom | 100% |
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| orient | auto | auto-start-reverse | <angle> | <number> | 0 | はい(加算不可) |
‘orient’ 属性は、図形上の位置へ配置されるときに マーカーをどのように回転するかを示す。 値の意味は次のとおり:
マーカーは、マーカーが配置される位置の パスに対して、その正の x 軸がある方向を向くように 配向される( マーカーのレンダリングを参照)。
marker-start によって配置された場合、 'auto' が指定されたときに使用される向きから 180° 異なる向きへマーカーを配向する。 その他すべてのマーカーでは、'auto-start-reverse' は 'auto' と同じ意味を持つ。
これにより、単一の矢印先端マーカーを定義して、 パスの始点と終点の両方で、すなわち両端から 外向きになるよう使用できる。
| 名前: | marker-start, marker-mid, marker-end |
|---|---|
| 値: | none | <marker-ref> |
| 初期値: | none |
| 適用対象: | 図形 |
| 継承: | はい |
| パーセント値: | 該当なし |
| メディア: | 視覚 |
| 計算値: | 指定値のまま。ただし <marker-ref> の一部である <url> 値は絶対化される |
| アニメーション型: | 離散 |
ここで:
<marker-ref> = <url>
marker-start および marker-end プロパティは、それぞれ 指定された 図形の最初と最後の頂点へ 描画するマーカーを指定するために使用される。marker-mid は、その他すべての頂点 (すなわち最初と最後を除くすべての頂点)へ描画するマーカーを指定するために使用される。 marker-start, marker-mid および marker-end に指定できる値は次のとおり:
すべての 図形について、 マーカー位置の計算に使用しなければならないパスは 等価パスである。
‘polyline’ および ‘path’ を除く すべての 図形要素では、 最後の頂点は最初の頂点と同じである。 この場合、marker-start と marker-end の値が どちらも none でない場合、 その最後の頂点に 2 つのマーカーがレンダリングされる。 ‘path’ 要素では、 各 閉じたサブパスについて、最後の頂点は 最初の頂点と同じである。marker-start は パスデータの最初の頂点にのみレンダリングしなければならない。 marker-end は パスデータの最後の頂点にのみレンダリングしなければならない。 marker-mid は、 パスデータの最初の頂点と最後の頂点を除く すべての頂点へレンダリングしなければならない。
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 30">
<defs>
<marker id="m1" viewBox="0 0 10 10" refX="5" refY="5"
markerWidth="8" markerHeight="8">
<circle cx="5" cy="5" r="5" fill="green"/>
</marker>
<marker id="m2" viewBox="0 0 10 10" refX="5" refY="5"
markerWidth="6.5" markerHeight="6.5">
<circle cx="5" cy="5" r="5" fill="skyblue" opacity="0.9"/>
</marker>
<marker id="m3" viewBox="0 0 10 10" refX="5" refY="5"
markerWidth="5" markerHeight="5">
<circle cx="5" cy="5" r="5" fill="maroon" opacity="0.85"/>
</marker>
</defs>
<path d="M10,10 h10 v10 z m20,0 h10 v10 z m20,0 h10 v10 z"
fill="none" stroke="black"
marker-start="url(#m1)"
marker-mid="url(#m2)"
marker-end="url(#m3)"
/>
</svg>
閉じたサブパスを含む パスデータでは、 各 閉じたサブパスの最初/最後の頂点に 2 つのマーカーが描画される。 最も左の 閉じたサブパスでは、 marker-mid が marker-start の上に描画される。 中央の 閉じたサブパスでは、2 つの marker-mid が互いの上に描画される。 最も右の 閉じたサブパスでは、marker-end が marker-mid の上に描画される。
marker-start および marker-end は、 各サブパスではなく、パス全体の最初と最後の頂点を参照することに注意すること。
次の例は、三角形のマーカー記号を 頂点マーカーとして使用し、2 つのパスの終点に 矢印の先端を形成する例を示す。
<svg xmlns="http://www.w3.org/2000/svg"
width="275" height="200" viewBox="0 0 275 200">
<defs>
<marker id="Triangle" viewBox="0 0 10 10" refX="1" refY="5"
markerUnits="strokeWidth" markerWidth="4" markerHeight="3"
orient="auto">
<path d="M 0 0 L 10 5 L 0 10 z" fill="context-stroke"/>
</marker>
</defs>
<g fill="none" stroke-width="10" marker-end="url(#Triangle)">
<path stroke="crimson" d="M 100,75 C 125,50 150,50 175,75"/>
<path stroke="olivedrab" d="M 175,125 C 150,150 125,150 100,125"/>
</g>
</svg>
三角形はパスの終点へ配置され、 正しい方向を向くよう自動的に配向される。 context-stroke を使用することで、 三角形の塗りが各 ‘path’ のストロークと一致することが保証される。
| 名前: | marker |
|---|---|
| 値: | none | <marker-ref> |
| 初期値: | 短縮プロパティでは定義されない |
| 適用対象: | 図形 |
| 継承: | はい |
| パーセント値: | 該当なし |
| メディア: | 視覚 |
| 計算値: | 個々のプロパティを参照 |
| アニメーション型: | 離散 |
marker プロパティは、 marker-start, marker-mid および marker-end プロパティの値を設定する。marker の値は、 対応する 3 つのロングハンドプロパティすべてに直接使用される。
‘orient’ を 'auto' と指定することでマーカーを自動的に配向する場合、 次の規則を使用する:
描画する各マーカーについて、マーカーが正しく 配置およびサイズ決定されるよう、一時的な新しいユーザー座標 系が次のように確立される:
ユーザーエージェントスタイルシートは、 ‘marker’ 要素の overflow プロパティを hidden に設定するため、 既定ではマーカーの SVG ビューポートの境界に矩形のクリッピング パスが作成されることに注意すること。
‘marker’ を参照する要素から マーカーの内容へプロパティは継承されない。ただし、その定義内の要素で fill または stroke に context-stroke 値を使用することで、 単一のマーカーを、 マーカーを参照する要素のスタイルと一致するよう設計できる。
マーカーとは対話できない。例えば click や mouseover などのイベントは、 レンダリングされたマーカー上でマウスがクリックまたは移動されても、 ‘marker’ またはその子へ ディスパッチされない。
マーカーは直接レンダリングされず、 レンダリングされるには マーカープロパティのいずれかによって 参照されなければならない。 ‘marker’ 要素の display 値は、 ユーザーエージェントスタイルシートによって常に none に設定しなければならず、 この宣言は他のどの CSS 規則またはプレゼンテーション属性よりも優先されなければならない。 ‘marker’ 要素は、 ‘marker’ 要素または その祖先の display プロパティが none に設定されている場合でも参照に利用できる。
マーカーのレンダリング効果は、参照される ‘marker’ 要素の内容が、マーカーの各インスタンスについて 別個の非公開 DOM ツリーへディープクローンされたかのようなものとなる。 クローンされた DOM ツリーは非公開であるため、SVG DOM には マーカーのクローンされたインスタンスは現れない。
参照される ‘marker’ 要素を 非公開 DOM ツリーへ概念的にディープクローンする際には、 参照される要素とその内容に対する CSS カスケード ([CSS2], 第 6 章) および プロパティ継承の結果として得られるプロパティ値もコピーされる。 CSS セレクターは、正式な文書構造の一部であるため、 元の(すなわち参照される)要素に適用できる。 概念的にクローンされた DOM ツリーの内容は正式な文書構造の一部ではないため、 CSS セレクターを適用できない。
説明のため、先ほど示したマーカーの例を再掲する:
<?xml version="1.0" standalone="no"?>
<svg width="4in" height="2in"
viewBox="0 0 4000 2000"
xmlns="http://www.w3.org/2000/svg">
<defs>
<marker id="Triangle"
viewBox="0 0 10 10" refX="0" refY="5"
markerUnits="strokeWidth"
markerWidth="4" markerHeight="3"
orient="auto">
<path d="M 0 0 L 10 5 L 0 10 z" />
</marker>
</defs>
<rect x="10" y="10" width="3980" height="1980"
fill="none" stroke="blue" stroke-width="10" />
<desc>パスの終点に矢印の先端を配置する。
</desc>
<path d="M 1000 750 L 2000 750 L 2500 1250"
fill="none" stroke="black" stroke-width="100"
marker-end="url(#Triangle)" />
</svg>
上記ファイルのレンダリング効果は、視覚的には 次のものと同一になる:
<?xml version="1.0" standalone="no"?>
<svg width="4in" height="2in"
viewBox="0 0 4000 2000"
xmlns="http://www.w3.org/2000/svg">
<desc>マーカーの例のファイルと同じ効果を生成するが、
マーカーを使用しない
ファイル。
</desc>
<rect x="10" y="10" width="3980" height="1980"
fill="none" stroke="blue" stroke-width="10" />
<!-- パスは以前と同様に描画するが、マーカープロパティを使用しない -->
<path d="M 1000 750 L 2000 750 L 2500 1250"
fill="none" stroke="black" stroke-width="100" />
<!-- 次のロジックは、パスの最後の頂点へ
マーカーを描画することをシミュレートする。 -->
<!-- まず、ユーザー座標系の原点を移動し、
原点がパスの終点と一致するようにする。 -->
<g transform="translate(2500,1250)" >
<!-- マーカーで orient="auto" が指定されており、パスの最後の区間が
45 度の方向へ進んでいるため、
座標系を 45 度回転する。 -->
<g transform="rotate(45)" >
<!-- 'markerUnits' 属性で示された座標系に一致するよう
座標系を拡大縮小する。この場合、
値は 'strokeWidth' である。したがって、座標系を
'stroke-width' プロパティの現在値である 100 倍に拡大縮小する。 -->
<g transform="scale(100)" >
<!-- マーカー内の (refX,refY) が頂点と一致するように、
座標系を
(-refX*viewBoxToMarkerUnitsScaleX, -refY*viewBoxToMarkerUnitsScaleY)
だけ平行移動する。この場合、preserveAspectRatio の既定値
('xMidYMid meet') を使用する。これは、viewBox が SVG ビューポート内に
完全に収まり('meet')、中央揃え('xMidYMid')されるような
一様な拡大縮小係数
(すなわち viewBoxToMarkerUnitsScaleX=viewBoxToMarkerUnitsScaleY)
を求めることを意味する。この場合、一様な拡大縮小係数は
markerHeight/viewBoxHeight=3/10=.3 である。したがって、
(-refX*.3,-refY*.3)=(0*.3,-5*.3)=(0,-1.5) だけ平行移動する。 -->
<g transform="translate(0,-1.5)" >
<!-- ユーザーエージェントスタイルシートが、マーカーの 'overflow'
プロパティの値は 'hidden' であると定めるため、暗黙の
クリッピングパスが存在する。これを実現するため、SVG ビューポートの
境界にクリッピングパスを作成する。この場合、
一様な拡大縮小係数、markerWidth/viewBoxWidth と
markerHeight/viewBoxHeight の異なる比率、および 'xMidYMid' 配置のため、
SVG ビューポートは viewBox の左右へ 0.5 単位ずつ広がることに注意する -->
<clipPath id="cp1" >
<rect x="-0.5" y="0" width="4" height="3" />
</clipPath>
<g clip-path="url(#cp1)" >
<!-- 座標系を viewBox 単位へ設定するため、一様な拡大縮小係数
markerHeight/viewBoxHeight=3/10=.3 で座標系を拡大縮小する。 -->
<g transform="scale(.3)" >
<!-- この 'g' 要素は、元の 'marker' 要素上の
プロパティのカスケードおよび継承の結果として得られるすべてのプロパティ値を保持する。
この例では、'marker' 要素またはその祖先に fill も stroke も
指定されていないため、初期値
"black" および "none" がそれぞれ使用される。 -->
<g fill="black" stroke="none" >
<!-- 'marker' 要素の内容を展開する。 -->
<path d="M 0 0 L 10 5 L 0 10 z" />
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>
| SVG 2 要件: | 図形上で塗り、ストローク、マーカーのペイント順序を制御できるようにする。 |
|---|---|
| 決議: | SVG 2 は ‘paint-order’ プロパティの提案を採用する。ただし、 名前は異なる可能性がある。 プロパティ名は現在決議済みであり、2013 年 11 月 15 日の議事録を参照。 |
| 目的: | 要素を複製せずに、ストロークを塗りの下へペイントしたいという一般的な要求に対応するため。 |
| 担当者: | Cameron (ACTION-3285) |
| 名前: | paint-order |
|---|---|
| 値: | normal | [ fill || stroke || markers ] |
| 初期値: | normal |
| 適用対象: | 図形および テキスト コンテンツ要素 |
| 継承: | はい |
| パーセント値: | 該当なし |
| メディア: | 視覚 |
| 計算値: | 指定値のまま |
| アニメーション型: | 離散 |
SVG 2 で新しく追加された。主に、‘text’ 要素を複製せずに、 テキストのストロークを塗りの下へペイントできるよう追加された。
paint-order プロパティは、 図形およびテキストのレンダリングに使用される 3 つのペイント操作、すなわち塗り、ストローク、および存在する場合のマーカーの順序を制御する。
このプロパティの値が normal の場合、 要素は標準のペイント操作順序でペイントされる。 最初に塗り、次にストローク、最後にマーカーをペイントする。
その他のキーワードのいずれかを使用する場合、 要素をペイントするためのペイント操作の順序は左から右へ指定されたとおりになる。 3 つのキーワードのいずれかが省略された場合、その操作は最後に、 paint-order: normal の場合にペイントされる順序でペイントされる。
これは例えば、 paint-order: stroke が paint-order: stroke fill markers と同じレンダリング動作を持つことを意味する。
次の例は、paint-order プロパティを使用して、 ストローク付きテキストをより美しくレンダリングする方法を示す。
<svg xmlns="http://www.w3.org/2000/svg"
width="600" height="150" viewBox="0 0 600 150">
<style>
text {
font: 80px bold sans-serif; stroke-linejoin: round;
text-anchor: middle; fill: peachpuff; stroke: crimson;
}
</style>
<text x="150" y="100" style="stroke-width: 6px;">華やかさ</text>
<text x="450" y="100" style="stroke-width: 12px; paint-order: stroke;">華やかさ</text>
</svg>
ストロークを塗りの下にペイントしたテキスト。
| 名前: | color-interpolation |
|---|---|
| 値: | auto | sRGB | linearRGB |
| 初期値: | sRGB |
| 適用対象: | コンテナー要素, グラフィックス要素, グラデーション要素, ‘use’ および ‘animate’ |
| 継承: | はい |
| パーセント値: | 該当なし |
| メディア: | 視覚 |
| 計算値: | 指定値のまま |
| アニメーション型: | 離散 |
SVG ユーザーエージェントは、SVG コンテンツを処理するさまざまな段階で 色の補間と合成を行う。color-interpolation プロパティは、次のグラフィックス操作で使用する色空間を制御する:
フィルター効果では、 color-interpolation-filters プロパティが使用する色空間を制御する。 [filter-effects-1]
color-interpolation プロパティは、 sRGB 色空間内で行われる色操作と、 (光エネルギーに対して線形な)線形化 RGB 色空間内で行われる色操作のいずれかを選択する。 適切な色空間を選択した後、成分ごとの線形補間を使用する。 color-interpolation の値の意味は次のとおり:
sRGB 色空間(すなわち 2.2 ガンマ曲線を持つ非線形空間)と線形化 RGB 色空間(すなわちガンマ曲線を持たない sRGB 三刺激値として表現された色値)の間の変換式は、 sRGB 仕様 [SRGB] に記載されている。 説明のため、次の式は sRGB から 線形化 RGB への変換を示す。ここで Csrgb は 3 つの sRGB 色成分のいずれか、Clinear は対応する 線形化 RGB 色成分であり、すべての色値は 0 から 1 の間である:
if C_srgb <= 0.04045 C_linear = C_srgb / 12.92 else if c_srgb > 0.04045 C_linear = ((C_srgb + 0.055) / 1.055) ^ 2.4
ユーザーエージェントが範囲外の色値をサポートする場合、 それらも上記の式を使用して変換される。
子要素を背景へブレンドする場合、 ブレンドの種類を決定するのは子要素上の color-interpolation プロパティの値であり、 親上の color-interpolation の値ではない。 ‘href’ 属性を使用して別の グラデーションを参照する グラデーションでは、 fill または stroke プロパティから直接参照される グラデーション要素の color-interpolation プロパティの値を使用する。 色をアニメーションする場合、色の補間は、 アニメーションされる要素上の color-interpolation プロパティの値に従って行われる。
| 名前: | shape-rendering |
|---|---|
| 値: | auto | optimizeSpeed | crispEdges | geometricPrecision |
| 初期値: | auto |
| 適用対象: | 図形 |
| 継承: | はい |
| パーセント値: | 該当なし |
| メディア: | 視覚 |
| 計算値: | 指定値のまま |
| アニメーション型: | 離散 |
shape-rendering プロパティは、 ‘path’ 要素や、 円や矩形などの 基本図形などの ベクターグラフィックス要素をレンダリングするとき、 どのようなトレードオフを行うべきかを実装へ示すヒントを提供する。 値の意味は次のとおり:
| 名前: | text-rendering |
|---|---|
| 値: | auto | optimizeSpeed | optimizeLegibility | geometricPrecision |
| 初期値: | auto |
| 適用対象: | ‘text’ |
| 継承: | はい |
| パーセント値: | 該当なし |
| メディア: | 視覚 |
| 計算値: | 指定値のまま |
| アニメーション型: | 離散 |
text-rendering プロパティは、 テキストをレンダリングするときに どのようなトレードオフを行うべきかを実装へ示すヒントを提供する。 値の意味は次のとおり:
| 名前: | image-rendering |
|---|---|
| 値: | auto | optimizeQuality | optimizeSpeed |
| 初期値: | auto |
| 適用対象: | 画像 |
| 継承: | はい |
| パーセント値: | 該当なし |
| メディア: | 視覚 |
| 計算値: | 指定値のまま |
| アニメーション型: | 離散 |
CSS Image Values and Replacement Content Module Level 4 は将来このプロパティを再定義する可能性がある。特に、 拡大時に滑らかにするか、ピクセル化された外観を維持するかを選択できるようにすべきである。
image-rendering プロパティは、 画像処理を行う際に 速度と品質のどのようなトレードオフを行うかを実装へ示すヒントを提供する。 値の意味は次のとおり:
すべての場合において、元データおよび/または対象 デバイスがインデックスカラーであっても、リサンプリングは truecolor(例えば 24 ビット)色空間で行わなければならない。高品質 SVG ビューアーは、 線形色空間を使用して画像リサンプリングを行うべきである。
will-change の定義については、 CSS Will Change Module Level 1 仕様を参照すること。
will-change プロパティは、コンテンツに加えられる変更の種類について ユーザーエージェントへヒントを提供し、 指定された要素に対してレンダリング最適化を行える可能性を 高めるために使用される。
will-change プロパティはすべての SVG グラフィックス要素に適用されるが、 SVG 要素はスクロールをサポートしないため、 scroll-position 値は それらに効果を持たない。
次の例は、will-change を使用して、 要素の transform プロパティが変更されることをユーザーエージェントへ事前に知らせ、 スクリプトによる transform の変更が滑らかに見えるよう、 ユーザーエージェントがその要素を独自の GPU レイヤーへ レンダリングする可能性を生じさせる方法を示す。
<svg xmlns="http://www.w3.org/2000/svg">
<style>
#background { fill: lemonchiffon; }
#star {
fill: cornflowerblue;
stroke: navy; stroke-width: 5px; stroke-linejoin: round;
paint-order: stroke fill;
will-change: transform;
}
text { font: 24px sans-serif; user-select: none; }
</style>
<g onmousemove="drag(evt.clientX, evt.clientY);"
onmouseup="dragging = false;">
<rect id="background" width="100%" height="100%"/>
<text x="10" y="30">星をドラッグしてください!</text>
<path id="star" transform="translate(200,150)"
d="M 0.00,-40.00 -11.76,-16.18 -38.04,-12.36 -19.02,6.18 -23.51,32.36
0.00,20.00 23.51,32.36 19.02,6.18 38.04,-12.36 11.76,-16.18 z"
onmousedown="dragging = true;"/>
</g>
<script>
var dragging = false;
var star = document.getElementById("star");
function drag(x, y) {
if (dragging) {
star.setAttribute("transform", "translate(" + x + "," + y + ")");
}
}
</script>
</svg>
SVG 要素上で will-change をサポートするユーザーエージェントでは、 キャンバス上でドラッグするときに素早く合成できるよう、 星がレイヤーへレンダリングされる場合がある。 インタラクティブ SVG 文書を表示。
will-change プロパティは、 SVG Tiny 1.2 で定義された ‘buffered-rendering’ プロパティを置き換える。
SVGMarkerElement オブジェクトは、 DOM 内の ‘marker’ 要素を表す。
[Exposed=Window] interface SVGMarkerElement : SVGElement { // マーカー単位型 const unsigned short SVG_MARKERUNITS_UNKNOWN = 0; const unsigned short SVG_MARKERUNITS_USERSPACEONUSE = 1; const unsigned short SVG_MARKERUNITS_STROKEWIDTH = 2; // マーカー配向型 const unsigned short SVG_MARKER_ORIENT_UNKNOWN = 0; const unsigned short SVG_MARKER_ORIENT_AUTO = 1; const unsigned short SVG_MARKER_ORIENT_ANGLE = 2; const unsigned short SVG_MARKER_ORIENT_AUTO_START_REVERSE = 3; [SameObject] readonly attribute SVGAnimatedLength refX; [SameObject] readonly attribute SVGAnimatedLength refY; [SameObject] readonly attribute SVGAnimatedEnumeration markerUnits; [SameObject] readonly attribute SVGAnimatedLength markerWidth; [SameObject] readonly attribute SVGAnimatedLength markerHeight; [SameObject] readonly attribute SVGAnimatedEnumeration orientType; [SameObject] readonly attribute SVGAnimatedAngle orientAngle; attribute DOMString orient; undefined setOrientToAuto(); undefined setOrientToAngle(SVGAngle angle); }; SVGMarkerElement includes SVGFitToViewBox;
SVGMarkerElement 上で定義される数値マーカー単位型定数は、 ‘markerUnits’ 属性が取り得るキーワード値を表すために使用される。その意味は次のとおり:
| 定数 | 意味 |
|---|---|
| SVG_MARKERUNITS_USERSPACEONUSE | userSpaceOnUse キーワード。 |
| SVG_MARKERUNITS_STROKEWIDTH | strokeWidth キーワード。 |
| SVG_MARKERUNITS_UNKNOWN | その他の値。 |
SVGMarkerElement 上で定義される数値マーカー配向型定数は、 ‘orient’ 属性が取り得る値の型を表すために使用される。その意味は次のとおり:
| 定数 | 意味 |
|---|---|
| SVG_MARKER_ORIENT_AUTO | auto キーワード。 |
| SVG_MARKER_ORIENT_AUTO_START_REVERSE | auto-start-reverse キーワード。 |
| SVG_MARKER_ORIENT_ANGLE | 配向角を示す <angle> または <number> 値。 |
| SVG_MARKER_ORIENT_UNKNOWN | その他の値。 |
markerUnits IDL 属性は、 ‘markerUnits’ コンテンツ属性を 反映する。 ‘markerUnits’ の 数値型値は、 上記の数値マーカー単位型定数表で説明したとおりである。
orientType, orientAngle および orient IDL 属性は すべて ‘orient’ コンテンツ属性を反映する。 ‘orient’ の 数値型値は次のとおり:
| 値 | 数値型値 |
|---|---|
| auto | SVG_MARKER_ORIENT_AUTO |
| auto-start-reverse | SVG_MARKER_ORIENT_AUTO_START_REVERSE |
| <angle> | <number> | SVG_MARKER_ORIENT_ANGLE |
refX, refY, markerWidth および markerHeight IDL 属性は、 ‘refX’, ‘refY’, ‘markerWidth’ および ‘markerHeight’ コンテンツ属性を それぞれ反映する。
setOrientToAuto メソッドは ‘orient’ 属性の値を 'auto' に設定するために使用される。 setOrientToAuto() が呼び出されると、 ‘orient’ 属性を単純に 'auto' に設定する。
setOrientToAngle メソッドは ‘orient’ 属性の値を 特定の角度値へ設定するために使用される。setOrientToAngle(angle) が 呼び出されると、 ‘orient’ 属性は angle を値として使用して 再シリアライズされる。
この節ではペイントサーバーを扱う。これは、 オブジェクトの fill または stroke を別の場所にあるリソースによって 定義できるようにする方法である。これにより、リソースを文書全体で 再利用できる。オブジェクトの塗りとストロークに関する一般的な説明については、 ペイント: 塗りとストロークの節を 参照すること。
SVG は複数の種類のペイントサーバーを定義する:
| SVG 2 要件: | 図形への任意の塗り。 |
|---|---|
| 決議: | SVG 2 は任意の要素からの塗りと ストロークをサポートするものとする。 |
| 目的: | 例えば動画や画像を塗りのソースとして使用できるようにするため。 |
| 担当者: | Alex?(アクションなし) |
2 種類のペイントサーバー。左から右へ: 線形グラデーション。 パターン。
ペイントサーバーは、fill または stroke プロパティに URL 参照を含めて 使用する(すなわち fill="url(#MyLightPurple)")。
プロパティは祖先から ペイントサーバー要素へ継承される。 プロパティはペイントサーバー要素を参照する要素からは 継承されない。
ペイントサーバー要素が直接レンダリングされることはなく、その唯一の用途は、 fill および stroke プロパティを使用して 参照できるものとして使用することである。 これらの要素の display 値は、 ユーザーエージェントスタイルシートによって 常に none に設定しなければならず、 この宣言は他のどの CSS 規則またはプレゼンテーション属性よりも優先されなければならない。 ペイントサーバー要素は、 ペイントサーバー要素またはその祖先の display プロパティが none に設定されている場合でも、 参照に利用できる。
ほとんどのペイントサーバー要素は ‘href’ 属性を受け入れ、 互換性のあるペイントサーバー要素をテンプレートとして定義するために使用できる。 テンプレート要素に定義された属性は、 対応する属性が現在の要素に指定されていない場合、 初期値の代わりに使用される。 さらに、現在の要素が 記述要素以外の子コンテンツを持たない場合、 テンプレート要素の子コンテンツがクローンされ、それを置き換える。
記述コンテンツを除外することは、‘pattern’ について SVG 2 で新しく追加されたものであり、 グラデーションの動作、 および任意の SVG 要素で記述コンテンツを有効にする変更と一致する。
これも新しい点である。テンプレートの相互参照は外部ファイルリソースを指してもよく (SVG 1.1 の異なる章ではこの点について一貫しない指針があった)、 子要素の「継承」はシャドウツリーを通じて表現される。
テンプレート化は任意のレベルまで間接的に行うことができる (外部ファイルリソースに対するセキュリティ制限に従い、 その制限により参照が無効になる場合がある)。 したがって、参照されるテンプレート要素が関連する子コンテンツを持たない場合、 または指定された属性を定義していない場合、 属性値またはクローンされたコンテンツは、 テンプレート自身の ‘href’ 属性で参照される別の要素から導出される。
この章の各 ‘href’ 属性の説明では、 テンプレート化処理の制限を次のように定義する:
指定された属性のいずれかが 現在の要素に定義されていない場合、 または現在の要素が 記述要素以外の子要素を持たない場合、 ユーザーエージェントは参照されるリソースを識別するために URL を処理しなければならない。 URL 参照が 無効でない場合、 URL の対象要素を次のようにテンプレート要素として使用する:
現在の要素に定義されていない指定属性について、 ユーザーエージェントはテンプレート要素についてその属性の値を 決定し、 現在の要素の値として使用しなければならない。 テンプレート値は、必要に応じて 再帰的な相互参照から導出される。 属性の初期値は、 すべての有効な URL 参照を使い切った後にのみ代入される。
現在の要素が 記述要素以外の子要素を持たない場合、 ユーザーエージェントはこの要素について シャドウツリーを生成しなければならず、 これは use 要素のシャドウ ツリーと等価に動作しなければならない。 ただし、ホストは現在のペイントサーバー要素である。 シャドウツリーへクローンされる 要素インスタンスの 参照される文書 サブツリー内のソース要素は次のとおり:
ペイントサーバー要素がシャドウツリーを持つ場合、 そのツリー内の 要素インスタンスは、 ペイントサーバー要素自身の子であるかのように、 ペイントサーバー効果のレンダリングに使用しなければならない。
テンプレート化のための use 要素のシャドウツリーモデルにより、 クローンされたコンテンツは元のものとは異なるスタイルを継承できる。 この動作は SVG 2 で新しく定義されたものである。 SVG 1.1 は、継承されたペイントサーバーコンテンツへスタイルをどのように適用するかを定義していなかった。
グラデーションは、描画面上の点の間の滑らかな色遷移から構成される。 SVG は 2 種類のグラデーションを提供する:
グラデーションが定義されると、グラフィックス要素は、 fill または stroke プロパティにグラデーションへの参照を設定することで、 グラデーションを使用して塗りまたはストロークを行うことができる。
線形および放射グラデーションの色遷移は、 グラデーションベクトルに沿った一連の色 stopによって定義される。 グラデーション法線は、ベクトル内の色を 表面へどのようにペイントするかを定義する。線形グラデーションでは、法線は ベクトルに垂直な線である。放射グラデーションでは、法線は ベクトルと直角に交差する円である。各グラデーション 法線は、ベクトルによって決定される 1 つの色でペイントされる。
グラデーションベクトルが示された線形および放射グラデーション。 ベクトルは小さな円で示された 3 つの stop から構成される。 各グラデーションについて 1 本のグラデーション法線が示されている。
線形および放射グラデーションでは、グラデーションベクトルに沿った 2 つの stop 間の 色値は、各 stop の色を stop からの距離で重み付けした、 チャンネルごとの線形補間である。
$V = C0.rgba + (C1.rgba - C0.rgba) * ((D - C0.offset) / (C1.offset - C0.offset));
各チャンネルについて:
グラフィックス要素がグラデーションを参照するとき、概念的には グラフィックス要素はグラデーション法線を持つグラデーションベクトルのコピーを取り、 それを自身のジオメトリの一部として扱うべきである。 グラフィックス要素のジオメトリに適用されるすべての変換は、 コピーされたグラデーションベクトルとグラデーション法線にも適用される。 参照されるグラデーションに指定されたグラデーション変換は、 グラフィックス要素の変換がグラデーションへ適用される前に 適用される。
線形グラデーションは、 ‘linearGradient’ 要素によって定義される。
‘linearGradient’ 上の ‘x1’,‘y1’, ‘x2’ および ‘y2’ 属性は プレゼンテーション属性ではないことに注意すること。 使用値は CSS スタイルの影響を受けない。 ‘gradientTransform’ 属性は transform プロパティの プレゼンテーション属性である。
属性 ‘x1’, ‘y1’, ‘x2’ および ‘y2’ の座標系を定義する。
gradientUnits="userSpaceOnUse" の場合、 ‘x1’, ‘y1’, ‘x2’, および ‘y2’ は、グラデーション要素が参照された時点で有効な 現在のユーザー座標系 (すなわち fill または stroke プロパティを介して グラデーション要素を参照する要素のユーザー座標系)を取り、 その後属性 ‘gradientTransform’ で指定された変換を適用した結果の座標系内の値を表す。 パーセント値は 現在の SVG ビューポートを基準とした値を表す。
gradientUnits="objectBoundingBox" の場合、 属性 ‘x1’, ‘y1’, ‘x2’ および ‘y2’ のユーザー座標系は、 グラデーションが適用される要素の境界ボックスを使用して 確立され (オブジェクト 境界ボックス単位を参照)、その後属性 ‘gradientTransform’ で指定された変換が適用される。 パーセント値はオブジェクトの境界ボックスを基準とした値を 表す。
gradientUnits="objectBoundingBox" で、 ‘gradientTransform’ が単位行列の場合、 線形グラデーションの法線は、 オブジェクト境界ボックス空間内でグラデーションベクトルに垂直である (すなわち (0,0) がオブジェクト境界ボックスの左上、 (1,1) がオブジェクト境界ボックスの 右下にある抽象座標系)。オブジェクトの 境界ボックスが正方形でない場合、オブジェクト境界ボックス空間内では 当初グラデーションベクトルに垂直であったグラデーション法線が、 ユーザー空間ではグラデーションベクトルに対して 垂直でないようにレンダリングされる場合がある。グラデーションベクトルが 境界ボックスのいずれかの軸と平行である場合、グラデーション法線は 垂直のままとなる。この変換は、境界 ボックス空間からユーザー座標系への不均一な拡大縮小変換を 適用するために生じる。
グラデーション座標系から 対象座標系への任意の追加変換の定義を含む (すなわち 'userSpaceOnUse' または 'objectBoundingBox')。 これにより、グラデーションを傾斜させるなどの処理が可能になる。 この追加変換行列は、以前に定義されたすべての 変換に後乗算される (すなわち右側に挿入される)。これには、 オブジェクト境界 ボックス単位からユーザー座標系へ変換するために必要な暗黙の変換も含まれる。
‘x1’, ‘y1’, ‘x2’ および ‘y2’ は、 線形グラデーションのグラデーションベクトルを定義する。 このグラデーションベクトルは、グラデーション stopが対応付けられる開始点と 終了点を提供する。‘x1’, ‘y1’, ‘x2’ および ‘y2’ の値は、 数値またはパーセント値のいずれでもよい。
‘x1’ を参照。
‘x1’ を参照。
‘x1’ を参照。
グラデーションが対象矩形の境界内で 開始または終了する場合に何が起こるかを示す。
spreadMethod に指定できる 3 つの値を、 左から右へ示す: pad、reflect、repeat。グラデーションベクトルは 境界ボックス幅の 40% から 60% までにわたる。
テンプレートグラデーション要素への URL 参照。 有効であるためには、参照は 別の ‘linearGradient’ または ‘radialGradient’ 要素を指さなければならない。
ペイントサーバーをテンプレートとして 使用する処理と、 URL 参照属性および 非推奨の XLink 属性について定義された共通処理を参照すること。
テンプレートからコピーされる指定属性は次のとおり:
‘x1’ = ‘x2’ かつ ‘y1’ = ‘y2’ の場合、 ペイントされる領域は、 最後の グラデーション stopの 色と不透明度を使用した単一色で ペイントされる。
lingrad01 の例は、 線形グラデーションペイントサーバーを参照して矩形を塗る方法を示す。
<?xml version="1.0" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg"
version="1.1"
viewBox="0 0 300 200" >
<title>lingrag01 の例</title>
<desc>線形グラデーションペイントサーバーを使用して矩形を塗る。</desc>
<defs>
<linearGradient id="MyGradient">
<stop offset="5%" stop-color="#A8F" />
<stop offset="95%" stop-color="#FDC" />
</linearGradient>
</defs>
<!-- 矩形は線形グラデーションペイントサーバーを使用して塗られる -->
<rect fill="url(#MyGradient)"
stroke="black"
stroke-width="2"
x="25" y="25" width="250" height="150"/>
</svg>
lingrad01 の例
放射グラデーションは、 ‘radialGradient’ 要素によって定義される。
‘radialGradient’ 上の ‘cx’,‘cy’, および ‘r’ 属性は プレゼンテーション属性ではないことに注意すること。 使用値は CSS スタイルの影響を受けない。 ‘gradientTransform’ 属性は transform プロパティの プレゼンテーション属性である。
属性 ‘cx’, ‘cy’, ‘r’, ‘fx’, ‘fy’, および ‘fr’ の座標系を定義する。
gradientUnits="userSpaceOnUse" の場合、 ‘cx’, ‘cy’, ‘r’, ‘fx’, ‘fy’, および ‘fr’ は、グラデーション要素が参照された時点で有効な 現在のユーザー座標系 (すなわち fill または stroke プロパティを介して グラデーション要素を参照する要素のユーザー座標系)を取り、 その後属性 ‘gradientTransform’ で指定された変換を適用した結果の座標系内の値を表す。 パーセント値は 現在の SVG ビューポートを基準とした値を表す。
gradientUnits="objectBoundingBox" の場合、 属性 ‘cx’, ‘cy’, ‘r’, ‘fx’, ‘fy’, および ‘fr’ のユーザー座標系は、 グラデーションが適用される要素の境界ボックスを使用して 確立され (オブジェクト 境界ボックス単位を参照)、その後属性 ‘gradientTransform’ で指定された変換が適用される。 パーセント値はオブジェクトの境界ボックスを基準とした値を 表す。
gradientUnits="objectBoundingBox" で、 ‘gradientTransform’ が単位行列の場合、 放射グラデーションのリングは オブジェクト境界ボックス空間に対して円形となる (すなわち (0,0) がオブジェクト境界ボックスの左上、 (1,1) がオブジェクト境界ボックスの 右下にある抽象座標系)。オブジェクトの 境界ボックスが正方形でない場合、オブジェクト境界ボックス空間内では 概念的に円形であるリングが、 境界ボックス空間からユーザー座標系への 不均一な拡大縮小変換を適用するため、 楕円としてレンダリングされる。
グラデーション座標系から 対象座標系への任意の追加変換の定義を含む (すなわち 'userSpaceOnUse' または 'objectBoundingBox')。 これにより、グラデーションを傾斜させるなどの処理が可能になる。 この追加変換行列は、以前に定義されたすべての 変換に後乗算される (すなわち右側に挿入される)。これには、 オブジェクト境界 ボックス単位からユーザー座標系へ変換するために必要な暗黙の変換も含まれる。
‘cx’, ‘cy’ および ‘r’ は、 放射グラデーションの終了円を定義する。 グラデーションは、 100% の グラデーション stopが この終了円の周囲へ対応付けられるように描画される。
‘cx’ を参照。
‘cx’ を参照。
負の値はエラーである (エラー 処理を参照)。
‘fx’, ‘fy’, および ‘fr’ は、放射グラデーションの開始 円を定義する。 グラデーションは、 0% の グラデーション stopが この開始円の周囲へ対応付けられるように描画される。
要素が 'fx' の値を指定する 要素を参照する場合、'fx' の値は 参照される要素から継承される。
この図は、‘fr’ が ‘r’ の 50% である場合の幾何学的属性の定義方法を示す。 小さい円は最外円の中心 (‘cx’,‘cy’)を示し、 十字は最内円の中心 (‘fx’,‘fy’)を示す。 破線は 2 本のグラデーションベクトルを示す。ベクトルは 内側と最外円の対応する点を接続する。 外側の円より外部の領域は最後の stop-color でペイントされ、 内側の円より内部の領域は最初の stop-color でペイントされる。
‘fx’ を参照。
要素が 'fy' の値を指定する要素を 参照する場合、'fy' の値は 参照される要素から継承される。
SVG 2 で新しく追加された。Canvas と整合させるために追加された。
負の値はエラーである (エラー 処理を参照)。
属性が指定されていない場合、 '0%' の値が 指定されたかのような効果を持つ。要素が 'fr' の値を指定する要素を参照する場合、'fr' の値は 参照される要素から継承される。
| SVG 2 要件: | 放射グラデーションで焦点円の半径を指定できるようにする。 |
|---|---|
| 決議: | SVG 2 の ‘radialGradient’> に ‘fr’ 属性を追加する。 |
| 目的: | Canvas と整合させるため。offset が 0 の stop は、 ‘fx’, ‘fy’ および ‘fr’ 属性によって定義される円上に置かれる。 |
| 担当者: | Erik (ACTION-3098) |
グラデーションによってペイントされるオブジェクトの境界内で グラデーションが開始または終了する場合に何が起こるかを示す。 ‘linearGradient’ 要素上の ‘spreadMethod’ 属性と同じ値と意味を持つ。
テンプレートグラデーション要素への URL 参照。 有効であるためには、参照は ‘linearGradient’ 要素 または 別の ‘radialGradient’ 要素を指さなければならない。
ペイントサーバーをテンプレートとして 使用する処理と、 URL 参照 属性および 非推奨の XLink 属性について定義された共通処理を参照すること。
テンプレートからコピーされる指定属性は次のとおり:
URL 参照 属性および 非推奨の XLink 属性について定義された共通処理を参照すること。
| SVG 2 要件: | 焦点が円上にある放射グラデーションを明確化する。 |
|---|---|
| 決議: | 焦点が円の辺上にあり、 repeat の場合、繰り返される色の最初と最後の stop 間の距離は 0 となり、 ペイントはすべてのグラデーション stop の平均となる色を生成すべきである。 |
| 目的: | 放射グラデーションの相互運用性を改善するため。 |
| 担当者: | Erik (ACTION-3097) |
| 注記: | SVG 1.1 は、焦点が円の辺上にあり 'repeat' の場合に 何をすべきかを定義していない。繰り返される色の 最初と最後の stop 間の距離は 0 である。 ペイントはすべてのグラデーション stop の (offset による)加重平均となる色を生成すべきであると決議された。 |
SVG 2 で変更された。SVG 1.1 では、焦点が 終了円の外側にある場合、その焦点を終了 円上へ移動することを要求していた。この変更は Canvas と整合させるために行われた。
焦点が終了円の外側に位置することを許可することは、 Rigi Kaltbad ワーキンググループ会議で決議された。
‘fx’, ‘fy’ および ‘fr’ によって定義される開始円が、 ‘cx’, ‘cy’, および ‘r’ によって定義される終了円の 外側にある場合、実質的に 2 つの円に接する円錐が作られる。 円錐の外側の領域はグラデーションによる影響を受けない (透明な黒のまま)。
開始円が終了円と完全に重なる場合、 グラデーションは描画されない。領域は影響を受けない(透明な黒のまま)。
焦点(開始)円が 終了円の外側にある放射グラデーション。焦点円は 右側の小さい円である。グラデーションは spreadMethod="reflect" である。
spreadMethod="repeat" を持つ 2 つの放射グラデーション。左側では、 焦点は ‘cx’, ‘cy’, および ‘r’ によって定義される円の 右側のすぐ内側にある。右側では、 焦点は円上にある。この場合、 円周の右側にペイントされる領域は、 グラデーションベクトル内の色の加重平均と等しい塗りを持つ。
上図の右側のグラデーションで、 グラデーションの右側の領域を処理する方法は、 その領域が透明な黒になる Canvas とは異なる。この違いは SVG 1.1 との互換性を維持するためである。
加重平均に使用する色空間は、 グラデーションを補間する色空間と同じである。 Rigi Kaltbad ワーキンググループ会議を参照。
radgrad01 の例は、 放射グラデーションペイント サーバーを参照して矩形を塗る方法を示す。
<?xml version="1.0" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 300 200" >
<title>radgrad01 の例</title>
<desc>放射グラデーションペイントサーバーを参照して矩形を塗る。</desc>
<defs>
<radialGradient id="MyGradient"
gradientUnits="userSpaceOnUse"
cx="150" cy="100"
r="100">
<stop offset="0%" stop-color="#A8F" />
<stop offset="50%" stop-color="#FDC" />
<stop offset="100%" stop-color="#A8F" />
</radialGradient>
</defs>
<!-- 矩形は放射グラデーションペイントサーバーを使用して塗られる -->
<rect fill="url(#MyGradient)"
stroke="black"
stroke-width="2"
x="25" y="25" width="250" height="150"/>
</svg>
radgrad01 の例
グラデーションで使用する色のベクトルは、 ‘stop’ 要素によって定義される。 これらは ‘linearGradient’ または ‘radialGradient’ 要素の子要素である。
SVG 1.1 では、上記は「色の ramp は...」と なっていたが、この節の他の箇所では "ramp" は使用されていない。
グラデーション stop が配置される位置を示す。線形 グラデーションでは、‘offset’ 属性は グラデーションベクトルに沿った位置を表す。放射グラデーションでは、 最内/最小の円の辺から 最外/最大の円の辺までの 相対距離を表す。
stop-color プロパティは、 そのグラデーション stop で使用する色を示す。 キーワード currentColor およびその他の色構文は、 fill および stroke プロパティの <paint> 指定内と 同じ方法で指定できる。
グラデーションについて、SVG は 'transparent' キーワードを CSS とは異なる方法で扱う。SVG は事前乗算された 空間でグラデーションを計算しないため、'transparent' は実際には透明な黒を意味する。 値 'transparent' の stop-color を指定することは、 値 'black' の stop-color と、 値 '0' の stop-opacity を 指定することと等価である。
stop-opacity プロパティは、 指定されたグラデーション stop の不透明度を定義する。 グラデーションの計算に使用される不透明度値は、 stop-opacity の値と stop-color の値の不透明度の 積である。明示的な不透明度情報を含まない stop-color の値型では、 その成分の不透明度を 1 として扱わなければならない。
2 つのグラデーション stop が同じ offset 値を持つ場合、 後のグラデーション stop が重なり点での 色値を制御する。特に:
<stop offset="0" stop-color="white"/> <stop offset=".2" stop-color="red"/> <stop offset=".2" stop-color="blue"/> <stop offset="1" stop-color="black"/>
は、おおよそ次と同じ効果を持つ:
<stop offset="0" stop-color="white"/> <stop offset=".1999999999" stop-color="red"/> <stop offset=".2" stop-color="blue"/> <stop offset="1" stop-color="black"/>
これは、白から赤へ滑らかに変化し、 その後赤から青へ急激に変化し、さらに 青から黒へ滑らかに変化するグラデーションである。
パターンは、固定間隔で x および y 方向へ 複製(「タイル化」)してペイント対象領域を覆うことができる、 あらかじめ定義されたグラフィカルオブジェクトを使用して、 オブジェクトを 塗るまたは ストロークするために使用される。 パターンは ‘pattern’ 要素を使用して定義し、その後、指定された グラフィックス要素上の fill および stroke プロパティから参照して、 その要素をパターンで塗るまたはストロークすることを示す。
属性 ‘x’, ‘y’, ‘width’, ‘height’ および ‘patternUnits’ は、 無限のキャンバス上のどこかにある基準矩形を定義する。 基準矩形の左上は (x, y)、右下は (x + width, y + height) にある。 理論上、タイル配置では、このような矩形の列が X および Y (正負両方向)へ無限に延長され、各整数値 m および n について矩形は (x + m*width, y + n* height) から始まる。
‘pattern’ 上の ‘x’,‘y’, ‘width’ および ‘height’ 属性は プレゼンテーション属性ではないことに注意すること。 使用値は CSS スタイルの影響を受けない。 ‘patternTransform’ 属性は transform プロパティのプレゼンテーション属性である。
属性 ‘x’, ‘y’, ‘width’ および ‘height’ の座標系を定義する。
patternUnits="userSpaceOnUse" の場合、 ‘x’, ‘y’, ‘width’ および ‘height’ は、‘pattern’ 要素が参照された 時点で有効な現在のユーザー座標系 (すなわち fill または stroke プロパティを介して ‘pattern’ 要素を参照する要素の ユーザー座標系)を取り、その後 属性 ‘patternTransform’ で指定された変換を適用した結果の座標系内の値を表す。 パーセント値は 現在の SVG ビューポートを基準とした値を表す。
patternUnits="objectBoundingBox" の場合、 属性 ‘x’, ‘y’, ‘width’ および ‘height’ のユーザー座標系は、 パターンが適用される要素の境界ボックスを使用して 確立され (オブジェクト 境界ボックス単位を参照)、その後属性 ‘patternTransform’ で指定された変換が適用される。 パーセント値はオブジェクトの境界ボックスを基準とした値を 表す。
‘pattern’ の 内容の座標系を定義する。 属性 ‘viewBox’ が指定されている場合、 この属性は効果を持たないことに注意すること。
patternContentUnits="userSpaceOnUse" の場合、 ‘pattern’ 要素の内容の ユーザー座標系は、 ‘pattern’ 要素が参照された 時点で有効な現在のユーザー座標系 (すなわち fill または stroke プロパティを介して ‘pattern’ 要素を参照する要素の ユーザー座標系)を取り、その後属性 ‘patternTransform’ で指定された変換を適用した結果の座標系である。
patternContentUnits="objectBoundingBox" の場合、 ‘pattern’ 要素の内容の ユーザー座標系は、 パターンが適用される要素の 境界ボックスを使用して確立され (オブジェクト 境界ボックス単位を参照)、その後属性 ‘patternTransform’ で指定された変換が適用される。
パターン座標系から 対象座標系への任意の追加変換の定義を含む (すなわち 'userSpaceOnUse' または 'objectBoundingBox')。 これにより、パターンタイルを傾斜させるなどの処理が可能になる。 この追加変換行列は、以前に定義されたすべての 変換に後乗算される (すなわち右側に挿入される)。これには、 オブジェクト境界 ボックス単位からユーザー座標系へ変換するために必要な暗黙の変換も含まれる。
‘x’, ‘y’, ‘width’ および ‘height’ は、 パターンタイルをどのように配置し、間隔を空けるかを示す。 これらの属性は、 属性 ‘patternUnits’ および ‘patternTransform’ の組み合わせによって指定される座標空間内の座標と値を表す。
‘x’ を参照。
‘x’ を参照。
負の値はエラーである (エラー 処理を参照)。値が 0 の場合、 要素のレンダリングは無効になる(すなわちペイントは適用されない)。
‘x’ を参照。
負の値はエラーである(エラー処理を参照)。 値が 0 の場合、要素のレンダリングは無効になる(すなわち、 ペイントは適用されない)。
テンプレート要素への URL 参照。 有効であるためには、それは別の ‘pattern’ 要素でなければならない。
ペイントサーバーをテンプレートとして 使用する処理と、 URL 参照属性および 非推奨の XLink 属性について定義された共通処理を参照すること。
テンプレートからコピーされる指定属性は次のとおり:
SVG の ユーザーエージェントスタイルシートは、 ‘pattern’ 要素の overflow プロパティを hidden に設定し、これにより パターンタイルの境界に矩形のクリッピングパスが作成される。 overflow プロパティが上書きされない限り、 パターン内のグラフィックスで パターン矩形の外側へ出るものはすべてクリップされる。 以下の pattern01 の例は、 パターンタイルへクリップする効果を示す。
overflow プロパティが visible に設定されている場合、 パターンの境界外におけるパターンのレンダリング動作は 現在未定義であることに注意すること。将来の SVG バージョンでは、 overflow を表示することが要求される可能性がある。 SVG 実装者には、著者が期待する動作であるため、 overflow をレンダリングすることが推奨される。overflow をレンダリングする場合、 パターンタイルは各行を左から右へレンダリングし、 行は上から下へレンダリングすべきである。
GitHub Issue 129 を参照
‘pattern’ の内容は新しい座標 系を基準とする。‘viewBox’ 属性がある場合、新しい座標 系は、‘pattern’ 要素上の ‘x’, ‘y’, ‘width’, ‘height’ および ‘patternUnits’ 属性で定義された領域へ、 ‘viewBox’ および ‘preserveAspectRatio’ の標準規則を使用して 収められる。‘viewBox’ 属性がない場合、 新しい座標系の原点は (x, y) にあり、 x は ‘pattern’ 要素上の ‘x’ 属性によって確立され、 y は ‘pattern’ 要素上の ‘y’ 属性によって確立される。したがって、次の 例では:
<pattern x="10" y="10" width="20" height="20"> <rect x="5" y="5" width="10" height="10"/> </pattern>
矩形の左上は、パターンタイルの原点から 右へ 5 単位、下へ 5 単位の位置にある。
‘viewBox’ 属性は、 属性 ‘x’, ‘y’, ‘width’, ‘height’ および ‘patternUnits’ によって新しいパターン座標系を作成するために必要な すべての変換に加えて適用される補助的な変換を導入する。
‘pattern’ 要素の内容へ付加された イベント属性およびイベントリスナーは処理されない。 ‘pattern’ 要素の レンダリングに関する側面だけが処理される。
pattern01 の例は、 パターンペイントサーバーを参照して矩形を 塗る方法を示す。各三角形の青いストロークが 上端と左端でわずかにクリップされていることに注意すること。 これは SVG の ユーザーエージェントスタイルシートが、 ‘pattern’ 要素の overflow プロパティを hidden に設定し、パターンを パターンタイルの境界へクリップするためである。
<?xml version="1.0" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg"
version="1.1"
viewBox="0 0 300 200" >
<title>pattern01 の例</title>
<desc>パターンペイントサーバーを使用して楕円を塗る。</desc>
<defs>
<pattern id="TrianglePattern"
patternUnits="userSpaceOnUse"
x="0" y="0" width="50" height="50"
viewBox="0 0 10 10" >
<path d="M 0 0 L 7 0 L 3.5 7 z"
fill="plum"
stroke="blue" />
</pattern>
</defs>
<!-- 楕円は三角形パターンのペイントサーバーを使用して塗られる -->
<ellipse fill="url(#TrianglePattern)"
stroke="black"
stroke-width="2"
cx="150" cy="100" rx="125" ry="75" />
</svg>
pattern01 の例
SVGGradientElement インターフェイスは、 グラデーションペイントサーバー要素インターフェイスの 基底インターフェイスとして使用される。
[Exposed=Window] interface SVGGradientElement : SVGElement { // Spread Method 型 const unsigned short SVG_SPREADMETHOD_UNKNOWN = 0; const unsigned short SVG_SPREADMETHOD_PAD = 1; const unsigned short SVG_SPREADMETHOD_REFLECT = 2; const unsigned short SVG_SPREADMETHOD_REPEAT = 3; [SameObject] readonly attribute SVGAnimatedEnumeration gradientUnits; [SameObject] readonly attribute SVGAnimatedTransformList gradientTransform; [SameObject] readonly attribute SVGAnimatedEnumeration spreadMethod; }; SVGGradientElement includes SVGURIReference;
SVGGradientElement 上で定義される数値 spread method 型定数は、 ‘spreadMethod’ 属性が取り得るキーワード値を表すために使用される。その意味は次のとおり:
| 定数 | 意味 |
|---|---|
| SVG_SPREADMETHOD_PAD | pad キーワード。 |
| SVG_SPREADMETHOD_REFLECT | reflect キーワード。 |
| SVG_SPREADMETHOD_REPEAT | repeat キーワード。 |
| SVG_SPREADMETHOD_UNKNOWN | その他の値。 |
gradientUnits IDL 属性は、 ‘gradientUnits’ コンテンツ属性を 反映する。 グラデーション要素上の ‘gradientUnits’ 属性の 数値型値は次のとおり:
| 値 | 数値型値 |
|---|---|
| userSpaceOnUse | SVG_UNIT_TYPE_USERSPACEONUSE |
| objectBoundingBox | SVG_UNIT_TYPE_OBJECTBOUNDINGBOX |
gradientTransform IDL 属性は、‘linearGradient’ および ‘radialGradient’ 要素について、 transform プロパティの計算値 および 'gradientTransform' プレゼンテーション属性を 反映する。
spreadMethod IDL 属性は、 ‘spreadMethod’ コンテンツ属性を 反映する。 グラデーション要素上の ‘spreadMethod’ 属性の 数値型値は、 上記の数値 spread 型定数表で説明したとおりである。
SVGLinearGradientElement オブジェクトは、DOM 内の ‘linearGradient’ を 表す。
[Exposed=Window] interface SVGLinearGradientElement : SVGGradientElement { [SameObject] readonly attribute SVGAnimatedLength x1; [SameObject] readonly attribute SVGAnimatedLength y1; [SameObject] readonly attribute SVGAnimatedLength x2; [SameObject] readonly attribute SVGAnimatedLength y2; };
x1, y1, x2 および y2 IDL 属性は、 ‘x1’, ‘y1’, ‘x2’ および ‘y2’ コンテンツ属性をそれぞれ反映する
SVGRadialGradientElement オブジェクトは、DOM 内の ‘radialGradient’ を 表す。
[Exposed=Window] interface SVGRadialGradientElement : SVGGradientElement { [SameObject] readonly attribute SVGAnimatedLength cx; [SameObject] readonly attribute SVGAnimatedLength cy; [SameObject] readonly attribute SVGAnimatedLength r; [SameObject] readonly attribute SVGAnimatedLength fx; [SameObject] readonly attribute SVGAnimatedLength fy; [SameObject] readonly attribute SVGAnimatedLength fr; };
cx, cy, r, fx, fy および fr IDL 属性は、 ‘cx’, ‘cy’, ‘r’, ‘fx’, ‘fy’ および ‘fr’ コンテンツ属性を それぞれ反映する
SVGStopElement オブジェクトは、 DOM 内の ‘stop’ 要素を 表す。
[Exposed=Window] interface SVGStopElement : SVGElement { [SameObject] readonly attribute SVGAnimatedNumber offset; };
offset IDL 属性は、 ‘offset’ コンテンツ属性を 反映する。
SVGStopElement は、 ‘path’ 属性を 反映する IDL 属性を持たないことに注意すること。
SVGPatternElement オブジェクトは、 DOM 内の ‘pattern’ 要素を表す。
[Exposed=Window] interface SVGPatternElement : SVGElement { [SameObject] readonly attribute SVGAnimatedEnumeration patternUnits; [SameObject] readonly attribute SVGAnimatedEnumeration patternContentUnits; [SameObject] readonly attribute SVGAnimatedTransformList patternTransform; [SameObject] readonly attribute SVGAnimatedLength x; [SameObject] readonly attribute SVGAnimatedLength y; [SameObject] readonly attribute SVGAnimatedLength width; [SameObject] readonly attribute SVGAnimatedLength height; }; SVGPatternElement includes SVGFitToViewBox; SVGPatternElement includes SVGURIReference;
patternUnits および patternContentUnits IDL 属性は、それぞれ ‘patternUnits’ および ‘patternContentUnits’ コンテンツ属性を反映する。 ‘patternUnits’ および ‘patternContentUnits’ の 数値型値は次のとおり:
| 値 | 数値型値 |
|---|---|
| userSpaceOnUse | SVG_UNIT_TYPE_USERSPACEONUSE |
| objectBoundingBox | SVG_UNIT_TYPE_OBJECTBOUNDINGBOX |
patternTransform IDL 属性は、transform プロパティの計算値 および ‘patternTransform’ プレゼンテーション属性を 反映する。
x, y, width および height IDL 属性は、‘x’, ‘y’, ‘width’ および ‘height’ コンテンツ属性をそれぞれ反映する。
SVG コンテンツは、次の SVG 言語の 機能を利用することにより、インタラクティブ(すなわち ユーザーが開始したイベントに応答)にできる:
この章ではインタラクティブ SVG におけるスクリプティング および DOM イベント処理について、 イベントが発生する状況も含めて説明する。
関連情報は他の章にも記載されている:
| SVG 2 要件: | アンカー変更イベントをサポートする。 |
|---|---|
| 決議: | SVG 2 は HTML の 文書全体のイベント(hashchange を含む)が SVG 文書に意味のある場合に 適用されるよう追加することを検討する。 |
| 目的: | 著者がルート SVG 要素上で、HTML の body またはルート要素上と同じ イベントリスナー属性一式を使用できるようにするため。 |
| 担当者: | Cameron (ACTION-3278) |
| SVG 2 要件: | 適切なインターフェイスにイベントリスナー属性を持たせる。 |
|---|---|
| 決議: | SVG 2 はすべてのイベント リスナー属性を、HTML における同様の移動に従って Element へ移す。 |
| 目的: | HTML と整合させるため。 |
| 担当者: | Cameron (ACTION-3283) |
| SVG 2 要件: | イベントハンドラーで event の別名として evt を導入する。 |
|---|---|
| 決議: | イベントハンドラーで event の別名として evt を導入することで ISSUE-2176 を解決することを決定する。 |
| 目的: | HTML と整合させるため。 |
| 担当者: | Cameron (ACTION-3093) |
| SVG 2 要件: | ドラッグ&ドロップ機能をサポートする。 |
|---|---|
| 決議: | SVG 2 はドラッグ&ドロップ 機能を要求する可能性があり、そのため HTML5 の機能を調査する。 |
| 目的: | SVG でドラッグ&ドロップを容易にし、HTML と整合させるため。 |
| 担当者: | Erik (ACTION-3328) |
SVG の次の側面はイベントの影響を受ける:
SVG 1.1 で定義されていた多くのイベント、SVGLoad, SVGError などは、UI EVENTS および HTML で定義された同等の 接頭辞なしイベントに置き換えられている。
SVG でイベントを使用する、より現代的な例、例えば touch イベント(touch events 仕様への参照付き)をいくつか追加すべきである。 デバイスの向きイベントも有用かもしれない。
次の表は、この仕様で定義されるイベント、または定義元の仕様と比較して 追加の要件または明確化があるイベントを一覧にする。
最初の列のイベント名は、 アニメーションを開始または終了できるイベントを定義するため SVG の アニメーション要素内で 使用する名前である。2 番目の列の UI イベント名は、 DOM イベントリスナーを定義するときに使用する名前である ([DOM], 3.6 節)。
HTML または UI Events で導入されたイベントなど、表に記載されていないイベントでは、 対応する イベント型が SVG の アニメーション 要素内で使用する名前である。
指定された型のイベントがバブリングするか、キャンセル可能かについて表にある要件は、
ユーザーエージェントによって作成され
ディスパッチされるイベントにのみ適用される。スクリプトから
Document インターフェイス上の
createEvent メソッドを使用して作成された
これらの型のイベントは、
initEvent
メソッドを使用してバブリングまたはキャンセル可能にできる。
| イベント名と説明 | UI イベント名 | イベントカテゴリ | イベント属性名 |
|---|---|---|---|
|
load load イベントは、対応する外部リソースの読み込みが完了したときに、構造的外部要素および Window にのみ ディスパッチされる。関係により Window と ‘svg’ 要素上の load イベントは、 文書内のすべてのリソースが 完全に読み込まれた場合にのみディスパッチされることに注意すること。 構造的外部要素上の load イベントと error イベントは 相互に排他的であり、 対象要素を処理するときに これらのイベントのうち 1 つだけをディスパッチしなければならない。 load イベントはバブリングせず、キャンセル可能でもない。 以前の SVG 仕様では load イベントは SVGLoad と呼ばれ、要素の構文解析直後であって、 関連リソースが完全に読み込まれる 前にもディスパッチできた。 |
(同じ) | none | onload |
|
unload 最外部の svg 要素にのみ適用される。 unload イベントは、DOM 実装が文書を ウィンドウまたはフレームから削除したときに発生する。 unload イベントはバブリングせず、キャンセル可能でもない。 |
(同じ) | none | onunload |
|
error error イベントは、 構造的外部要素が 正常に読み込まれない 場合、またはスクリプトの実行中にエラーが 発生した場合に発生する。 error イベントはバブリングするが、キャンセル可能ではない。 |
(同じ) | none | onerror |
|
beginEvent アニメーション要素が開始したときに発生する。詳細については、 SMIL Animation 仕様の Interface TimeEvent の説明を参照すること。 |
none | none | onbegin |
|
endEvent アニメーション要素が終了したときに発生する。詳細については、 SMIL Animation 仕様の Interface TimeEvent の説明を参照すること。 |
none | none | onend |
|
repeatEvent アニメーション要素が繰り返されるときに発生する。最初の反復後、 要素が繰り返されるたびに発生する。 詳細については、 SMIL Animation 仕様の Interface TimeEvent の説明を参照すること。 |
none | none | onrepeat |
UI Events のイベント型についてイベントリスナーへ渡される パラメーターの詳細は、([uievents]) および ([DOM]) 仕様に記載されている。 その他のイベント型について、イベントリスナーへ渡されるパラメーターは この仕様の他の箇所で説明される。
同様に、event-value タイミング 指定子は、 アニメーション要素の ‘begin’ および ‘end’ 属性で使用され、関連要素へディスパッチされた「bubbling」および 「at target」フェーズのイベントへの応答時にのみ具体的な時刻へ解決される。
SVG DOM は、 UI Events で定義されるすべてのインターフェイスおよび すべてのイベント型と、 Clipboard API and events で定義される イベント型に対応する ([uievents], [clipboard-apis])。
SVG 名前空間内のすべての要素は、これらのイベントの イベント属性をサポートする。 対応する IDL プロパティは、基底 SVGElement インターフェイスへ GlobalEventHandlers mixin を介して含まれる。
SVG DOM サポートの一部として、適合する SVG ソフトウェアは、
これらの仕様で定義されるすべての(非推奨でも廃止でもない)イベント型を、
関連するイベントがソフトウェアの使用時に発生し得る場合、
サポートしなければならない。
ユーザーの 操作をサポートしない SVG ソフトウェアも、
load および error イベントなど、
操作なしで発火できるイベントをサポートすべきである。
SVG アニメーション要素は (SVG Animations Level 2 仕様で定義される) 追加のイベントおよびイベント属性をサポートする。 次のイベント型は、アニメーションの状態 変更によって発生する。
これらのアニメーションイベント用の イベント属性は、 その他の要素には効果を持たない。
インタラクティビティをサポートするユーザーエージェントでは、 著者がユーザーインターフェイスイベントに 応答するよう SVG 文書を定義することが一般的である。 可能なユーザーイベントには ポインターイベント、 キーボードイベント、および文書イベントがある。
ユーザーインターフェイス(UI)イベントへの応答として、著者は アニメーションを開始したり、別の Web ページへのハイパーリンクを実行したり、 文書の一部を強調表示したり(例えば、ポインターの下にある グラフィックス要素の色を変更する)、 「ロールオーバー」を開始したり(例えば、それまで非表示だったグラフィックス 要素をポインターの近くに表示させる)、 リモートデータベースと通信するスクリプトを起動したりできる。
ポインターデバイス上で行われるユーザー操作によって発生する ユーザーインターフェイスイベントを、ポインターイベントと呼ぶ。
多くのシステムは、マウスや トラックボールなどのポインターデバイスをサポートする。マウスを使用するシステムでは、ポインターイベントは マウス移動やマウスクリックなどの操作から構成される。異なる ポインターデバイスを持つシステムでは、ポインティングデバイスは多くの場合、 同等のユーザー操作を提供する機構、 例えばマウスクリックに相当する 押下ボタンなどによってマウスの動作をエミュレートする。
各ポインターイベントについて、SVG ユーザーエージェントは 指定されたポインターイベントのターゲット要素を決定する。 ターゲット要素は、イベント発生時に 関連するグラフィカルコンテンツがポインターの下にある最前面の グラフィックス要素である。(要素の関連するグラフィカル コンテンツがポインターの下にあるかを判断する方法、 したがってどのような状況でそのグラフィックス要素がポインター イベントのターゲット要素となり得るかについては、 pointer-events プロパティの説明を参照すること。) 要素が表示されていない場合(すなわち、その要素または その祖先の display プロパティの値が none である場合)、その要素は ポインターイベントのターゲットになれない。
ポインターイベントのターゲット要素が存在する場合、 イベントは通常の イベントフローに従ってその要素へディスパッチされる ([uievents], 3.1 節)。 ‘use’ 要素またはスクリプトによって作成されたシャドウツリーでは、 イベントは イベントのディスパッチ [dom] に従わなければならない
ポインターイベントのターゲット要素が存在しない場合、 イベントは無視される。
要素または領域とポインターデバイスとの操作には、2 つの異なる側面がある:
ポインターイベントが正の ヒットテスト結果となるかどうかは、 ポインターの位置、 グラフィックス要素の大きさと形状、および要素上の pointer-events プロパティの計算値に依存する。以下の pointer-events プロパティの定義では、指定された種類のグラフィックス要素について ポインターイベントに反応する正確な領域を説明する。
‘svg’ 要素は グラフィックス要素ではなく、 適合 SVG スタンドアロンファイルでは 最外部の svg 要素がポインター イベントのターゲットになることはないが、 イベントはこの要素へバブリングできることに注意すること。 ポインターイベントが グラフィックス要素上で 正の ヒットテスト結果にならない場合、 コンテキストメニューを表示するなど、 ユーザーエージェント固有のウィンドウ 動作を呼び出すべきである。
この仕様は、別の文書内へ参照または 包含によって埋め込まれた SVG 画像について、 最外部の svg 要素上のポインターイベントの動作を定義しない。 例えば、HTML 文書へ埋め込まれた 最外部の svg 要素が マウスクリックイベントを横取りするかどうかである。将来の仕様で この動作が定義される可能性があるが、この仕様では 実装固有である。
ユーザーインターフェイスイベントのターゲットとなる要素は、 要素の種類、およびスクリプト化されたイベント リスナー、CSS 擬似クラスの一致、イベントベースのタイミングを持つ 宣言的アニメーションなど、明示的に関連付けられた操作を持つかどうかに応じて、 特定の操作動作を持つ場合がある。DOM イベントをディスパッチした後の、 指定されたターゲット要素についてのユーザーインターフェイスイベントの 処理アルゴリズムと順序は次のとおり:
preventDefault()
DOM メソッドを呼び出した場合、この要素についてそれ以上の処理は行わず、
イベントは イベントディスパッチおよび DOM イベントフロー
処理 ([uievents]) に従う;:hover, :active, または :focus のいずれかに一致する場合、
関連するクラス
プロパティを適用する;
状況に応じて、著者は特定のグラフィックス要素が どの条件でポインターイベントの ターゲットになれるかを制御したい場合がある。例えば著者は、 ポインターが指定された図形のストロークされた外周上にある場合にのみ、 指定された要素がポインターイベントを受信するようにしたい場合がある。 その他の場合、著者は指定された要素が あらゆる状況でポインターイベントを無視し、その下にあるグラフィカル 要素がポインターイベントのターゲットになるようにしたい場合がある。
マスキングとクリッピングの効果は、 ポインターイベントに関して異なる。クリッピングパスは 幾何学的境界であり、指定された点は明確にその境界の内側または外側にある。 したがって、クリップされた要素のレンダリング領域上では通常どおり ポインターイベントを捕捉しなければならないが、クリッピングパスの定義で説明されているように、 クリップされた領域上では捕捉してはならない。 対照的に、マスクは二値的な遷移ではなくピクセル操作であり、 完全に透明な場合とほぼ透明だが完全ではない場合で異なる動作にすると、 恣意的で混乱を招く可能性がある。そのため、マスクが適用された要素では、 マスクが不透明度 0 になる領域でも ポインターイベントを引き続き捕捉しなければならない。著者が マスクの透明部分でポインターイベントを下の要素へ通過させる効果を実現したい場合、 マスキングとクリッピングを組み合わせて使用できる。
filter プロパティは ポインターイベント 処理に影響せず、このコンテキストでは filter が指定されていないかのように扱わなければならない。
例えば、stroke が red(すなわち輪郭が単色の赤)で、 fill が none(すなわち 内部は ペイントされない)の円が、fill が blue の矩形の真上にレンダリングされているとする。著者は、 ポインターが円の外周上にある場合にのみ、 円をポインターイベントのターゲットにしたい場合がある。 ポインターが円の内部にある場合、著者は 下にある矩形をポインターイベントのターゲット要素にしたい場合がある。
pointer-events プロパティは、 指定された要素がどのような状況で ポインターイベントのターゲット要素となれるかを指定する。これは 次のものが処理される状況に影響する:
| 名前: | pointer-events |
|---|---|
| 値: | auto | bounding-box | visiblePainted | visibleFill | visibleStroke | visible | painted | fill | stroke | all | none |
| 初期値: | auto |
| 適用対象: | コンテナー要素, グラフィックス要素および ‘use’ |
| 継承: | はい |
| パーセント値: | 該当なし |
| メディア: | 視覚 |
| 計算値: | 指定値のまま |
| アニメーション型: | 離散 |
テキスト要素では、ヒットテストは文字セル単位で行われる:
ラスター画像では、ヒットテストは 画像全体を単位として行われる(すなわち画像の矩形領域が、 画像がイベントを受信するかどうかの 判断基準となる):
‘foreignObject’ 要素では、ヒットテストは 要素の矩形 領域、すなわち オブジェクト境界ボックスに対して行われる。上記のラスター 画像についての処理を参照すること。ユーザーエージェントは ‘foreignObject’ 要素の 外部コンテンツもヒットテストのターゲットにできるようにしてよい。
opacity, fill-opacity, stroke-opacity, fill および stroke プロパティの値はイベント処理に影響しない。
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">最初の項目</button> <button id="C" tabindex="2">3 番目の項目</button> <svg width="200" height="200"> <text id="B" tabindex="1" x="100" y="100">2 番目の項目</text> </svg>
SVG 要素には HTML の accesskey 属性に相当するものがないことに注意すること。
ユーザーエージェントがサポートするすべての イベント型について、 SVG はそれをイベント属性としてサポートし、イベント ハンドラーコンテンツ属性 [HTML] と同じ要件に従う。 イベント属性はすべての SVG 要素で利用できる。
イベント属性の内容は常に ECMAScript として解釈され、 メディア型 'application/ecmascript' で処理されたかのように扱われる。 [rfc2046][rfc4329]
イベント属性は アニメーション可能ではない。
実装者は、イベント属性の設定を、
EventTarget 上での EventListener
の作成および登録とみなしてよい。
このようなイベントリスナーは、
addEventListener の useCapture 引数に false が指定されたかのように、
「bubbling」および「at target」フェーズでのみ呼び出される。
この EventListener
は、EventTarget 上に登録される
その他のものと同じ方法で動作する。
イベントリスナーを表す属性が変更された場合、 これは以前登録された EventListener の削除と、 新しいものの登録とみなしてよい。さらに、 他の EventListener に対してイベント属性が イベントを受け取る順序については規定しない EventTarget。
ECMAScript でイベントリスナーを確立する方法の 1 つは、
関数を定義し、その関数を 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 | (下記参照) | (none) | いいえ |
| 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’ 要素内で定義された関数は、 現在の 文書全体にわたって「global」スコープを持つ。
スクリプトのテキストコンテンツが直接レンダリングされることはない。 ‘script’ 要素の display 値は、 ユーザーエージェントスタイルシートによって 常に none に設定しなければならず、 この宣言はその他のどの CSS 規則またはプレゼンテーション属性よりも優先されなければならない。
‘script’ 要素の実行を試みる前に、‘type’ の解決済みメディア型値を調べなければならない。 SVG ユーザーエージェントがそのスクリプト言語をサポートしない場合、 ‘script’ 要素を 実行してはならない。
この例では関数
circle_click を定義し、
‘circle’ 要素上の
‘onclick’
イベント属性から呼び出す。
下の左側の図は初期画像である。下の右側の図は
円をクリックした後の結果を示す。
<?xml version="1.0" standalone="no"?>
<svg width="6cm" height="5cm" viewBox="0 0 600 500"
xmlns="http://www.w3.org/2000/svg">
<desc>script01 の例 - onclick イベントから ECMAScript 関数を呼び出す
</desc>
<!-- クリックするたびに半径を変更する ECMAScript -->
<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>
<!-- 描画領域の輪郭を青い線で示す -->
<rect x="1" y="1" width="598" height="498" fill="none" stroke="blue"/>
<!-- 各 click イベントに応答する -->
<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">
円をクリックしてサイズを変更
</text>
</svg>
|
属性定義:
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| crossorigin | [ anonymous | use-credentials ]? | (属性の HTML 定義を参照) | はい |
crossorigin 属性は CORS 設定属性であり、特に指定されない限り html [HTML] と同じ処理規則に従う。
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| type | (下記参照) | application/ecmascript | いいえ |
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| href | URL [URL] | (none) | いいえ |
URL は処理され、リソースは リンクの章で説明されているとおり取得される。
SVGScriptElement オブジェクトは DOM 内の ‘script’ 要素を 表す。
[Exposed=Window] interface SVGScriptElement : SVGElement { [Reflect] attribute DOMString type; attribute DOMString? crossOrigin; }; SVGScriptElement includes SVGURIReference;
crossOrigin IDL 属性は ‘crossorigin’ コンテンツ 属性を反映する。
インターネット上では、リソースは URL (国際化リソース識別子)を使用して識別される。例えば、 http://example.com にある someDrawing.svg という SVG ファイルは、 次の URL を持つ場合がある:
http://example.com/someDrawing.svg
URL は、URL フラグメント 識別子を URL の一部として含めることで、XML 文書内の 特定の要素を指すこともできる。URL フラグメント識別子を含む URL は、任意の基底 URL、それに続く "#" 文字、 さらに URL フラグメント識別子からなる。例えば、 次の URL を使用して、someDrawing.svg ファイル内で ID が "Lamppost" の要素を指定できる:
http://example.com/someDrawing.svg#Lamppost
次のいずれかは無効な参照である:
無効な参照はエラーである場合も、そうでない場合もある (エラー処理を参照)。 これは、参照元のプロパティまたは属性がフォールバック動作を定義しているかどうかに依存する。
国際化リソース識別子(URL)は、 Uniform Resource Identifier(URI)をより一般化した 補完物である。URL は、 Universal Character Set [UNICODE] の文字列である。 URI は、はるかに制限された文字集合から構成される。すべての URI は すでに適合する URL である。URL から URI への対応付けは URL 仕様で定義されており、これは、 リソースを識別するため XML 文書内で URI の代わりに URL を使用できることを意味する。 プロトコルが URL を 直接サポートしない場合、ネットワーク上での解決のために URL を URI へ変換できる。
SVG の以前のバージョンでは、XLink に従い、URL 参照型を URI または特定のエスケープ手順を適用した後に URL となる必要がある 文字列として定義していた。このエスケープ手順は XLink 1.0 仕様 [xlink] および W3C XML Schema Part 2: Datatypes 仕様 [xmlschema-2] にも繰り返し記載された。 この複製により誤りや不一致の可能性が生じたが、 当時 URL 仕様がまだ標準化されていなかったため行われた。
この仕様では、この「URI または文字列と アルゴリズム」に対して正しい用語 URL を使用し、 URL を URI に変換するエスケープ方式は URL 仕様 [rfc3987] を参照して定義する。 この仕様はその後 IETF Proposed Standard となった。その他の W3C 仕様も、 このエスケープ手順の重複した説明を削除し、 URL を直接参照するよう、時間の経過とともに改訂されることが期待される。
SVG では、2 つの要素間のほとんどの構造的関係は、 ‘href’ 属性内の URL 値を使用して指定される。
リンク関係を記述するため、 この仕様は属性値およびプロパティ値で 2 つの異なるデータ型を使用する: URL と <url>。 この章のリンク指針は、どちらの構文で指定された URL にも適用される。
URL データ型は単純な URL 文字列である。 SVG では、2 つの要素間のほとんどの構造的関係は、 ‘href’ 属性内の URL 値を使用して指定される。
<url> は URL とは異なり、CSS url() 関数値を表す。
(詳細については CSS Values and Units を参照 [css-values])。<url> は、
プレゼンテーション属性および対応する
CSS プロパティで使用できる
[css-values]。
URL は、構造的 関係の目的で プレゼンテーション属性に使用できる有効な値ではない。 プレゼンテーション属性ではない属性で <url> を値として許可するものはない。
SVG は、他のオブジェクトへの絶対および 相対の URL 参照を広範に使用する。 例えば、‘linearGradient’ 要素は 別のグラデーション要素を基にすることができ、 2 つの間の差異だけを指定すればよいように、 ‘href’ 属性の URL で 元のグラデーションを参照できる:
<linearGradient id="SourceGradient">...</linearGradient>
<linearGradient id="MyGradient"
href="#SourceGradient">...</linearGradient>
そのグラデーションで矩形を塗るには、 関連する ‘linearGradient’ 要素への URL 参照を含むように、矩形の fill プロパティの値を 設定できる。 例を次に示す:
<rect fill="url(#MyGradient)"/>
URL 参照は通常、 ‘href’ 属性で指定される。 この属性の値は、目的のリソース (フラグメント識別子がある場合は副次リソース)への参照を形成する。 ‘href’ 属性の値は URL でなければならない。
値が URL 参照であることを アプリケーションが検査するのは現実的でないため、この仕様はこの点について URL 仕様 に従い、 SVG オーサリングツールにそのような適合性検査 要件を課さない。 無効な URL によって SVG 文書が不適合になることはない。 SVG ユーザーエージェントは、 URL 参照の処理で指定されているように、 必要な場合にのみ URL を処理することを要求される。
SVG の以前のバージョンでは、‘href’ 属性は XLink 名前空間 [xlink] 内で指定されていた。 この使用法は現在非推奨であり、代わりに URL 参照は 名前空間なしの ‘href’ 属性を使用して 指定すべきである。
後方互換性のため、非推奨の ‘xlink:href’ 属性を、 同じく非推奨となった ‘xlink:title’ 属性とともに 以下で定義する。
属性定義:
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| xlink:href | URL [URL] | (none) | (下記参照) |
後方互換性のため、‘href’ 属性を持つ要素は、 XLink 名前空間 [xlink] 内の ‘href’ 属性も認識する。
‘href’ 属性が XLink 名前空間内と名前空間なしの両方に存在する場合、 名前空間なしの属性の値を使用しなければならない。 XLink 名前空間内の属性は無視しなければならない。
適合 SVG ジェネレーターは、 名前空間なしの ‘href’ 属性を生成しなければならない。 ただし、後方互換性を提供するために XLink 名前空間内の ‘href’ 属性も併せて生成してよい。
この属性は、対応する ‘href’ 属性が アニメーション可能と定義されている場合に限り、 アニメーション可能である。
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| xlink:title | <anything> | (none) | いいえ |
リンクまたはリソースの意味を 人間が読める形式で説明するための非推奨属性。 新しいコンテンツでは ‘title’ 子要素を 使用し、 ‘xlink:title’ 属性を使用すべきではない。
この情報の用途は、行われる処理の種類に大きく依存する。 例えば、視覚障害のあるユーザーが使用するアプリケーションで タイトルを利用可能にしたり、 リンク一覧を作成したり、ユーザーがマウスポインターを 開始リソース上に置いたときに表示される ヘルプテキストを提示したりするために使用できる。
‘title’ 属性を使用する場合、 XLink 名前空間内になければならない。 XML Linking Language (XLink) [xlink] を参照すること。
非推奨の XLink 属性 ‘xlink:href’ または ‘xlink:title’ を 使用する場合、明示的な XLink 名前空間宣言を指定しなければならない [xml-names]。 そのような XLink 名前空間宣言を指定する簡単な方法の 1 つは、 XLink 属性を使用するコンテンツについて、‘svg’ 要素上に XLink 名前空間用の ‘xmlns’ 属性を含めることである。例えば:
<svg xmlns:xlink="http://www.w3.org/1999/xlink" ...> <image xlink:href="foo.png" .../> </svg>
URL は、必要になった時点で次のようにリソースを識別するために処理される:
旧来の ‘xlink:href’ 属性は、 対応する ‘href’ 属性が処理される時点で処理されるが、 そのような ‘href’ 属性が要素上に存在しない場合に限る。
URL の処理には 3 つの手順がある: 絶対 URL の生成; 文書の取得(必要な場合); ターゲット要素の識別(必要な場合)。
URL 参照は、処理の結果が 無効な参照になるか、 ターゲットリソースが識別されるまで 未解決である。 構造的外部要素の プレゼンテーション属性ではない属性にある未解決の参照は、load イベントの発火を妨げる。 ユーザーエージェントは 同一文書 URL 参照ではない参照の 解決に時間制限を設けてもよく、その時間を超えた参照はネットワークエラーとして (したがって 無効な参照として)扱われる。
動的文書内の 同一文書 URL 参照では、 属性またはプロパティの変更やアニメーション、 または DOM からの要素の削除によって、 URL 参照が 未解決 状態へ戻る場合がある。 ユーザーエージェントは、参照されるリソースを識別するため URI の解決を再び試みなければならない。
URL 参照が相対参照の場合、 使用前にその絶対形式を計算しなければならない。 絶対 URL は、次のいずれかの方法で生成すべきである:
‘xml:base’
属性は
XML 文書でのみ効果を持つ。
これには SVG 文書と XHTML 文書が含まれるが、XML ではない HTML 文書は含まれない。
対照的に、base
要素は、
文書基底
URLを変更することで、
任意の SVG または HTML 文書内の相対 URL に影響する。
HTTP などのプロトコルが URL を直接サポートしない場合、 URL 仕様 [rfc3987] の 3.1 節で説明されるように、 ユーザーエージェントは URL を URI へ変換しなければならない。
絶対 URL を生成した後:
URL がリンクのアクティブ化に続いて処理されている場合、 ユーザーエージェントは HTML 仕様 [HTML] で説明される URL へ移動する アルゴリズムに従わなければならない。 このアルゴリズムの結果は、 ‘target’ の閲覧コンテキスト、 閲覧コンテキスト間のセキュリティ制限、 およびリンクがその閲覧コンテキストに現在含まれる文書と同じ文書へのものかどうか (この場合、文書を再読み込みせずにフラグメントへ移動する) に応じて異なる。 移動先の文書が SVG 文書である場合、 SVG コンテンツへのリンクで説明されるようにターゲット動作を調整する。
処理中の URL が完全な文書ファイルを参照する場合にのみ 有効となる場合 (例えば ‘image’ および ‘script’ 要素の ‘href’ 属性)、 URL が同一文書へのものかどうかに関係なく、 文書の取得で示すように処理を続ける。
その他すべての場合、URL はこの SVG 文書で使用されるリソースへのものである。 ユーザーエージェントは URL を構文解析して ターゲットフラグメントを URL の残りから分離し、 文書基底 URL と比較しなければならない。 ターゲットフラグメント以外のすべての部分が等しい場合、 これは 同一文書 URL 参照であり、 URL の処理は、現在の文書を参照先文書として ターゲット要素の識別で示すように続けなければならない。
それ以外の場合、URL は別の文書を参照し、 ユーザーエージェントは 文書の取得で示すように URL の処理を続けなければならない。
CSS Values and Units で定義されるように、 スタイルプロパティ内のフラグメントのみの URL は、 そのプロパティが宣言されたファイルに関係なく 同一文書 URL 参照として扱わなければならない。
SVG のプロパティと属性は他の文書を参照する場合がある。 そのような URL を処理するとき、 ユーザーエージェントは次の条件を除き、 この節で説明するように参照先文書を取得すべきである:
URL 参照が SVG アニメーション 要素の href 属性からのものである場合、 同一文書 URL 参照のみが許可される [svg-animation]。 異なる文書を参照する URL は無効であり、 文書を取得してはならない。
参照を含む文書が セキュア静的モードまたは セキュアアニメーションモードで処理されている場合、 外部ファイル参照は許可されない。 参照が data URL でない限り、 ユーザーエージェントはその参照をネットワークエラーが発生したかのように扱い、 無効な参照としなければならない。
閲覧コンテキストまたはユーザーエージェント上のその他のセキュリティ制限によって 外部ファイルへのアクセスが妨げられる場合、 ユーザーエージェントはその参照をネットワークエラーが発生したかのように扱わなければならない。
インターネットから外部リソースを取得するとき、 ユーザーエージェントは HTML [HTML] で定義される 潜在的に CORS 対応のリクエストを、 corsAttributeState を次のようにして使用しなければならない:
base
リクエストの origin は
HTML と同じ規則を使用して計算される。
SVG ‘script’ 要素は
HTML
script 要素のように扱い、
SVG ‘image’
要素は HTML img 要素のように扱う。
default origin behaviour は taint に設定しなければならない。
将来の SVG 仕様では、 ‘href’ 属性を持つその他の SVG 要素でも CORS 参照を有効にする可能性がある。
取得アルゴリズムがエラーまたは空のレスポンス本文を返す場合、 参照 URL は 無効な参照として扱われる。
有効なレスポンスが返され、 参照の 有効な URL ターゲットに 特定の要素型が含まれる場合、 ユーザーエージェントは サブリソース文書の処理へ進まなければならない。 それ以外の場合(文書全体への URL 参照のみが有効な場合)、 取得した文書が参照されるリソースとなる。
それ以外の場合、ターゲット要素を識別するためにサブリソースを構文解析しなければならない。 取得した文書が、ユーザーエージェントが文書オブジェクトモデルを作成するため 構文解析できる型である場合、 セキュア静的モードで処理しなければならない (すなわち追加の外部リソースを取得せず、 スクリプトを実行せず、アニメーションを再生しない)。 外部サブリソース参照のために生成された文書モデルは、 不変(読み取り専用)でなければならず、変更できない。
取得したファイルから文書オブジェクトモデルを生成できる場合、 URL の処理は、構文解析したサブリソース文書を参照先文書として ターゲット要素の識別で示すように 続けなければならない。 ユーザーエージェントは、文書の構文解析が完全に終了する前に ターゲット識別処理を開始してよい。
ユーザーエージェントは、外部リソース URL と それに対応する構文解析済み文書の一覧を保持し、 リソースに対する処理モード、 キャッシュ、および CORS 要件に違反しない限り、 後続の参照で文書を再利用してよい。
特定の要素への URL 参照では、 参照が有効かどうかは、 参照先文書内でその要素を見つけられるか、 および許可された型であるかに依存する。
前の処理手順で識別された参照先文書 (外部サブリソース文書または現在の文書)を使用し、 ターゲット要素を次のように識別する:
URL がターゲットフラグメント内の特定の要素を指定していない場合、 ターゲット要素は参照先文書のルート要素である。
それ以外の場合、URL は特定の要素を対象とする。 一致する要素が現在参照先文書に存在する場合、 それがターゲット要素となる。
それ以外の場合、現在一致する要素はない。 参照先文書が不変である場合、 URL 参照は 無効である。 外部サブリソース文書は完全に構文解析された後は常に不変である。 現在の文書も、 動的インタラクティブモード以外の モードで処理されている場合、構文解析後は不変である。
それ以外の場合、URL を正常に解決して ターゲット要素を定義できるようになるか、 文書が不変になるまで (例えば非動的文書の構文解析が完了するまで)、 参照先文書への変更を監視する。
ターゲット要素は、その参照に対する 有効な URL ターゲットである場合に限り、 参照されるリソースを提供する。
‘href’(または ‘xlink:href’)属性の有効なターゲット要素型は、 次のように属性を持つ要素に基づく:
この仕様で定義されるスタイルプロパティの有効なターゲット要素型は次のとおり:
ターゲット要素への参照または画像ファイルへの参照のいずれかを許可する参照 (例えば mask プロパティ)では、 ユーザーエージェントはターゲット要素を識別し、それが有効なターゲットかどうか判断しなければならない。 解決されたターゲット要素が許可された要素型でない場合、 参照されるリソースは文書ファイル全体となる。 ターゲットフラグメントは、その他の画像と同様、そのファイルの処理に使用される。
その他すべての場合、解決されたターゲット要素型(または文書型)が URL 参照に対して許可されない場合、 それは 無効な参照である。
SVG はリンク(ハイパーリンクまたはWeb リンクとも呼ばれる)を示すための ‘a’ 要素を提供する。 ‘a’ 要素は、 ‘href’ または ‘xlink:href’ 属性を持つ場合にリンクを形成する。これらの属性がない場合、‘a’ 要素はリンクの非アクティブなプレースホルダーである。
SVG 1.1 は XLink 仕様([XLink])に基づいてリンクを定義し、 XLink 名前空間で定義された属性を使用していた。 SVG 2 は HTML のリンクと整合する既定の名前空間内の代替属性セットを使用し、 XLink 属性を非推奨とする。
‘a’ 要素は、 別の ‘a’ 要素を除き、 その親が含むことのできる任意の要素を含めることができる。 同じ要素がグラフィカルおよびテキストのリンクコンテンツの両方に使用される。 リンクは入れ子にできない。 ‘a’ 要素が 別のハイパーリンク要素 (SVG 名前空間内か別の名前空間内かを問わず)の子孫である場合、 ユーザーエージェントはその href 属性を無視し、非アクティブとして扱わなければならない。 無効な ‘a’ 要素も 汎用コンテナー要素としてレンダリングしなければならない。
無効な 入れ子リンクのレンダリングはリスクがあり、不明な要素の レンダリングに関する決定と同期される可能性が高い。
ポインターイベント処理では、 個別にレンダリングされる各要素について、それぞれリンクされたヒット領域が ‘a’ 要素内で定義され (それぞれの pointer-events プロパティの値に従う)、 ‘a’ 要素自身の境界ボックスに対しては定義されない。 ユーザーエージェントは、すべてのリンクが フォーカス可能であり、 キーボードコマンドでアクティブ化できることも保証しなければならない。
リモートリソース(リンク先)は、 ‘a’ 要素上の ‘href’ 属性で指定される URL によって定義される。 リモートリソースは任意の Web リソース (例えば画像、動画クリップ、音声、プログラム、別の SVG 文書、HTML 文書、 現在の文書内の要素、別の文書内の要素など)でよい。 ユーザーによるリンクのアクティブ化 (マウスクリック、キーボード入力、音声コマンドなど)への応答として、 ユーザーエージェントは指定されたリソース文書の取得を試み、 表示するか、ダウンロードされるファイルとして利用可能にすべきである。
link01 の例では、 楕円にリンクを割り当てる。
<?xml version="1.0" standalone="no"?>
<svg width="5cm" height="3cm" viewBox="0 0 5 3" version="1.1"
xmlns="http://www.w3.org/2000/svg">
<desc>link01 の例 - 楕円上のリンク
</desc>
<rect x=".01" y=".01" width="4.98" height="2.98"
fill="none" stroke="blue" stroke-width=".03"/>
<a href="https://www.w3.org">
<ellipse cx="2.5" cy="1.5" rx="2" ry="1"
fill="red" />
</a>
</svg>
link01 の例
上記の SVG ファイルを SVG と HTML の両方をサポートする ユーザーエージェントで表示した場合、楕円をクリックすると 現在のウィンドウまたはフレームが W3C ホームページに置き換えられる。
属性定義:
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| href | URL [URL] | (none) | はい |
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| target | _self | _parent | _top | _blank | <XML-Name> | _self | はい |
この属性は、親文書が HTML または XHTML 文書内に埋め込まれている場合や、タブ付きブラウザーで表示される場合など、 終端リソースに複数のターゲット候補がある場合に使用すべきである。この属性は、 リンクがアクティブ化されたときに文書を開く 閲覧コンテキスト (例えばブラウザータブ、(X)HTML iframe または object 要素)の名前を指定する:
閲覧コンテキストおよび閲覧コンテキスト間の移動操作に対する セキュリティ制限の規範的定義は HTML [HTML]、 特に Web ページの 読み込みに関する章である。
SVG の以前のバージョンでは、特殊な target 値 '_replace' を定義していた。これは十分に実装されたことがなく、 '_replace' と '_self' の区別は、 HTML における閲覧コンテキストの定義変更により不要となった。 現在の SVG 文書を置き換えるには '_self' を使用すること。
'_new' の値は target の 正当な値ではない。新しいタブ/ウィンドウで文書を開くには '_blank' を使用すること。
| 名前 | 値 | 初期値 | アニメーション可能 |
|---|---|---|---|
| download | 任意の値(空でない場合、その値は推奨ファイル名を表す) | (none) | いいえ |
| ping | 空白区切りの有効な空でない URL トークン [HTML] | (none) | いいえ |
| rel | 空白区切りのキーワードトークン [HTML] | (none) | いいえ |
| hreflang | BCP 47 言語タグ文字列 [HTML] | (none) | いいえ |
| type | MIME 型文字列 [HTML] | (none) | いいえ |
| referrerpolicy | リファラーポリシー文字列 [REFERRERPOLICY] | (none) | いいえ |
a 要素について定義されるとおりである。
SVG Working Group は、HTML 仕様がこれらの属性の処理モデルと アルゴリズムを明確化するのを待っている。 属性は HTML 仕様で指定される 定義とアルゴリズムに従うべきである。
継続中の明確化作業の詳細については、SVG コンテンツはしばしば何らかの絵や図面を 表すため、文書の特定のビューへ リンクする必要がよくある。ここでビューとは、 文書の特定部分を拡大表示するための 初期変換を示す。
| SVG 2 要件: | フラグメント識別子のリンク走査に関する SVG 1.1 SE のテキストと SVG Tiny 1.2 のテキストを統合し、 メディアフラグメントを追加する。 |
|---|---|
| 決議: | SVG 2 はメディアフラグメント 識別子を持つ。 |
| 目的: | Media Fragments URI と整合させるため。 |
| 担当者: | Cyril (ACTION-3442) |
SVG 文書の特定のビューへリンクするには、 フラグメント 識別子付き URL 参照が、正しい形式の SVG フラグメント識別子である必要がある。SVG フラグメント識別子は、 MIME メディア型 "image/svg+xml" のリソースを 特定する URL の「selector」または「fragment identifier」部分の意味を定義する。
SVG フラグメント識別子は次の形式を取ることができる:
SVG フラグメント識別子は次のように定義される:
SVGFragmentIdentifier ::= BareName *( "&" timesegment ) | SVGViewSpec *( "&" timesegment ) | spacesegment *( "&" timesegment ) | timesegment *( "&" spacesegment ) BareName ::= XML_Name SVGViewSpec ::= 'svgView(' SVGViewAttributes ')' SVGViewAttributes ::= SVGViewAttribute | SVGViewAttribute ';' SVGViewAttributes SVGViewAttribute ::= viewBoxSpec | preserveAspectRatioSpec | transformSpec viewBoxSpec ::= 'viewBox(' ViewBoxParams ')' preserveAspectRatioSpec = 'preserveAspectRatio(' AspectParams ')' transformSpec ::= 'transform(' TransformParams ')'
ここで:
SVG view box パラメーターは、 CSS Transforms 仕様で定義される順序で適用される (例えば SVG ビューは最初に ViewBoxParams で定義されるように 変換され、その後 TransformParams で定義されるように変換される)。
フラグメント指定では空白を使用できる。SVG ビュー指定内の数値を区切るには コンマを使用し (例えば #svgView(viewBox(0,0,200,200)))、 属性を区切るにはセミコロンを使用する(例えば #svgView(viewBox(0,0,200,200);preserveAspectRatio(none)))。
フラグメント識別子は、 CSS Object Model (CSSOM) 仕様で定義される規則に従って URL エスケープできる。 例えば、セミコロンは %3B としてエスケープでき、 (セミコロン区切りの)URL リストをアニメーションできる。そうしないとセミコロンは リスト区切りとして解釈される。
4 種類の SVGViewAttribute は 任意の順序で現れてよいが、正しい形式の SVGViewSpec では各型は最大 1 回しか現れてはならない。
元文書が SVG 文書へリンクするとき、例えば HTML アンカー要素 ([HTML]、すなわち HTML の <a href=...> 要素)または XLink 仕様 [xlink] を介してリンクする場合、 SVG フラグメント識別子は SVG 文書の初期ビューを 次のように指定する:
‘view’ 要素は次のように定義される:
viewTarget 属性を削除することを決議した。
決議: Paris 2015 F2F Day 3。
担当者: BogdanBrinza。
SVGElement オブジェクトは、DOM 内の ‘a’ 要素を表す。
[Exposed=Window] interface SVGAElement : SVGGraphicsElement { [Reflect, SameObject] readonly attribute SVGAnimatedString target; [Reflect] attribute DOMString download; [Reflect] attribute USVString ping; [Reflect] attribute DOMString rel; [Reflect="rel", SameObject, PutForwards=value] readonly attribute DOMTokenList relList; [Reflect] attribute DOMString hreflang; [Reflect] attribute DOMString type; attribute DOMString referrerPolicy; }; SVGAElement includes SVGURIReference; SVGAElement includes HyperlinkElementUtils;
URL を設定する SVGAElement のアルゴリズム:
href を更新するには、SVGAElement について:
referrerPolicy IDL 属性は、 ‘referrerpolicy’ コンテンツ 属性を反映し、 既知の値のみに 制限される。
SVGViewElement オブジェクトは、 DOM 内の ‘view’ 要素を 表す。
[Exposed=Window] interface SVGViewElement : SVGElement {}; SVGViewElement includes SVGFitToViewBox;
この付録は規範的である。
この付録には、SVG 文書オブジェクト モデル定義の完全な Web IDL が含まれる。
[Exposed=Window] interface SVGElement : Element { [SameObject] readonly attribute SVGAnimatedString className; readonly attribute SVGSVGElement? ownerSVGElement; readonly attribute SVGElement? viewportElement; }; SVGElement includes GlobalEventHandlers; SVGElement includes HTMLOrSVGOrMathMLElement; dictionary SVGBoundingBoxOptions { boolean fill = true; boolean stroke = false; boolean markers = false; boolean clipped = false; }; [Exposed=Window] interface SVGGraphicsElement : SVGElement { [SameObject] readonly attribute SVGAnimatedTransformList transform; SVGRect getBBox(optional SVGBoundingBoxOptions options = {}); SVGMatrix? getCTM(); SVGMatrix? getScreenCTM(); }; SVGGraphicsElement includes SVGTests; [Exposed=Window] interface SVGGeometryElement : SVGGraphicsElement { [SameObject] readonly attribute SVGAnimatedNumber pathLength; boolean isPointInFill(optional DOMPointInit point = {}); boolean isPointInStroke(optional DOMPointInit point = {}); float getTotalLength(); SVGPoint getPointAtLength(float distance); }; [Exposed=Window] interface SVGNumber { attribute float value; }; [Exposed=Window] interface SVGLength { // 長さ単位型 const unsigned short SVG_LENGTHTYPE_UNKNOWN = 0; const unsigned short SVG_LENGTHTYPE_NUMBER = 1; const unsigned short SVG_LENGTHTYPE_PERCENTAGE = 2; const unsigned short SVG_LENGTHTYPE_EMS = 3; const unsigned short SVG_LENGTHTYPE_EXS = 4; const unsigned short SVG_LENGTHTYPE_PX = 5; const unsigned short SVG_LENGTHTYPE_CM = 6; const unsigned short SVG_LENGTHTYPE_MM = 7; const unsigned short SVG_LENGTHTYPE_IN = 8; const unsigned short SVG_LENGTHTYPE_PT = 9; const unsigned short SVG_LENGTHTYPE_PC = 10; readonly attribute unsigned short unitType; attribute float value; attribute float valueInSpecifiedUnits; attribute DOMString valueAsString; undefined newValueSpecifiedUnits(unsigned short unitType, float valueInSpecifiedUnits); undefined convertToSpecifiedUnits(unsigned short unitType); }; [Exposed=Window] interface SVGAngle { // 角度単位型 const unsigned short SVG_ANGLETYPE_UNKNOWN = 0; const unsigned short SVG_ANGLETYPE_UNSPECIFIED = 1; const unsigned short SVG_ANGLETYPE_DEG = 2; const unsigned short SVG_ANGLETYPE_RAD = 3; const unsigned short SVG_ANGLETYPE_GRAD = 4; readonly attribute unsigned short unitType; attribute float value; attribute float valueInSpecifiedUnits; attribute DOMString valueAsString; undefined newValueSpecifiedUnits(unsigned short unitType, float valueInSpecifiedUnits); undefined convertToSpecifiedUnits(unsigned short unitType); }; [Exposed=Window] interface SVGNumberList { readonly attribute unsigned long length; readonly attribute unsigned long numberOfItems; undefined clear(); SVGNumber initialize(SVGNumber newItem); getter SVGNumber getItem(unsigned long index); SVGNumber insertItemBefore(SVGNumber newItem, unsigned long index); SVGNumber replaceItem(SVGNumber newItem, unsigned long index); SVGNumber removeItem(unsigned long index); SVGNumber appendItem(SVGNumber newItem); setter undefined (unsigned long index, SVGNumber newItem); }; [Exposed=Window] interface SVGLengthList { readonly attribute unsigned long length; readonly attribute unsigned long numberOfItems; undefined clear(); SVGLength initialize(SVGLength newItem); getter SVGLength getItem(unsigned long index); SVGLength insertItemBefore(SVGLength newItem, unsigned long index); SVGLength replaceItem(SVGLength newItem, unsigned long index); SVGLength removeItem(unsigned long index); SVGLength appendItem(SVGLength newItem); setter undefined (unsigned long index, SVGLength newItem); }; [Exposed=Window] interface SVGStringList { readonly attribute unsigned long length; readonly attribute unsigned long numberOfItems; undefined clear(); DOMString initialize(DOMString newItem); getter DOMString getItem(unsigned long index); DOMString insertItemBefore(DOMString newItem, unsigned long index); DOMString replaceItem(DOMString newItem, unsigned long index); DOMString removeItem(unsigned long index); DOMString appendItem(DOMString newItem); setter undefined (unsigned long index, DOMString newItem); }; [Exposed=Window] interface SVGAnimatedBoolean { attribute boolean baseVal; readonly attribute boolean animVal; }; [Exposed=Window] interface SVGAnimatedEnumeration { attribute unsigned short baseVal; readonly attribute unsigned short animVal; }; [Exposed=Window] interface SVGAnimatedInteger { attribute long baseVal; readonly attribute long animVal; }; [Exposed=Window] interface SVGAnimatedNumber { attribute float baseVal; readonly attribute float animVal; }; [Exposed=Window] interface SVGAnimatedLength { [SameObject] readonly attribute SVGLength baseVal; [SameObject] readonly attribute SVGLength animVal; }; [Exposed=Window] interface SVGAnimatedAngle { [SameObject] readonly attribute SVGAngle baseVal; [SameObject] readonly attribute SVGAngle animVal; }; [Exposed=Window] interface SVGAnimatedString { attribute (DOMString or TrustedScriptURL) baseVal; readonly attribute DOMString animVal; }; [Exposed=Window] interface SVGAnimatedRect { [SameObject] readonly attribute SVGRect baseVal; [SameObject] readonly attribute SVGRect animVal; }; [Exposed=Window] interface SVGAnimatedNumberList { [SameObject] readonly attribute SVGNumberList baseVal; [SameObject] readonly attribute SVGNumberList animVal; }; [Exposed=Window] interface SVGAnimatedLengthList { [SameObject] readonly attribute SVGLengthList baseVal; [SameObject] readonly attribute SVGLengthList animVal; }; [Exposed=Window] interface SVGUnitTypes { // 単位型 const unsigned short SVG_UNIT_TYPE_UNKNOWN = 0; const unsigned short SVG_UNIT_TYPE_USERSPACEONUSE = 1; const unsigned short SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2; }; interface mixin SVGTests { [SameObject] readonly attribute SVGStringList requiredExtensions; [SameObject] readonly attribute SVGStringList systemLanguage; }; interface mixin SVGFitToViewBox { [SameObject] readonly attribute SVGAnimatedRect viewBox; [SameObject] readonly attribute SVGAnimatedPreserveAspectRatio preserveAspectRatio; }; interface mixin SVGURIReference { [SameObject] readonly attribute SVGAnimatedString href; }; partial interface Document { readonly attribute SVGSVGElement? rootElement; }; [Exposed=Window] interface SVGSVGElement : SVGGraphicsElement { [SameObject] readonly attribute SVGAnimatedLength x; [SameObject] readonly attribute SVGAnimatedLength y; [SameObject] readonly attribute SVGAnimatedLength width; [SameObject] readonly attribute SVGAnimatedLength height; attribute float currentScale; [SameObject] readonly attribute SVGPoint currentTranslate; NodeList getIntersectionList(SVGRect rect, SVGElement? referenceElement); NodeList getEnclosureList(SVGRect rect, SVGElement? referenceElement); boolean checkIntersection(SVGElement element, SVGRect rect); boolean checkEnclosure(SVGElement element, SVGRect rect); undefined deselectAll(); [NewObject] SVGNumber createSVGNumber(); [NewObject] SVGLength createSVGLength(); [NewObject] SVGAngle createSVGAngle(); [NewObject] SVGPoint createSVGPoint(); [NewObject] SVGMatrix createSVGMatrix(); [NewObject] SVGRect createSVGRect(); [NewObject] SVGTransform createSVGTransform(); [NewObject] SVGTransform createSVGTransformFromMatrix(optional DOMMatrix2DInit matrix = {}); Element? getElementById(DOMString elementId); // 呼び出しても効果のない非推奨メソッド、 // ただし互換性のため保持されている。 unsigned long suspendRedraw(unsigned long maxWaitMilliseconds); undefined unsuspendRedraw(unsigned long suspendHandleID); undefined unsuspendRedrawAll(); undefined forceRedraw(); }; SVGSVGElement includes SVGFitToViewBox; SVGSVGElement includes WindowEventHandlers; [Exposed=Window] interface SVGGElement : SVGGraphicsElement { }; [Exposed=Window] interface SVGDefsElement : SVGGraphicsElement { }; [Exposed=Window] interface SVGDescElement : SVGElement { }; [Exposed=Window] interface SVGMetadataElement : SVGElement { }; [Exposed=Window] interface SVGTitleElement : SVGElement { }; [Exposed=Window] interface SVGSymbolElement : SVGGraphicsElement { }; SVGSymbolElement includes SVGFitToViewBox; [Exposed=Window] interface SVGUseElement : SVGGraphicsElement { [SameObject] readonly attribute SVGAnimatedLength x; [SameObject] readonly attribute SVGAnimatedLength y; [SameObject] readonly attribute SVGAnimatedLength width; [SameObject] readonly attribute SVGAnimatedLength height; }; SVGUseElement includes SVGURIReference; [Exposed=Window] interface SVGUseElementShadowRoot : ShadowRoot { }; [Exposed=Window] interface ShadowAnimation : Animation { constructor(Animation source, (Element or CSSPseudoElement) newTarget); [SameObject] readonly attribute Animation sourceAnimation; }; [Exposed=Window] interface SVGSwitchElement : SVGGraphicsElement { }; interface mixin GetSVGDocument { Document getSVGDocument(); }; [Exposed=Window] interface SVGStyleElement : SVGElement { [Reflect] attribute DOMString type; [Reflect] attribute DOMString media; [Reflect] attribute DOMString title; attribute boolean disabled; }; SVGStyleElement includes LinkStyle; [Exposed=Window] interface SVGTransform { // 変換型 const unsigned short SVG_TRANSFORM_UNKNOWN = 0; const unsigned short SVG_TRANSFORM_MATRIX = 1; const unsigned short SVG_TRANSFORM_TRANSLATE = 2; const unsigned short SVG_TRANSFORM_SCALE = 3; const unsigned short SVG_TRANSFORM_ROTATE = 4; const unsigned short SVG_TRANSFORM_SKEWX = 5; const unsigned short SVG_TRANSFORM_SKEWY = 6; readonly attribute unsigned short type; [SameObject] readonly attribute SVGMatrix matrix; readonly attribute float angle; undefined setMatrix(optional DOMMatrix2DInit matrix = {}); undefined setTranslate(float tx, float ty); undefined setScale(float sx, float sy); undefined setRotate(float angle, float cx, float cy); undefined setSkewX(float angle); undefined setSkewY(float angle); }; [Exposed=Window] interface SVGTransformList { readonly attribute unsigned long length; readonly attribute unsigned long numberOfItems; undefined clear(); SVGTransform initialize(SVGTransform newItem); getter SVGTransform getItem(unsigned long index); SVGTransform insertItemBefore(SVGTransform newItem, unsigned long index); SVGTransform replaceItem(SVGTransform newItem, unsigned long index); SVGTransform removeItem(unsigned long index); SVGTransform appendItem(SVGTransform newItem); setter undefined (unsigned long index, SVGTransform newItem); // 他のリストインターフェイスには共通しない追加メソッド。 SVGTransform createSVGTransformFromMatrix(optional DOMMatrix2DInit matrix = {}); SVGTransform? consolidate(); }; [Exposed=Window] interface SVGAnimatedTransformList { [SameObject] readonly attribute SVGTransformList baseVal; [SameObject] readonly attribute SVGTransformList animVal; }; [Exposed=Window] interface SVGPreserveAspectRatio { // 配置型 const unsigned short SVG_PRESERVEASPECTRATIO_UNKNOWN = 0; const unsigned short SVG_PRESERVEASPECTRATIO_NONE = 1; const unsigned short SVG_PRESERVEASPECTRATIO_XMINYMIN = 2; const unsigned short SVG_PRESERVEASPECTRATIO_XMIDYMIN = 3; const unsigned short SVG_PRESERVEASPECTRATIO_XMAXYMIN = 4; const unsigned short SVG_PRESERVEASPECTRATIO_XMINYMID = 5; const unsigned short SVG_PRESERVEASPECTRATIO_XMIDYMID = 6; const unsigned short SVG_PRESERVEASPECTRATIO_XMAXYMID = 7; const unsigned short SVG_PRESERVEASPECTRATIO_XMINYMAX = 8; const unsigned short SVG_PRESERVEASPECTRATIO_XMIDYMAX = 9; const unsigned short SVG_PRESERVEASPECTRATIO_XMAXYMAX = 10; // Meet-or-slice 型 const unsigned short SVG_MEETORSLICE_UNKNOWN = 0; const unsigned short SVG_MEETORSLICE_MEET = 1; const unsigned short SVG_MEETORSLICE_SLICE = 2; attribute unsigned short align; attribute unsigned short meetOrSlice; }; [Exposed=Window] interface SVGAnimatedPreserveAspectRatio { [SameObject] readonly attribute SVGPreserveAspectRatio baseVal; [SameObject] readonly attribute SVGPreserveAspectRatio animVal; }; [Exposed=Window] interface SVGPathElement : SVGGeometryElement { }; [Exposed=Window] interface SVGRectElement : SVGGeometryElement { [SameObject] readonly attribute SVGAnimatedLength x; [SameObject] readonly attribute SVGAnimatedLength y; [SameObject] readonly attribute SVGAnimatedLength width; [SameObject] readonly attribute SVGAnimatedLength height; [SameObject] readonly attribute SVGAnimatedLength rx; [SameObject] readonly attribute SVGAnimatedLength ry; }; [Exposed=Window] interface SVGCircleElement : SVGGeometryElement { [SameObject] readonly attribute SVGAnimatedLength cx; [SameObject] readonly attribute SVGAnimatedLength cy; [SameObject] readonly attribute SVGAnimatedLength r; }; [Exposed=Window] interface SVGEllipseElement : SVGGeometryElement { [SameObject] readonly attribute SVGAnimatedLength cx; [SameObject] readonly attribute SVGAnimatedLength cy; [SameObject] readonly attribute SVGAnimatedLength rx; [SameObject] readonly attribute SVGAnimatedLength ry; }; [Exposed=Window] interface SVGLineElement : SVGGeometryElement { [SameObject] readonly attribute SVGAnimatedLength x1; [SameObject] readonly attribute SVGAnimatedLength y1; [SameObject] readonly attribute SVGAnimatedLength x2; [SameObject] readonly attribute SVGAnimatedLength y2; }; interface mixin SVGAnimatedPoints { [SameObject] readonly attribute SVGPointList points; [SameObject] readonly attribute SVGPointList animatedPoints; }; [Exposed=Window] interface SVGPointList { readonly attribute unsigned long length; readonly attribute unsigned long numberOfItems; undefined clear(); SVGPoint initialize(SVGPoint newItem); getter SVGPoint getItem(unsigned long index); SVGPoint insertItemBefore(SVGPoint newItem, unsigned long index); SVGPoint replaceItem(SVGPoint newItem, unsigned long index); SVGPoint removeItem(unsigned long index); SVGPoint appendItem(SVGPoint newItem); setter undefined (unsigned long index, SVGPoint newItem); }; [Exposed=Window] interface SVGPolylineElement : SVGGeometryElement { }; SVGPolylineElement includes SVGAnimatedPoints; [Exposed=Window] interface SVGPolygonElement : SVGGeometryElement { }; SVGPolygonElement includes SVGAnimatedPoints; [Exposed=Window] interface SVGTextContentElement : SVGGraphicsElement { // lengthAdjust 型 const unsigned short LENGTHADJUST_UNKNOWN = 0; const unsigned short LENGTHADJUST_SPACING = 1; const unsigned short LENGTHADJUST_SPACINGANDGLYPHS = 2; [SameObject] readonly attribute SVGAnimatedLength textLength; [SameObject] readonly attribute SVGAnimatedEnumeration lengthAdjust; long getNumberOfChars(); float getComputedTextLength(); float getSubStringLength(unsigned long charnum, unsigned long nchars); SVGPoint getStartPositionOfChar(unsigned long charnum); SVGPoint getEndPositionOfChar(unsigned long charnum); SVGRect getExtentOfChar(unsigned long charnum); float getRotationOfChar(unsigned long charnum); long getCharNumAtPosition(optional DOMPointInit point = {}); undefined selectSubString(unsigned long charnum, unsigned long nchars); }; [Exposed=Window] interface SVGTextPositioningElement : SVGTextContentElement { [SameObject] readonly attribute SVGAnimatedLengthList x; [SameObject] readonly attribute SVGAnimatedLengthList y; [SameObject] readonly attribute SVGAnimatedLengthList dx; [SameObject] readonly attribute SVGAnimatedLengthList dy; [SameObject] readonly attribute SVGAnimatedNumberList rotate; }; [Exposed=Window] interface SVGTextElement : SVGTextPositioningElement { }; [Exposed=Window] interface SVGTSpanElement : SVGTextPositioningElement { }; [Exposed=Window] interface SVGTextPathElement : SVGTextContentElement { // textPath メソッド型 const unsigned short TEXTPATH_METHODTYPE_UNKNOWN = 0; const unsigned short TEXTPATH_METHODTYPE_ALIGN = 1; const unsigned short TEXTPATH_METHODTYPE_STRETCH = 2; // textPath 間隔型 const unsigned short TEXTPATH_SPACINGTYPE_UNKNOWN = 0; const unsigned short TEXTPATH_SPACINGTYPE_AUTO = 1; const unsigned short TEXTPATH_SPACINGTYPE_EXACT = 2; [SameObject] readonly attribute SVGAnimatedLength startOffset; [SameObject] readonly attribute SVGAnimatedEnumeration method; [SameObject] readonly attribute SVGAnimatedEnumeration spacing; }; SVGTextPathElement includes SVGURIReference; [Exposed=Window] interface SVGImageElement : SVGGraphicsElement { [SameObject] readonly attribute SVGAnimatedLength x; [SameObject] readonly attribute SVGAnimatedLength y; [SameObject] readonly attribute SVGAnimatedLength width; [SameObject] readonly attribute SVGAnimatedLength height; [SameObject] readonly attribute SVGAnimatedPreserveAspectRatio preserveAspectRatio; attribute DOMString? crossOrigin; }; SVGImageElement includes SVGURIReference; [Exposed=Window] interface SVGForeignObjectElement : SVGGraphicsElement { [SameObject] readonly attribute SVGAnimatedLength x; [SameObject] readonly attribute SVGAnimatedLength y; [SameObject] readonly attribute SVGAnimatedLength width; [SameObject] readonly attribute SVGAnimatedLength height; }; [Exposed=Window] interface SVGMarkerElement : SVGElement { // マーカー単位型 const unsigned short SVG_MARKERUNITS_UNKNOWN = 0; const unsigned short SVG_MARKERUNITS_USERSPACEONUSE = 1; const unsigned short SVG_MARKERUNITS_STROKEWIDTH = 2; // マーカー配向型 const unsigned short SVG_MARKER_ORIENT_UNKNOWN = 0; const unsigned short SVG_MARKER_ORIENT_AUTO = 1; const unsigned short SVG_MARKER_ORIENT_ANGLE = 2; const unsigned short SVG_MARKER_ORIENT_AUTO_START_REVERSE = 3; [SameObject] readonly attribute SVGAnimatedLength refX; [SameObject] readonly attribute SVGAnimatedLength refY; [SameObject] readonly attribute SVGAnimatedEnumeration markerUnits; [SameObject] readonly attribute SVGAnimatedLength markerWidth; [SameObject] readonly attribute SVGAnimatedLength markerHeight; [SameObject] readonly attribute SVGAnimatedEnumeration orientType; [SameObject] readonly attribute SVGAnimatedAngle orientAngle; attribute DOMString orient; undefined setOrientToAuto(); undefined setOrientToAngle(SVGAngle angle); }; SVGMarkerElement includes SVGFitToViewBox; [Exposed=Window] interface SVGGradientElement : SVGElement { // 展開方法型 const unsigned short SVG_SPREADMETHOD_UNKNOWN = 0; const unsigned short SVG_SPREADMETHOD_PAD = 1; const unsigned short SVG_SPREADMETHOD_REFLECT = 2; const unsigned short SVG_SPREADMETHOD_REPEAT = 3; [SameObject] readonly attribute SVGAnimatedEnumeration gradientUnits; [SameObject] readonly attribute SVGAnimatedTransformList gradientTransform; [SameObject] readonly attribute SVGAnimatedEnumeration spreadMethod; }; SVGGradientElement includes SVGURIReference; [Exposed=Window] interface SVGLinearGradientElement : SVGGradientElement { [SameObject] readonly attribute SVGAnimatedLength x1; [SameObject] readonly attribute SVGAnimatedLength y1; [SameObject] readonly attribute SVGAnimatedLength x2; [SameObject] readonly attribute SVGAnimatedLength y2; }; [Exposed=Window] interface SVGRadialGradientElement : SVGGradientElement { [SameObject] readonly attribute SVGAnimatedLength cx; [SameObject] readonly attribute SVGAnimatedLength cy; [SameObject] readonly attribute SVGAnimatedLength r; [SameObject] readonly attribute SVGAnimatedLength fx; [SameObject] readonly attribute SVGAnimatedLength fy; [SameObject] readonly attribute SVGAnimatedLength fr; }; [Exposed=Window] interface SVGStopElement : SVGElement { [SameObject] readonly attribute SVGAnimatedNumber offset; }; [Exposed=Window] interface SVGPatternElement : SVGElement { [SameObject] readonly attribute SVGAnimatedEnumeration patternUnits; [SameObject] readonly attribute SVGAnimatedEnumeration patternContentUnits; [SameObject] readonly attribute SVGAnimatedTransformList patternTransform; [SameObject] readonly attribute SVGAnimatedLength x; [SameObject] readonly attribute SVGAnimatedLength y; [SameObject] readonly attribute SVGAnimatedLength width; [SameObject] readonly attribute SVGAnimatedLength height; }; SVGPatternElement includes SVGFitToViewBox; SVGPatternElement includes SVGURIReference; [Exposed=Window] interface SVGScriptElement : SVGElement { [Reflect] attribute DOMString type; attribute DOMString? crossOrigin; }; SVGScriptElement includes SVGURIReference; [Exposed=Window] interface SVGAElement : SVGGraphicsElement { [Reflect, SameObject] readonly attribute SVGAnimatedString target; [Reflect] attribute DOMString download; [Reflect] attribute USVString ping; [Reflect] attribute DOMString rel; [Reflect="rel", SameObject, PutForwards=value] readonly attribute DOMTokenList relList; [Reflect] attribute DOMString hreflang; [Reflect] attribute DOMString type; attribute DOMString referrerPolicy; }; SVGAElement includes SVGURIReference; SVGAElement includes HyperlinkElementUtils; [Exposed=Window] interface SVGViewElement : SVGElement {}; SVGViewElement includes SVGFitToViewBox;
以下の注記では、ソフトウェア開発者がコンテンツを SVG 言語の機能で要求される形式へ変換する場合、またはその形式から 変換する場合に使用できるアルゴリズムやその他の方策を説明する。
他のパス区間表記と一貫させるため、 SVG パス内の弧は曲線上の始点と終点によって定義される。
この楕円弧のパラメーター化を 端点パラメーター化と呼ぶ。端点 パラメーター化の利点の 1 つは、すべてのパスコマンドが新しい 「現在点」の座標で終わる、一貫した パス構文を可能にすることである。
しかし、これはソフトウェアや数学で使用される 弧のジオメトリを記述する唯一の方法ではない。 この節では、代替となる中心パラメーター化と、 SVG の端点パラメーター化との相互変換方法を説明する。
SVG パスコマンドで表される楕円弧は、 次のパラメーターによって順に記述される:
(x1, y1) は、 前のパスコマンドの最後の 2 つの パラメーターから得られる、パス上の現在点の絶対座標である。
rx および ry は楕円の半径(長半径および 短半径とも呼ばれる)である。
φ は、現在の座標 系の x 軸から楕円の x 軸までの角度である。
fA は large arc flag であり、180 度以下にわたる弧を選択する場合は 0、 180 度を超える弧を選択する場合は 1 である。
fS は sweep flag であり、中心と弧を結ぶ 線が角度の減少する方向へ掃引する場合は 0、 角度の増加する方向へ掃引する場合は 1 である。
(x2, y2) は、 弧の終点の絶対座標である。
楕円弧上の任意の点 (x, y) は、 次の 2 次元行列方程式で記述できる:
(式 3.1)
x = rx*cos(θ)*cos(φ) - ry*sin(θ)*sin(φ) + cx
y = rx*cos(θ)*sin(φ) + ry*sin(θ)*cos(φ) + cy
(cx, cy) は、 楕円の中心の座標である。
rx および ry は楕円の半径(長半径および 短半径とも呼ばれる)である。
φ は、現在の座標系の x 軸から楕円の x 軸までの 角度である。
θ は、点 (x, y) が位置する弧上の角度であり、次の範囲を取る:
楕円を、引き伸ばされてから 回転された円と考えると、θ1, θ2 および Δθ はそれぞれ、 引き伸ばしおよび回転操作前の弧の 開始角度、終了角度、掃引角度となる。 これはグラフィックス API で一般的な代替パラメーター化につながり、 中心 パラメーター化と呼ぶ。次の節では、 中心パラメーター化と端点パラメーター化の間を 双方向に対応付けるための式を示す。
次の変数が与えられたとする:
cx cy rx ry φ θ1 Δθ
求めるものは次のとおり:
x1 y1 x2 y2 fA fS
これは次の式を使用して求められる:
|
|
(式 4.1) |
|
|
(式 4.2) |
|
|
(式 4.3) |
|
|
(式 4.4) |
次の変数が与えられたとする:
x1 y1 x2 y2 fA fS rx ry φ
求めるものは次のとおり:
cx cy θ1 Δθ
方程式は、(x1, y1) と (x2, y2) を結ぶ線の中点へ 原点を移動し、その後 座標軸を楕円の軸に合わせるように回転すると簡単になる。 変換後のすべての座標はプライム記号を付けて記述する。これらは、 必要な中心パラメーター化変数を求める途中の 中間値として計算される。この手順は 次のステップからなる:
ステップ 1: 計算する (x1′, y1′)
|
|
(式 5.1) |
ステップ 2: 計算する (cx′, cy′)
|
|
(式 5.2) |
ここで、fA ≠ fS の場合は + 符号を選び、 fA = fS の場合は − 符号を選ぶ。
ステップ 3: 計算する (cx, cy) を (cx′, cy′) から
|
|
(式 5.3) |
ステップ 4: 計算する θ1 および Δθ
一般に、2 つのベクトル (ux, uy) と (vx, vy) の間の角度は次のように計算できる
|
|
(式 5.4) |
ここで現れる ± 符号は、 ux vy − uy vx の符号である。
この角度関数を使用して θ1 および Δθ を次のように表せる:
|
|
(式 5.5) |
|
|
(式 5.6) |
ここで Δθ は、 −360° < Δθ < 360° の範囲で次を満たすよう補正される:
fS = 0 の場合、Δθ < 0、
それ以外で fS = 1 の場合、Δθ > 0。
言い換えると、fS = 0 で (式 5.6) の右辺が 0 より大きい場合は 360° を減算し、 fS = 1 で右辺が 0 より小さい場合は 360° を加算する。その他すべての場合は そのままにする。
この節では、パス実装上の注記で説明される、 範囲外の rx および ry に必要な数学的調整について説明する。 アルゴリズム上、これらの調整は次の ステップからなる:
ステップ 1: 半径が 0 でないことを保証する
rx = 0 または ry = 0 の場合、 これを (x1, y1) から (x2, y2) への直線として扱い、停止する。それ以外の場合、
ステップ 2: 半径が正であることを保証する
rx および ry の絶対値を取る:
|
|
(式 6.1) |
ステップ 3: 半径が十分大きいことを保証する
式 (式 5.1) のプライム付き座標値を使用して、 次を計算する
|
|
(式 6.2) |
上の式の結果が 1 以下の場合、 rx および ry をさらに変更する必要はない。 上の式の結果が 1 より大きい場合、 次の置換を行う
|
|
(式 6.3) |
ステップ 4: 計算を続行する
残りの楕円弧の計算、例えば 端点から 中心パラメーター化への変換アルゴリズムの計算を続行する。 注: この節の 半径補正の結果として、楕円の 中心に対する式 (5.2) は常に少なくとも 1 つの解を持つ (すなわち被開平数は決して負にならない)。式 (式 6.3) を使用して 半径を拡大する場合、(式 5.2) の被開平数は 0 となり、楕円の中心には ちょうど 1 つの解が存在する。
この節は参考情報である。
SVG の 実数精度は 単精度である。 地図や技術図面など、 単精度を超える情報の表現が望まれる技術データを扱う 適合 SVG ジェネレーターには、 適合 SVG ビューアーで一貫した表示を保証するため、 この節で概説する手順に従うことが推奨される。
CTM を生成するときには少なくとも倍精度浮動小数点を使用しなければならないという 事実を利用することで、 単精度より高い実効精度での表示を得られる場合がある (適合 SVG ビューアー節の CTM 生成処理を参照)。 これを利用するコンテンツを生成する手順は次のとおり:
| 分割前 | 分割後 | |
|---|---|---|
|
|
| ステップ 1 : コンテンツの分割 | ステップ 5 : より小さい実効桁数と適切な translate でタイルを配置する | |
|---|---|---|
![]() |
![]() |
|
| この例では、7 桁のユーザー 座標系を持つタイルを使用して 8 桁の有効桁数を提供する。 | ||
この付録は参考情報であり、規範的ではない。
この付録では、SVG のアクセシビリティ機能と、SVG を支援するために使用されるアクセシビリティ関連仕様、 およびそれらが支援するよう設計されている関連する W3C Web コンテンツ・アクセシビリティ ガイドライン (WCAG) 2.0 [WCAG2] の要件について概説する。
この節では、SVG のアクセシビリティ関連仕様とオーサリングガイドラインを列挙する。
SVG は、時間の経過とともにベクターグラフィックスを変更し、 アニメーション効果を作成する機能をサポートする。 SVG コンテンツは次の方法でアニメーション化できる:
SVG は、これらのアニメーション方法のいずれについてもサポートを要求しない。 ただし、それらをサポートするユーザーエージェントは、SVG 文書 および他の文書内の SVG フラグメントでもそれらをサポートすることが期待される。 宣言的またはスクリプトによるアニメーションをサポートするユーザーエージェントは、 適合性の章で定義される 処理モードに基づく制限と、 use 要素のシャドウ ツリー内のアニメーションに対する特別な要件に従わなければならない。
この付録は参考情報であり、規範的ではない。
SVG 言語の要素は次のとおり:
この付録は参考情報であり、規範的ではない。
次の表は SVG で定義されているすべての属性を一覧にする 言語内の。ただし、プレゼンテーション属性は除き、これらは 扱われる プレゼンテーション属性 の以下の節で。各属性について、その属性を指定できる要素 も示される。
スタイル付けの章で説明したように、それぞれの プロパティには対応する プレゼンテーション属性が存在する。 以下の表にプレゼンテーション属性を示す。
alignment-baseline, baseline-shift, clip, clip-path, clip-rule, color, color-interpolation, color-interpolation-filters, cursor, direction, display, dominant-baseline, fill, fill-opacity, fill-rule, filter, flood-color, flood-opacity, font-family, font-size, font-size-adjust, font-stretch, font-style, font-variant, font-weight, glyph-orientation-horizontal, glyph-orientation-vertical, image-rendering, letter-spacing, lighting-color, marker-end, marker-mid, marker-start, mask, mask-type, opacity, overflow, paint-order, path-length, pointer-events, shape-rendering, stop-color, stop-opacity, stroke, stroke-dasharray, stroke-dashoffset, stroke-linecap, stroke-linejoin, stroke-miterlimit, stroke-opacity, stroke-width, text-anchor, text-decoration, text-rendering, transform, transform-origin, unicode-bidi, vector-effect, visibility, word-spacing および writing-modeこの付録は参考情報であり、規範的ではない。
| 名前 | 値 | 初期値 | 適用対象 | 継承 | パーセント値 | メディア | アニメーション型 | 計算値 |
|---|---|---|---|---|---|---|---|---|
| color-interpolation | auto | sRGB | linearRGB | sRGB | コンテナー要素, グラフィックス要素, グラデーション要素, ‘use’ および ‘animate’ | はい | 該当なし | 視覚 | 離散 | 指定値のまま |
| cx | <length-percentage> | 0 | ‘circle’ および ‘ellipse’ 要素 | いいえ | 現在の SVG ビューポートの幅を基準とする( 単位を参照) | 計算値による | 絶対長またはパーセント値 | |
| cy | <length-percentage> | 0 | ‘circle’ および ‘ellipse’ 要素 | いいえ | 現在の SVG ビューポートの高さを基準とする( 単位を参照) | 視覚 | 計算値による | 絶対長またはパーセント値 |
| fill | <paint>(ペイントの指定 を参照) | black | 図形および テキスト コンテンツ要素 | はい | 該当なし | 視覚 | 計算値による | 指定値のまま。ただし <color> 値は 計算し、<url> 値は 絶対化する |
| fill-opacity | <‘opacity’> | 1 | 図形および テキスト コンテンツ要素 | はい | 該当なし | 視覚 | 計算値による | 指定値を数値へ変換し、範囲 [0,1] にクランプした値 |
| fill-rule | nonzero | evenodd | nonzero | 図形および テキスト コンテンツ要素 | はい | 該当なし | 視覚 | 離散 | 指定値のまま |
| image-rendering | auto | optimizeSpeed | optimizeQuality | auto | 画像 | はい | 該当なし | 視覚 | 離散 | 指定値のまま |
| marker | 個々のプロパティを参照 | 個々のプロパティを参照 | 図形 | はい | 該当なし | 視覚 | 離散 | 個々のプロパティを参照 |
| marker-end marker-mid marker-start |
none | <url> | none | 図形 | はい | 該当なし | 視覚 | 離散 | 指定値のまま。ただし <url> 値(<marker-ref> の一部であるもの)は 絶対化する |
| paint-order | normal | [ fill || stroke || markers ] | normal | 図形および テキスト コンテンツ要素 | はい | 該当なし | 視覚 | 離散 | 指定値のまま |
| pointer-events | auto | bounding-box | visiblePainted | visibleFill | visibleStroke |
visible | painted | fill | stroke | all | none |
auto | コンテナー要素, グラフィックス要素および ‘use’ | はい | 該当なし | 視覚 | 離散 | 指定値のまま |
| r | <length-percentage> | 0 | ‘circle’ 要素 | いいえ | 現在の SVG ビューポートの正規化された対角線を基準とする( 単位を参照) | 計算値による | 絶対長またはパーセント値 | |
| rx | <length-percentage> | auto | auto | ‘ellipse’, ‘rect’ 要素 | いいえ | 現在の SVG ビューポートの幅を基準とする( 単位を参照) | 計算値による | 絶対長またはパーセント値 | |
| ry | <length-percentage> | auto | auto | ‘ellipse’, ‘rect’ 要素 | いいえ | 現在の SVG ビューポートの高さを基準とする( 単位を参照) | 視覚 | 計算値による | 絶対長またはパーセント値 |
| shape-rendering | auto | optimizeSpeed | crispEdges | geometricPrecision |
auto | 図形 | はい | 該当なし | 視覚 | 離散 | 指定値のまま |
| stop-color | <‘color’> | black | ‘stop’ 要素 | いいえ | 該当なし | 視覚 | 計算値による | |
| stop-opacity | <‘opacity’> | 1 | ‘stop’ 要素 | いいえ | 該当なし | 視覚 | 計算値による | 指定値を数値へ変換し、範囲 [0,1] にクランプした値 |
| stroke | <paint>(ペイントの指定 を参照) | none | 図形および テキスト コンテンツ要素 | はい | 該当なし | 視覚 | 計算値による | 指定値のまま。ただし <color> 値は 計算し、<url> 値は 絶対化する |
| stroke-dasharray | none | <dasharray> | none | 図形および テキスト コンテンツ要素 | はい | 現在の SVG ビューポートの正規化された対角線を基準とする | 視覚 | 本文を参照 | 絶対長またはパーセント値のコンマ区切りリストとして、数値はまず絶対 長へ変換するか、指定されたキーワード |
| stroke-dashoffset | <length-percentage> | <number> | 0 | 図形および テキスト コンテンツ要素 | はい | 現在の SVG ビューポートの正規化された対角線を基準とする | 視覚 | 計算値による | 絶対長またはパーセント値として。数値はまず絶対長へ変換する |
| stroke-linecap | butt | round | square | butt | 図形および テキスト コンテンツ要素 | はい | 該当なし | 視覚 | 離散 | 指定値のまま |
| stroke-linejoin | miter | round | bevel | miter | 図形および テキスト コンテンツ要素 | はい | 該当なし | 視覚 | 離散 | 指定値のまま |
| stroke-miterlimit | <number>(負でない) | 4 | 図形および テキスト コンテンツ要素 | はい | 該当なし | 視覚 | 計算値による | 指定値のまま |
| stroke-opacity | <‘opacity’> | 1 | 図形および テキスト コンテンツ要素 | はい | 該当なし | 視覚 | 計算値による | 指定値を数値へ変換し、範囲 [0,1] にクランプした値 |
| stroke-width | <length-percentage> | <number> | 1px | 図形および テキスト コンテンツ要素 | はい | 現在の SVG ビューポートの正規化された対角線を基準とする | 視覚 | 計算値による | 絶対長またはパーセント値として。数値はまず絶対長へ変換する |
| text-anchor | start | middle | end | start | テキストコンテンツ要素 | はい | 該当なし | 視覚 | 離散 | 指定値のまま |
| text-rendering | auto | optimizeSpeed | optimizeLegibility | geometricPrecision |
auto | ‘text’ 要素 | はい | 該当なし | 視覚 | 離散 | 指定値のまま |
| vector-effect | non-scaling-stroke | none | none | グラフィックス要素および ‘use’ | いいえ | 該当なし | 視覚 | 離散 | 指定値のまま |
| x | <length-percentage> | 0 | ‘svg’, ‘rect’, ‘image’, ‘foreignObject’ 要素 | いいえ | 現在の SVG ビューポートの幅を基準とする( 単位を参照) | 計算値による | 絶対長またはパーセント値 | |
| y | <length-percentage> | 0 | ‘svg’, ‘rect’, ‘image’, ‘foreignObject’ 要素 | いいえ | 現在の SVG ビューポートの高さを基準とする( 単位を参照) | 視覚 | 計算値による | 絶対長またはパーセント値 |
この付録は参考情報であり、規範的ではない。
以下は、この仕様で定義されるすべての IDL インターフェイスの一覧である:
この付録は規範的である。
この付録では、BCP 13 および W3CRegMedia に準拠して新しい MIME メディア型 "image/svg+xml" を登録する。
image
svg+xml
なし。
charset
[rfc7303] またはその 後継で指定される application/xml メディア型と同じ。
application/xml と同じ。[rfc7303] の 3.2 節またはその 後継を参照。
SVG Working Group による セキュリティおよび プライバシー に関する自己評価の結果は https://github.com/w3c/svgwg/wiki/SVG-2-Security-&-Privacy-Review にある。
他の XML 型と同様、また [rfc7303] の 10 節に記載されているように、 悪意を持って構築された XML エンティティを繰り返し展開すると大量の メモリを消費するために使用でき、制約のある環境の XML プロセッサーが失敗する可能性がある。
複数の SVG 要素は任意の URI を参照させる可能性がある。この場合、 [rfc3986] の 7 節のセキュリティ問題を考慮すべきである。
HTML と同様に、SVG 文書は画像、スタイルシート、および スクリプト言語などの外部メディアを参照できる。スクリプト言語は実行可能コンテンツである。この場合、 それらの形式のメディア型登録におけるセキュリティ上の考慮事項を適用しなければならない。
さらに、SVG および一般の XML の拡張性機能により、 "image/svg+xml" がここで説明したものを超えるセキュリティ上の影響を持つコンテンツを記述する可能性が ある。ただし、プロセッサーが公開仕様の規範的セマンティクスのみに従う場合、 このコンテンツは SVG 名前空間外となり、無視されなければならない。 プロセッサーが追加コンテンツを認識して処理する場合、またはその追加処理が 他のプロセッサーへ委譲される場合にのみ、セキュリティ問題が発生する可能性がある。そしてその 場合、それらはこの登録文書の範囲外となる。
SVG Working Group による セキュリティおよび プライバシー に関する自己評価の結果は https://github.com/w3c/svgwg/wiki/SVG-2-Security-&-Privacy-Review にある。
SVG の ‘requiredExtensions’ および ‘systemLanguage’ 属性 は、場合によっては ユーザーエージェントのホスト 環境の構成を調べる機会をある程度提供する。‘requiredExtensions’ は カスタム 拡張がユーザーエージェントによってサポートされているかを判断することで行う。‘systemLanguage’ は ある言語が別の言語に対してどの程度優先されるかを判断することで行う。
公開仕様は、特に認識されない要素や属性を扱う際に従わなければ ならない動作を規定する処理セマンティクスを、SVG 名前空間内および その他の名前空間内の双方について説明する。
SVG は拡張可能であるため、適合する "image/svg+xml" プロセッサーは受信したコンテンツが 整形式 XML であることを期待しなければならないが、そのコンテンツが特定の DTD または Schema に対して有効であることや、プロセッサーが文書内のすべての要素と属性を認識することは保証できない。
SVG には公開されたテストスイートと、報告時点でどの実装が どのテストに合格したかを示す関連実装報告がある。この情報は、新しいテストが 追加されたり実装が改善されたりするたびに定期的に更新される。
このメディア型登録は、SVG 1.1 仕様の付録 P から抽出したものである。
SVG は Web ブラウザーで、多くの場合 HTML と組み合わせて使用される。また携帯電話やデジタルカメラ、 デスクトップパブリッシングでのグラフィカル資産の交換形式、産業プロセスの 可視化、表示看板、およびスケーラブルな静的または インタラクティブなグラフィカル機能を必要とするその他多くの用途で使用される。
拡張子 'svgz' は 'svg.gz' の別名として使用されることに注意すること [rfc1952], すなわち image/svg+xml 型のオクテットストリームを、その後 gzip で圧縮したもの。
Macintosh ファイル型コード 'svgz'(すべて小文字)は GZIP の別名として使用されることに注意すること [rfc1952] で圧縮された "svg "、すなわち image/svg+xml 型のオクテットストリームを、その後 gzip で圧縮したもの。
org.w3c.svg は public.image および public.xml に適合する
Chris Lilley (www-svg@w3.org) または GitHub で issue を提起する: https://github.com/w3c/svgwg/issues/685
COMMON
なし
SVG 仕様は World Wide Web Consortium の SVG Working Group による成果物である。
W3C がこの仕様の変更管理を行う。
この付録は参考情報であり、規範的ではない。
この付録では、 SVG 1.1 第 2 版勧告以降に行われた変更を要約する。 最初の SVG 2 勧告候補 以降に行われた変更は強調表示される。
仕様をより読みやすくするため、多数のスタイル上の変更が行われた。これには 次のものが含まれる:
上記の編集上の変更に加えて、次の実質的な追加、変更および 削除 が行われた。
zoomAndPan 属性および関連テキストを削除する。
Issue の議論
suspendRedraw, unsuspendRedraw および
unsuspendRedrawAll メソッドを SVGSVGElement インターフェイス上で非推奨とした。
body 上のイベントハンドラーコンテンツ属性および IDL 属性と同様である。
SVGElementInstance および SVGElementInstanceList インターフェイスと、
SVGUseElement インターフェイス上の対応する属性を削除した。
viewport 属性を削除した。
zoomAndPan 属性および関連テキストを削除する。
Issue の議論
instanceRoot および animatedInstanceRoot
プロパティを SVGUseElement
インターフェイスから削除する。
これらはすべてのブラウザーから削除されたためである。
Issue の議論
SVGPathSeg* および SVGAnimatedPathData インターフェイスと関連する
SVGPathElement 上のメソッドを削除した。
<number> から <length> へ
CSSWG の決議に従って変更した。
csswg-drafts#13901
(決議、2026 年 5 月 20
日)
miter-clip および arcs 値を stroke-linejoin から削除(Issue #1065)zoomAndPan 属性および関連テキストを削除した。text IDL プロパティを追加した。(none) 初期値を反映するときだけ適用され、
他の仕様(例えば Geometry)で定義されるインターフェイスにも適用されることを明確化した。