Estoy usando los círculos svg en mi proyecto así,
<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>
Y estoy usando el índice z en la g
etiqueta para mostrar los elementos primero. En mi proyecto, necesito usar solo el valor del índice z, pero no puedo usar el índice z para mis elementos svg. He buscado mucho en Google pero no encontré nada relativamente. Entonces, por favor, ayúdame a usar el índice z en mi svg.
Aquí está la DEMO.
javascript
jquery
svg
z-index
Karthi Keyan
fuente
fuente
Respuestas:
Especificación
En la especificación SVG versión 1.1, el orden de representación se basa en el orden del documento:
Referencia a la SVG 1.1. Especificación
Solución (más limpia-más rápida)
Debe colocar el círculo verde como el último objeto que se dibujará. Entonces intercambie los dos elementos.
Aquí el tenedor de tu jsFiddle .
Solución (alternativa)
La etiqueta
use
con el atributoxlink:href
y como valor el id del elemento. Tenga en cuenta que podría no ser la mejor solución, incluso si el resultado parece estar bien. Teniendo un poco de tiempo, aquí el enlace de la especificación SVG 1.1 "use" Element .Notas sobre SVG 2
La especificación SVG 2 es la próxima versión principal y aún admite las características anteriores.
fuente
Como otros han dicho aquí, el índice z se define por el orden en que el elemento aparece en el DOM. Si reordenar manualmente su html no es una opción o sería difícil, puede usar D3 para reordenar grupos / objetos SVG.
Use D3 para actualizar el orden DOM y la funcionalidad del índice Z de Mimic
Actualización del índice Z del elemento SVG con D3
En el nivel más básico (y si no está usando ID para otra cosa), puede usar ID de elementos como sustituto para el índice z y reordenar con ellos. Más allá de eso, puedes dejar volar tu imaginación.
Ejemplos en fragmento de código
La idea básica es:
Use D3 para seleccionar los elementos DOM SVG.
Cree una serie de índices z con una relación 1: 1 con sus elementos SVG (que desea reordenar). Las matrices de índice Z utilizadas en los ejemplos a continuación son ID, posición x e y, radios, etc.
Luego, use D3 para vincular sus índices z a esa selección.
Por último, llame a D3.sort para reordenar los elementos en el DOM en función de los datos.
Ejemplos
[3,4,1,2,5]
mueve / reordena el tercer círculo (en el orden HTML original) para ser el primero en el DOM, el cuarto para ser el segundo, el primero para ser el tercero , y así...fuente
Intenta invertir
#one
y#two
. Echa un vistazo a este violín: http://jsfiddle.net/hu2pk/3/Update
En SVG, el índice z se define por el orden en que aparece el elemento en el documento . También puede echar un vistazo a esta página si lo desea: https://stackoverflow.com/a/482147/1932751
fuente
d3.selection.prototype.moveToFront = function() { return this.each(function() { this.parentNode.appendChild(this); }); };
Y luego puede decir aselection.moveToFront()
través de stackoverflow.com/questions/14167863/…Puedes usar el uso .
El círculo verde aparece en la parte superior.
jsFiddle
fuente
#one
se dibuja dos veces. Pero si lo desea, puede ocultar la primera instancia a través de CSS.use
tiene el mismo efecto que clonar el elemento DOM referido<g>
sí mismo al cambiar el DOM antes de cargar de todos modos.Como se discutió, los svgs se procesan en orden y no tienen en cuenta el índice z (por ahora). Tal vez solo envíe el elemento específico a la parte inferior de su padre para que se procese al final.
Trabajó para mi.
Actualizar
Si tiene un SVG anidado, que contiene grupos, deberá sacar el elemento de su nodo principal.
Una buena característica de SVG es que cada elemento contiene su ubicación independientemente del grupo en el que esté anidado: +1:
fuente
Usando D3:
Si desea volver a insertar cada elemento seleccionado, en orden, como el último hijo de su padre.
fuente
selection.raise()
es nuevo en D3 a partir de v4.No hay índice z para svgs. Pero svg determina cuáles de sus elementos son los más altos por su posición en el DOM. Por lo tanto, puede eliminar el Objeto y colocarlo al final del svg, convirtiéndolo en el elemento "último renderizado". Ese se convierte en "superior" visualmente.
Usando jQuery:
uso:
Usando D3.js:
uso:
fuente
Usando D3:
Si desea agregar el elemento en el orden inverso al uso de datos:
En lugar de .append
Agregar un elemento a la parte superior de un elemento de grupo
fuente
Otra solución sería usar divs, que usan zIndex para contener los elementos SVG. Como aquí: https://stackoverflow.com/a/28904640/4552494
fuente
Las soluciones limpias, rápidas y fáciles publicadas a la fecha de esta respuesta no son satisfactorias. Se construyen sobre la afirmación errónea de que los documentos SVG carecen de orden z. Las bibliotecas tampoco son necesarias. Una línea de código puede realizar la mayoría de las operaciones para manipular el orden z de objetos o grupos de objetos que podrían ser necesarios en el desarrollo de una aplicación que mueva objetos 2D en un espacio xyz.
El orden Z definitivamente existe en los fragmentos de documentos SVG
Lo que se llama un fragmento de documento SVG es un árbol de elementos derivados del tipo de nodo base SVGElement. El nodo raíz de un fragmento de documento SVG es un elemento SVGSVGE, que corresponde a una etiqueta HTML5 <svg> . SVGGElement corresponde a la etiqueta <g> y permite agregar elementos secundarios .
Tener un atributo de índice z en el elemento SVGE como en CSS derrotaría al modelo de representación SVG. Las secciones 3.3 y 3.4 de la Recomendación v3.1 SV3 del W3C, segunda edición, establecen que los fragmentos de documentos SVG (árboles de descendientes de un elemento SVGSVGE) se procesan utilizando lo que se denomina una primera búsqueda en profundidad del árbol . Ese esquema es un orden az en todos los sentidos del término.
El orden Z es en realidad un atajo de visión por computadora para evitar la necesidad de una verdadera representación 3D con las complejidades y las demandas informáticas del trazado de rayos. La ecuación lineal para el índice z implícito de elementos en un fragmento de documento SVG.
Esto es importante porque si desea mover un círculo que estaba debajo de un cuadrado hacia arriba, simplemente inserte el cuadrado antes del círculo. Esto se puede hacer fácilmente en JavaScript.
Métodos de apoyo
Las instancias de SVGElement tienen dos métodos que admiten la manipulación simple y fácil del orden z.
La respuesta correcta que no crea un desastre
Debido a que SVGGElement ( etiqueta <g> ) se puede quitar e insertar tan fácilmente como un SVGCircleElement o cualquier otra forma, las capas de imagen típicas de los productos de Adobe y otras herramientas gráficas se pueden implementar con facilidad usando SVGGElement. Este JavaScript es esencialmente un comando Mover a continuación .
Si la capa de un robot dibujado como hijos de SVGGElement gRobot estaba antes de la puerta dibujada como hijos de SVGGElement gDoorway, el robot ahora está detrás de la puerta porque el orden z de la puerta ahora es uno más el orden z del robot.
Un comando Mover arriba es casi tan fácil.
Simplemente piense a = a y b = b para recordar esto.
Dejar el DOM en un estado coherente con la vista
La razón por la cual esta respuesta es correcta es porque es mínima y completa y, al igual que las partes internas de los productos de Adobe u otros editores de gráficos bien diseñados, deja la representación interna en un estado que es consistente con la vista creada al renderizar.
Enfoque alternativo pero limitado
Otro enfoque comúnmente utilizado es usar CSS z-index junto con múltiples fragmentos de documentos SVG (etiquetas SVG) con fondos mayormente transparentes en todos, excepto en el inferior. Nuevamente, esto derrota la elegancia del modelo de renderizado SVG, lo que dificulta mover los objetos hacia arriba o hacia abajo en el orden z.
NOTAS
fuente
Ya tenemos 2019 y
z-index
todavía no es compatible con SVG.Puede ver en el sitio soporte SVG2 en Mozilla que el estado para
z-index
- No implementado .También puede ver en el sitio el error 360148 "Soporte de la propiedad 'z-index' en elementos SVG" (Reportado: hace 12 años).
Pero tienes 3 posibilidades en SVG para configurarlo:
element.appendChild(aChild);
parentNode.insertBefore(newNode, referenceNode);
targetElement.insertAdjacentElement(positionStr, newElement);
(Sin soporte en IE para SVG)Ejemplo de demostración interactiva
Con todo esto 3 funciones.
fuente
Presione el elemento SVG para que dure, de modo que su índice z esté en la parte superior. En SVG, no hay ninguna propiedad llamada índice z. intente debajo de javascript para llevar el elemento al principio.
Objetivo: es un elemento para el que debemos llevarlo al principio svg: es el contenedor de elementos
fuente
es fácil hacerlo:
fuente