Les solutions propres, rapides et faciles affichées à la date de cette réponse ne sont pas satisfaisantes. Ils sont construits sur l'affirmation erronée selon laquelle 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 xyz.
L'ordre Z existe définitivement dans les fragments de document SVG
Ce qu'on appelle un fragment de document SVG est une arborescence 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 à une balise HTML5 <svg> . Le SVGGElement correspond à la balise <g> et permet d'agréger les enfants.
Avoir un attribut z-index sur le SVGElement comme dans CSS annulerait le modèle de rendu SVG. Les sections 3.3 et 3.4 de la recommandation W3C SVG v1.1 2ème édition indiquent que les fragments de document SVG (arbres des descendants d'un SVGSVGElement) sont rendus en utilisant ce que l'on appelle une première recherche approfondie de l'arbre . Ce schéma est d'ordre az dans tous les sens du terme.
L'ordre Z est en fait un raccourci de vision par ordinateur pour éviter le besoin d'un véritable rendu 3D avec les complexités et les exigences informatiques du lancer de rayons. L'équation linéaire de 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
Ceci est important car si vous voulez déplacer un cercle qui était en dessous d'un carré au-dessus, vous insérez simplement 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 prennent en charge une manipulation simple et facile de l'ordre z.
- parent.removeChild (enfant)
- parent.insertBefore (enfant, childRef)
La bonne réponse qui ne crée pas de gâchis
Étant donné que le SVGGElement ( balise <g> ) peut être supprimé et inséré aussi facilement qu'un SVGCircleElement ou toute autre forme, les couches d'image typiques des produits Adobe et d'autres outils graphiques peuvent être implémentées facilement à l'aide de SVGGElement. Ce JavaScript est essentiellement une commande Déplacer ci-dessous .
parent.insertBefore(parent.removeChild(gRobot), gDoorway)
Si la couche d'un robot dessiné en tant qu'enfants de SVGGElement gRobot était avant la porte dessinée en tant qu'enfants de SVGGElement gDoorway, le robot est maintenant derrière la porte car l'ordre z de la porte est maintenant un plus l'ordre z du robot.
Une commande Déplacer au-dessus est presque aussi simple.
parent.insertBefore(parent.removeChild(gRobot), gDoorway.nextSibling())
Pensez simplement à a = a et b = b pour vous 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 composants internes des produits Adobe ou d'autres éditeurs graphiques bien conçus, laisse la représentation interne dans un état cohérent avec la vue créée par le rendu.
Approche alternative mais limitée
Une autre approche couramment utilisée consiste à utiliser CSS z-index en conjonction avec plusieurs fragments de document SVG (balises SVG) avec des arrière-plans principalement transparents dans tous sauf celui du bas. Encore une fois, cela va à l'encontre de l'élégance du modèle de rendu SVG, ce qui rend difficile le déplacement des objets vers le haut ou vers le bas dans l'ordre z.
REMARQUES:
- ( 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 fragment de document SVG étant "peints" en premier. Les éléments suivants sont peints au-dessus des éléments déjà peints.
3.4 Comment les groupes sont rendus Les éléments de regroupement tels que l'élément «g» (voir les éléments conteneurs) ont pour effet de produire un canevas séparé temporaire initialisé en noir transparent sur lequel les éléments enfants sont peints. Une fois le groupe terminé, tous les effets de filtre spécifiés pour le groupe sont appliqués pour créer un canevas temporaire modifié. Le canevas temporaire modifié est composé en arrière-plan, en tenant compte des paramètres de masquage et d'opacité au niveau du groupe sur le groupe.