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.
z-index = z-index_of_svg_tag + depth_first_tree_index / tree_node_qty
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.
- parent.removeChild (hijo)
- parent.insertBefore (child, childRef)
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 .
parent.insertBefore(parent.removeChild(gRobot), gDoorway)
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.
parent.insertBefore(parent.removeChild(gRobot), gDoorway.nextSibling())
Simplemente piense a = a y b = b para recordar esto.
insert after = move above
insert before = move below
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
- ( https://www.w3.org/TR/SVG/render.html v 1.1, segunda edición, 16 de agosto de 2011)
3.3 Elementos de orden de representación en un fragmento de documento SVG tienen un orden de dibujo implícito, con los primeros elementos en el fragmento de documento SVG "pintados" primero. Los elementos posteriores se pintan encima de los elementos pintados previamente.
3.4 Cómo se representan los grupos Los elementos de agrupación como el elemento 'g' (ver elementos contenedores) tienen el efecto de producir un lienzo separado temporal inicializado en negro transparente sobre el que se pintan los elementos secundarios. Al finalizar el grupo, los efectos de filtro especificados para el grupo se aplican para crear un lienzo temporal modificado. El lienzo temporal modificado se compone en segundo plano, teniendo en cuenta cualquier configuración de enmascaramiento y opacidad a nivel de grupo en el grupo.