Die zum Zeitpunkt dieser Antwort veröffentlichten sauberen, schnellen und einfachen Lösungen sind unbefriedigend. Sie basieren auf der fehlerhaften Aussage, dass SVG-Dokumente keine z-Reihenfolge haben. Bibliotheken sind ebenfalls nicht erforderlich. Eine Codezeile kann die meisten Operationen ausführen, um die z-Reihenfolge von Objekten oder Objektgruppen zu ändern, die möglicherweise für die Entwicklung einer App erforderlich sind, die 2D-Objekte in einem xyz-Raum bewegt.
Z-Reihenfolge ist in SVG-Dokumentfragmenten definitiv vorhanden
Was als SVG-Dokumentfragment bezeichnet wird, ist ein Baum von Elementen, die vom Basisknotentyp SVGElement abgeleitet sind. Der Stammknoten eines SVG-Dokumentfragments ist ein SVGSVGElement, das einem HTML5- Tag <svg> entspricht . Das SVGGElement entspricht dem <g> -Tag und ermöglicht das Aggregieren von untergeordneten Elementen .
Ein Z-Index-Attribut auf dem SVGElement wie in CSS würde das SVG-Rendering-Modell zunichte machen. In den Abschnitten 3.3 und 3.4 der W3C-SVG-Empfehlung v1.1, 2. Ausgabe, heißt es, dass SVG-Dokumentfragmente (Bäume von Nachkommen eines SVGSVGElement) mithilfe einer sogenannten Tiefensuche des Baums gerendert werden . Dieses Schema ist in jeder Hinsicht eine Ordnung.
Die Z-Reihenfolge ist eigentlich eine Abkürzung für Computer Vision, um die Notwendigkeit eines echten 3D-Renderings mit den Komplexitäten und Rechenanforderungen der Raytracing-Funktion zu vermeiden. Die lineare Gleichung für den impliziten Z-Index von Elementen in einem SVG-Dokumentfragment.
z-index = z-index_of_svg_tag + depth_first_tree_index / tree_node_qty
Dies ist wichtig, da Sie, wenn Sie einen Kreis, der sich unter einem Quadrat befand, nach oben verschieben möchten, einfach das Quadrat vor dem Kreis einfügen. Dies kann einfach in JavaScript durchgeführt werden.
Unterstützende Methoden
SVGElement-Instanzen verfügen über zwei Methoden, die eine einfache und einfache Manipulation der z-Reihenfolge unterstützen.
- parent.removeChild (Kind)
- parent.insertBefore (child, childRef)
Die richtige Antwort, die kein Chaos verursacht
Da das SVGGElement ( <g> -Tag) genauso einfach entfernt und eingefügt werden kann wie ein SVGCircleElement oder eine andere Form, können Bildebenen, die für Adobe-Produkte und andere Grafiktools typisch sind, mithilfe des SVGGElement problemlos implementiert werden. Dieses JavaScript ist im Wesentlichen ein Befehl zum Verschieben nach unten .
parent.insertBefore(parent.removeChild(gRobot), gDoorway)
Wenn die Schicht eines Roboters, die als Kinder von SVGGElement gRobot gezeichnet wurde, vor der Tür war, die als Kinder von SVGGElement gDoorway gezeichnet wurde, befindet sich der Roboter jetzt hinter der Tür, da die z-Reihenfolge der Tür jetzt eins plus die z-Reihenfolge des Roboters ist.
Ein Befehl zum Verschieben nach oben ist fast genauso einfach.
parent.insertBefore(parent.removeChild(gRobot), gDoorway.nextSibling())
Denken Sie nur an a = a und b = b, um sich daran zu erinnern.
insert after = move above
insert before = move below
Belassen des DOM in einem Zustand, der mit der Ansicht übereinstimmt
Der Grund, warum diese Antwort richtig ist, liegt darin, dass sie minimal und vollständig ist und wie die Interna von Adobe-Produkten oder anderen gut gestalteten Grafikeditoren die interne Darstellung in einem Zustand belässt, der mit der durch das Rendern erstellten Ansicht übereinstimmt.
Alternativer, aber begrenzter Ansatz
Ein anderer häufig verwendeter Ansatz ist die Verwendung des CSS-Z-Index in Verbindung mit mehreren SVG-Dokumentfragmenten (SVG-Tags) mit größtenteils transparentem Hintergrund in allen außer dem unteren. Dies beeinträchtigt wiederum die Eleganz des SVG-Rendering-Modells und macht es schwierig, Objekte in der z-Reihenfolge nach oben oder unten zu verschieben.
ANMERKUNGEN:
- ( https://www.w3.org/TR/SVG/render.html v 1.1, 2. Ausgabe, 16. August 2011)
3.3 Renderreihenfolge Elemente in einem SVG-Dokumentfragment haben eine implizite Zeichenreihenfolge, wobei die ersten Elemente im SVG-Dokumentfragment zuerst "gemalt" werden. Nachfolgende Elemente werden auf zuvor gemalte Elemente gemalt.
3.4 Wie Gruppen gerendert werden Gruppierungselemente wie das Element 'g' (siehe Containerelemente) bewirken, dass eine temporäre separate Leinwand erstellt wird, die auf transparentes Schwarz initialisiert ist und auf die untergeordnete Elemente gezeichnet werden. Nach Abschluss der Gruppe werden alle für die Gruppe angegebenen Filtereffekte angewendet, um eine geänderte temporäre Zeichenfläche zu erstellen. Die geänderte temporäre Zeichenfläche wird im Hintergrund zusammengesetzt, wobei alle Maskierungs- und Deckkrafteinstellungen auf Gruppenebene für die Gruppe berücksichtigt werden.