この回答の日付の時点で投稿された、クリーンで高速で簡単なソリューションは、満足のいくものではありません。これらは、SVGドキュメントにz順序が欠けているという欠陥のあるステートメントに基づいて作成されています。ライブラリも必要ありません。1行のコードでほとんどの操作を実行して、2次元オブジェクトをxyz空間で移動するアプリの開発で必要になる可能性のあるオブジェクトまたはオブジェクトグループのzオーダーを操作できます。
ZオーダーがSVGドキュメントフラグメントに確実に存在する
いわゆるSVGドキュメントフラグメントは、ベースノードタイプSVGElementから派生した要素のツリーです。SVGドキュメントフラグメントのルートノードは、HTML5 <svg>タグに対応するSVGSVGElement です。SVGGElementは<g>に対応しますタグに子の集約を許可します。
CSSのようにSVGElementにz-index属性があると、SVGレンダリングモデルが無効になります。W3C SVG勧告v1.1 2nd Editionのセクション3.3および3.4では、SVGドキュメントフラグメント(SVGSVGElementからの子のツリー)は、ツリーの深さ優先検索を使用してレンダリングされると述べています。そのスキームは、用語のあらゆる意味でzオーダーです。
Zオーダーは、レイトレーシングの複雑さとコンピューティングの要求を伴う真の3Dレンダリングの必要性を回避するためのコンピュータビジョンショートカットです。SVGドキュメントフラグメント内の要素の暗黙のz-indexの線形方程式。
z-index = z-index_of_svg_tag + depth_first_tree_index / tree_node_qty
正方形の下にあった円をその上に移動する場合は、円の前に正方形を挿入するだけなので、これは重要です。これはJavaScriptで簡単に実行できます。
サポート方法
SVGElementインスタンスには、シンプルで簡単なzオーダー操作をサポートする2つのメソッドがあります。
- parent.removeChild(子)
- parent.insertBefore(child、childRef)
混乱を引き起こさない正解
SVGGElement(<g>タグ)は、SVGCircleElementまたは他の形状と同じように簡単に削除および挿入できるため、SVGGElementを使用すると、アドビ製品や他のグラフィックツールに典型的な画像レイヤーを簡単に実装できます。このJavaScriptは基本的に「下に移動」コマンドです。
parent.insertBefore(parent.removeChild(gRobot), gDoorway)
SVGGElement gRobotの子として描画されたロボットのレイヤーがSVGGElement gDoorwayの子として描画された出入り口の前にある場合、戸口のZオーダーはロボットのZオーダーに1を加えたものになるため、ロボットは戸口の後ろになりました。
上記移動コマンドは、ほとんどの場合簡単です。
parent.insertBefore(parent.removeChild(gRobot), gDoorway.nextSibling())
これを覚えるには、a = aとb = bを考えてください。
insert after = move above
insert before = move below
ビューと整合性のある状態でDOMを残す
この答えが正しい理由は、それが最小限で完全であり、アドビ製品の内部または他の適切に設計されたグラフィックエディターと同様に、内部表現がレンダリングによって作成されたビューと一致する状態のままになるためです。
代替であるが限られたアプローチ
一般的に使用される別のアプローチは、CSS z-indexを複数のSVGドキュメントフラグメント(SVGタグ)と組み合わせて使用することです。繰り返しますが、これはSVGレンダリングモデルの優雅さを無効にし、zオーダーでオブジェクトを上下に移動することを困難にします。
ノート:
- (https://www.w3.org/TR/SVG/render.html v 1.1、第2版、2011年8月16日)
3.3 SVGドキュメントフラグメントのレンダリング順序要素には暗黙の描画順序があり、SVGドキュメントフラグメントの最初の要素が最初に「ペイント」されます。後続の要素は、以前にペイントされた要素の上にペイントされます。
3.4グループのレンダリング方法 'g'要素(コンテナー要素を参照)などのグループ化要素は、子要素が描画される透明な黒に初期化された一時的な個別のキャンバスを作成する効果があります。グループが完了すると、グループに指定されたすべてのフィルター効果が適用され、変更された一時キャンバスが作成されます。変更された一時キャンバスは、グループレベルのマスキングとグループの不透明度設定を考慮して、背景に合成されます。