J'utilise les cercles svg dans mon projet comme ça,
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 120">
<g>
<g id="one">
<circle fill="green" cx="100" cy="105" r="20" />
</g>
<g id="two">
<circle fill="orange" cx="100" cy="95" r="20" />
</g>
</g>
</svg>
Et j'utilise le z-index dans la g
balise pour montrer les éléments en premier. Dans mon projet, je dois utiliser uniquement la valeur z-index, mais je ne peux pas utiliser le z-index pour mes éléments svg. J'ai beaucoup cherché sur Google mais je n'ai rien trouvé de relativement. Alors s'il vous plaît, aidez-moi à utiliser z-index dans mon svg.
Voici la DEMO.
javascript
jquery
svg
z-index
Karthi Keyan
la source
la source
Réponses:
spécification
Dans la version 1.1 de la spécification SVG, l'ordre de rendu est basé sur l'ordre des documents:
Référence au SVG 1.1. spécification
Solution (plus propre plus rapide)
Vous devez mettre le cercle vert comme dernier objet à dessiner. Alors échangez les deux éléments.
Voici le fork de votre jsFiddle .
Solution (alternative)
La balise
use
avec l'attributxlink:href
et comme valeur l'id de l'élément. Gardez à l'esprit que ce n'est peut-être pas la meilleure solution même si le résultat semble correct. Ayant un peu de temps, voici le lien de la spécification SVG 1.1 Element "use" .Remarques sur SVG 2
La spécification SVG 2 est la prochaine version majeure et prend toujours en charge les fonctionnalités ci-dessus.
la source
Comme d'autres l'ont dit ici, le z-index est défini par l'ordre d'apparition de l'élément dans le DOM. Si la réorganisation manuelle de votre html n'est pas une option ou serait difficile, vous pouvez utiliser D3 pour réorganiser les groupes / objets SVG.
Utilisez D3 pour mettre à jour l'ordre DOM et imiter la fonctionnalité Z-Index
Mise à jour de l'index Z de l'élément SVG avec D3
Au niveau le plus basique (et si vous n'utilisez pas d'identifiants pour autre chose), vous pouvez utiliser les identifiants d'élément comme substitut pour z-index et réorganiser avec ceux-ci. Au-delà de cela, vous pouvez à peu près laisser libre cours à votre imagination.
Exemples dans l'extrait de code
L'idée de base est:
Utilisez D3 pour sélectionner les éléments DOM SVG.
Créez un tableau d'indices z avec une relation 1: 1 avec vos éléments SVG (que vous souhaitez réorganiser). Les tableaux d'index Z utilisés dans les exemples ci-dessous sont les ID, les positions x et y, les rayons, etc.
Ensuite, utilisez D3 pour lier vos z-index à cette sélection.
Enfin, appelez D3.sort pour réorganiser les éléments dans le DOM en fonction des données.
Exemples
[3,4,1,2,5]
déplace / réorganise le 3ème cercle (dans l'ordre HTML d'origine) pour être 1er dans le DOM, 4ème pour être 2ème, 1er pour être 3ème , etc...la source
Essayez d'inverser
#one
et#two
. Jetez un œil à ce violon: http://jsfiddle.net/hu2pk/3/Update
En SVG, le z-index est défini par l'ordre dans lequel l'élément apparaît dans le document . Vous pouvez également consulter cette page si vous le souhaitez: https://stackoverflow.com/a/482147/1932751
la source
d3.selection.prototype.moveToFront = function() { return this.each(function() { this.parentNode.appendChild(this); }); };
Et puis vous pouvez direselection.moveToFront()
via stackoverflow.com/questions/14167863Vous pouvez utiliser use .
Le cercle vert apparaît en haut.
jsFiddle
la source
#one
est dessiné deux fois. Mais si vous le souhaitez, vous pouvez masquer la première instance via CSS.use
a le même effet que le clonage de l'élément DOM référencé<g>
lui - même lors du changement de DOM avant de charger de toute façon.Comme discuté, les svgs sont rendus dans l'ordre et ne prennent pas en compte le z-index (pour l'instant). Peut-être simplement envoyer l'élément spécifique au bas de son parent afin qu'il soit rendu en dernier.
A travaillé pour moi.
Mettre à jour
Si vous avez un SVG imbriqué, contenant des groupes, vous devrez retirer l'élément de son nœud parent.
Une fonctionnalité intéressante des SVG est que chaque élément contient son emplacement quel que soit le groupe dans lequel il est imbriqué: +1:
la source
En utilisant D3:
Si vous souhaitez réinsérer chaque élément sélectionné, dans l'ordre, en tant que dernier enfant de son parent.
la source
selection.raise()
est nouveau dans D3 à partir de la v4.Il n'y a pas d'index z pour les svgs. Mais svg détermine lesquels de vos éléments sont les plus élevés par leur position dans le DOM. Ainsi, vous pouvez supprimer l'objet et le placer à la fin du svg, ce qui en fait l'élément "dernier rendu". Celui-ci est ensuite rendu "le plus haut" visuellement.
Utilisation de jQuery:
usage:
En utilisant D3.js:
usage:
la source
En utilisant D3:
Si vous souhaitez ajouter l'élément dans l'ordre inverse de l'utilisation des données:
Au lieu de .append
Ajout d'un élément en haut d'un élément de groupe
la source
Une autre solution serait d'utiliser des divs, qui utilisent zIndex pour contenir les éléments SVG, comme ici: https://stackoverflow.com/a/28904640/4552494
la source
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.
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.
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 .
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.
Pensez simplement à a = a et b = b pour vous en souvenir.
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:
la source
Nous avons déjà 2019 et
z-index
n'est toujours pas pris en charge en SVG.Vous pouvez voir sur le site SVG2 support dans Mozilla que l'état pour
z-index
- Non implémenté .Vous pouvez également voir sur le site le bogue 360148 "Supporte la propriété 'z-index' sur les éléments SVG" (rapporté: il y a 12 ans).
Mais vous avez 3 possibilités en SVG pour le paramétrer:
element.appendChild(aChild);
parentNode.insertBefore(newNode, referenceNode);
targetElement.insertAdjacentElement(positionStr, newElement);
(pas de support dans IE pour SVG)Exemple de démonstration interactive
Avec toutes ces 3 fonctions.
la source
Poussez l'élément SVG pour durer, de sorte que son z-index soit en haut. En SVG, il n'y a pas de propriété appelée z-index. essayez ci-dessous javascript pour amener l'élément en haut.
Cible: est un élément pour lequel nous devons l'amener au sommet svg: est le conteneur d'éléments
la source
c'est facile à faire:
la source