Les solutions propres, rapides et faciles affichées à la date de cette réponse ne sont pas satisfaisantes. Elles sont construites sur l'affirmation erronée que les documents SVG manquent d'ordre z. Les bibliothèques ne sont pas non plus nécessaires. Une ligne de code peut effectuer la plupart des opérations pour manipuler l'ordre z des objets ou des groupes d'objets qui pourraient être nécessaires dans le développement d'une application qui déplace des objets 2D dans un espace x-y-z.
L'ordre Z existe définitivement dans les fragments de documents SVG
Ce que l'on appelle un fragment de document SVG est un arbre d'éléments dérivés du type de nœud de base SVGElement. Le nœud racine d'un fragment de document SVG est un SVGSVGElement, qui correspond à un HTML5 <svg> étiquette. Le SVGGElement correspond à l'élément <g> et permet d'agréger les enfants.
Avoir un attribut z-index sur l'élément SVGE comme en CSS irait à l'encontre du modèle de rendu SVG. Les sections 3.3 et 3.4 de la Recommandation SVG v1.1 2nd Edition du W3C stipulent que les fragments de document SVG (arbres de descendants d'un SVGSVGElement) sont rendus en utilisant ce qu'on appelle un profondeur première recherche de l'arbre . Ce dispositif est un ordre z dans tous les sens du terme.
L'ordre Z est en fait un raccourci de la vision par ordinateur pour éviter la nécessité d'un véritable rendu 3D avec les complexités et les exigences informatiques du ray tracing. L'équation linéaire pour l'indice z implicite des éléments dans un fragment de document SVG.
z-index = z-index_of_svg_tag + depth_first_tree_index / tree_node_qty
C'est important car si vous souhaitez déplacer un cercle qui se trouvait sous un carré vers le haut, il vous suffit d'insérer le carré avant le cercle. Cela peut être fait facilement en JavaScript.
Méthodes de soutien
Les instances de SVGElement ont deux méthodes qui permettent de manipuler l'ordre z de manière simple et facile.
- parent.removeChild(child)
- parent.insertBefore(child, childRef)
La bonne réponse qui ne crée pas de désordre
Parce que l'élément SVGGElement ( <g> ) peuvent être retirées et insérées aussi facilement qu'un SVGCircleElement ou toute autre forme, les couches d'images typiques des produits Adobe et d'autres outils graphiques peuvent être implémentées avec facilité en utilisant le SVGGElement. Ce JavaScript est essentiellement un Move Below commandement.
parent.insertBefore(parent.removeChild(gRobot), gDoorway)
Si le calque d'un robot dessiné en tant qu'enfant de SVGGElement gRobot était avant la porte dessinée en tant qu'enfant de SVGGElement gDoorway, le robot est maintenant derrière la porte parce que l'ordre z de la porte est maintenant un plus l'ordre z du robot.
A Passez à la vitesse supérieure est presque aussi facile.
parent.insertBefore(parent.removeChild(gRobot), gDoorway.nextSibling())
Il suffit de penser a=a et b=b pour s'en souvenir.
insert after = move above
insert before = move below
Laisser le DOM dans un état cohérent avec la vue
La raison pour laquelle cette réponse est correcte est qu'elle est minimale et complète et, comme les internes des produits Adobe ou d'autres éditeurs graphiques bien conçus, laisse la représentation interne dans un état qui est cohérent avec la vue créée par le rendu.
Approche alternative mais limitée
Une autre approche couramment utilisée consiste à utiliser le z-index CSS en conjonction avec plusieurs fragments de document SVG (balises SVG) avec des arrière-plans essentiellement transparents dans tous les fragments sauf celui du bas. Là encore, cela va à l'encontre de l'élégance du modèle de rendu SVG, car il est difficile de déplacer les objets vers le haut ou vers le bas dans l'ordre z.
NOTES :
-
( https://www.w3.org/TR/SVG/render.html v 1.1, 2e édition, 16 août 2011)
3.3 Ordre de rendu Les éléments d'un fragment de document SVG ont un ordre de dessin implicite, les premiers éléments du document SVG sont "peints" en premier. Les éléments suivants sont peints sur par-dessus les éléments précédemment peints.
3.4 Comment les groupes sont rendus Les éléments de regroupement tels que l'élément 'g' (voir les éléments de conteneur) ont pour effet de produire un canevas temporaire temporaire initialisé à la couleur noire transparente sur lequel les éléments sont peints. Une fois le groupe terminé, tout effet de filtre spécifié pour le groupe est appliqué pour créer un canevas temporaire modifié. temporaire modifié. Le canevas temporaire modifié est intégré à l'arrière-plan arrière-plan, en tenant compte de tous les paramètres de masquage et d'opacité du groupe. du groupe.