Le soluzioni pulite, veloci e facili pubblicate alla data di questa risposta sono insoddisfacenti. Sono costruiti sulla base dell'affermazione errata che i documenti SVG mancano di ordine z. Neanche le librerie sono necessarie. Una riga di codice può eseguire la maggior parte delle operazioni per manipolare l'ordine z di oggetti o gruppi di oggetti che potrebbero essere richiesti nello sviluppo di un'app che sposta gli oggetti 2D in uno spazio xyz.
L'ordine Z esiste sicuramente nei frammenti di documenti SVG
Quello che viene chiamato un frammento di documento SVG è un albero di elementi derivati dal tipo di nodo di base SVGElement. Il nodo radice di un frammento di documento SVG è un SVGSVGElement, che corrisponde a un tag HTML5 <svg> . Il SVGGElement corrisponde al tag <g> e consente di aggregare i figli.
Avere un attributo z-index su SVGElement come nei CSS avrebbe sconfitto il modello di rendering SVG. Le sezioni 3.3 e 3.4 della Raccomandazione SVG W3C v1.1 2a Edizione affermano che i frammenti del documento SVG (alberi di prole da un SVGSVGElement) sono resi usando quella che viene chiamata una prima ricerca approfondita dell'albero . Questo schema è in ordine alfabetico in ogni senso del termine.
L'ordine Z è in realtà un collegamento alla visione artificiale per evitare la necessità di un vero rendering 3D con le complessità e le esigenze di elaborazione del ray tracing. L'equazione lineare per l'indice z implicito degli elementi in un frammento di documento SVG.
z-index = z-index_of_svg_tag + depth_first_tree_index / tree_node_qty
Questo è importante perché se vuoi spostare un cerchio che era sotto un quadrato sopra di esso, devi semplicemente inserire il quadrato prima del cerchio. Questo può essere fatto facilmente in JavaScript.
Metodi di supporto
Le istanze di SVGElement hanno due metodi che supportano la manipolazione di ordini z semplice e facile.
- parent.removeChild (bambino)
- parent.insertBefore (child, childRef)
La risposta corretta che non crea disordine
Poiché SVGGElement ( <g> tag) può essere rimosso e inserito con la stessa facilità di SVGCircleElement o di qualsiasi altra forma, i livelli di immagine tipici dei prodotti Adobe e di altri strumenti grafici possono essere implementati facilmente utilizzando SVGGElement. Questo JavaScript è essenzialmente un comando Sposta sotto .
parent.insertBefore(parent.removeChild(gRobot), gDoorway)
Se lo strato di un robot disegnato come figli di SVGGElement gRobot era davanti alla porta disegnato come figli di SVGGElement gDoorway, il robot è ora dietro la porta perché l'ordine z della porta ora è uno più l'ordine z del robot.
Un comando Sposta sopra è quasi altrettanto semplice.
parent.insertBefore(parent.removeChild(gRobot), gDoorway.nextSibling())
Basti pensare a = a e b = b per ricordare questo.
insert after = move above
insert before = move below
Lasciare il DOM in uno stato coerente con la vista
Il motivo per cui questa risposta è corretta è perché è minimo e completo e, come gli interni dei prodotti Adobe o altri editor grafici ben progettati, lascia la rappresentazione interna in uno stato coerente con la vista creata dal rendering.
Approccio alternativo ma limitato
Un altro approccio comunemente usato è quello di utilizzare CSS z-index insieme a più frammenti di documenti SVG (tag SVG) con sfondi per lo più trasparenti in tutti tranne quello in basso. Ancora una volta, questo sconfigge l'eleganza del modello di rendering SVG, rendendo difficile spostare gli oggetti verso l'alto o verso il basso nell'ordine z.
APPUNTI:
- ( https://www.w3.org/TR/SVG/render.html v 1.1, 2a edizione, 16 agosto 2011)
3.3 Ordine di rendering Gli elementi in un frammento di documento SVG hanno un ordine di disegno implicito, con i primi elementi nel frammento di documento SVG che vengono prima "dipinti". Gli elementi successivi sono dipinti sopra gli elementi precedentemente dipinti.
3.4 Modalità di rendering dei gruppi Il raggruppamento di elementi come l'elemento 'g' (vedere gli elementi contenitore) ha l'effetto di produrre una tela separata temporanea inizializzata in nero trasparente su cui sono dipinti gli elementi figlio. Al completamento del gruppo, tutti gli effetti filtro specificati per il gruppo vengono applicati per creare un'area di disegno temporanea modificata. La tela temporanea modificata viene composta sullo sfondo, tenendo conto delle impostazioni di mascheramento e opacità a livello di gruppo sul gruppo.