Estou usando os círculos svg no meu projeto assim,
<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>
E eu estou usando o z-index na g
tag para mostrar os elementos primeiro. No meu projeto, preciso usar apenas o valor do índice z, mas não posso usar o índice z nos meus elementos svg. Pesquisei bastante no Google, mas não encontrei nada relativamente. Então, por favor me ajude a usar o z-index no meu svg.
Aqui está a demo.
javascript
jquery
svg
z-index
Karthi Keyan
fonte
fonte
Respostas:
Especificação
Na especificação SVG versão 1.1, a ordem de renderização é baseada na ordem do documento:
Referência ao SVG 1.1. Especificação
Solução (limpador mais rápido)
Você deve colocar o círculo verde como o último objeto a ser desenhado. Então troque os dois elementos.
Aqui o garfo do seu jsFiddle .
Solução (alternativa)
A tag
use
com o atributoxlink:href
e, como valor, o ID do elemento. Lembre-se de que talvez não seja a melhor solução, mesmo que o resultado pareça bom. Tendo um pouco de tempo, aqui o link da especificação SVG 1.1 "use" Element .Notas sobre SVG 2
A especificação SVG 2 é a próxima versão principal e ainda suporta os recursos acima.
fonte
Como outros aqui disseram, o índice z é definido pela ordem em que o elemento aparece no DOM. Se reordenar manualmente o html não for uma opção ou for difícil, use o D3 para reordenar grupos / objetos SVG.
Use D3 para atualizar a ordem do DOM e imitar a funcionalidade do índice Z
Atualizando o índice Z do elemento SVG com D3
No nível mais básico (e se você não estiver usando IDs para mais nada), é possível usar IDs de elemento como substituto do índice z e reordená-los. Além disso, você pode praticamente deixar sua imaginação correr solta.
Exemplos no snippet de código
A ideia básica é:
Use D3 para selecionar os elementos SVG DOM.
Crie uma matriz de índices z com um relacionamento 1: 1 com seus elementos SVG (que você deseja reordenar). Matrizes de índice Z usadas nos exemplos abaixo são IDs, posição x e y, raios, etc.
Em seguida, use D3 para vincular seus índices z a essa seleção.
Por fim, chame D3.sort para reordenar os elementos no DOM com base nos dados.
Exemplos
[3,4,1,2,5]
move / reordena o terceiro círculo (na ordem HTML original) para ser o 1º no DOM, o 4º para o 2º, o 1º para o 3º , e assim por diante...fonte
Tente inverter
#one
e#two
. Dê uma olhada neste violino: http://jsfiddle.net/hu2pk/3/Update
No SVG, o índice z é definido pela ordem em que o elemento aparece no documento . Você também pode consultar esta página se quiser: https://stackoverflow.com/a/482147/1932751
fonte
d3.selection.prototype.moveToFront = function() { return this.each(function() { this.parentNode.appendChild(this); }); };
E então você pode dizerselection.moveToFront()
via stackoverflow.com/questions/14167863/...Você pode usar use .
O círculo verde aparece no topo.
jsFiddle
fonte
#one
é sorteado duas vezes. Mas se você quiser, pode ocultar a primeira instância por meio do CSS.use
tem o mesmo efeito que a clonagem do referido elemento DOM<g>
si ao alterar o DOM antes de carregar de qualquer maneira.Conforme discutido, os svgs são renderizados em ordem e não levam em consideração o z-index (por enquanto). Talvez apenas envie o elemento específico para a parte inferior do pai, para que seja renderizado por último.
Trabalhou para mim.
Atualizar
Se você tiver um SVG aninhado, contendo grupos, será necessário trazer o item para fora de seu parentNode.
Um bom recurso dos SVGs é que cada elemento contém sua localização, independentemente do grupo em que está aninhado: +1:
fonte
Usando D3:
Se você deseja reinserir cada elemento selecionado, em ordem, como o último filho de seu pai.
fonte
selection.raise()
é novo no D3 a partir da v4.Não há z-index para svgs. Mas svg determina quais dos seus elementos são os mais altos por sua posição no DOM. Assim, você pode remover o Objeto e colocá-lo no final do svg, tornando-o o último elemento renderizado. Aquele é então renderizado "no topo" visualmente.
Usando jQuery:
uso:
Usando D3.js:
uso:
fonte
Usando D3:
Se você deseja adicionar o elemento na ordem inversa aos dados, use:
Em vez de .append
Adicionando um elemento ao topo de um elemento de grupo
fonte
Outra solução seria usar divs, que usam zIndex para conter os elementos SVG.Como aqui: https://stackoverflow.com/a/28904640/4552494
fonte
As soluções limpas, rápidas e fáceis publicadas na data desta resposta são insatisfatórias. Eles são construídos sobre a afirmação falsa de que os documentos SVG não possuem ordem z. Bibliotecas também não são necessárias. Uma linha de código pode executar a maioria das operações para manipular a ordem z de objetos ou grupos de objetos que podem ser necessários no desenvolvimento de um aplicativo que move objetos 2D em um espaço xyz.
A ordem Z existe definitivamente em fragmentos de documento SVG
O que é chamado de fragmento de documento SVG é uma árvore de elementos derivados do tipo de nó base SVGElement. O nó raiz de um fragmento de documento SVG é um SVGSVGElement, que corresponde a uma tag HTML5 <svg> . O SVGGElement corresponde à tag <g> e permite agregar filhos.
Ter um atributo z-index no SVGElement como no CSS derrotaria o modelo de renderização SVG. As seções 3.3 e 3.4 da Recomendação W3C SVG v1.1 2ª Edição afirmam que fragmentos de documento SVG (árvores de descendentes de um SVGSVGElement) são renderizados usando o que é chamado de pesquisa inicial em profundidade da árvore . Esse esquema é uma ordem em todos os sentidos do termo.
A ordem Z é na verdade um atalho de visão computacional para evitar a necessidade de renderização 3D verdadeira com as complexidades e demandas computacionais do traçado de raios. A equação linear para o índice z implícito de elementos em um fragmento de documento SVG.
Isso é importante porque se você deseja mover um círculo que estava abaixo de um quadrado para acima dele, basta inserir o quadrado antes do círculo. Isso pode ser feito facilmente em JavaScript.
Métodos de suporte
As instâncias do SVGElement têm dois métodos que oferecem suporte à manipulação simples e fácil da ordem z.
A resposta correta que não cria uma bagunça
Como a SVGGElement ( tag <g> ) pode ser removida e inserida tão facilmente quanto um SVGCircleElement ou qualquer outra forma, as camadas de imagem típicas dos produtos Adobe e outras ferramentas gráficas podem ser implementadas com facilidade usando o SVGGElement. Esse JavaScript é essencialmente um comando Mover para baixo .
Se a camada de um robô desenhada como filho de SVGGElement gRobot estava antes da porta desenhada como filho de SVGGElement gDoorway, o robô agora está atrás da porta porque a ordem z da porta agora é uma mais a ordem z do robô.
Um comando Mover para cima é quase tão fácil.
Basta pensar em a = aeb = b para lembrar disso.
Deixando o DOM em um estado consistente com a exibição
A razão pela qual essa resposta está correta é porque é mínima e completa e, como os produtos internos da Adobe ou outros editores de gráficos bem projetados, deixa a representação interna em um estado consistente com a exibição criada pela renderização.
Abordagem alternativa, mas limitada
Outra abordagem comumente usada é usar o índice z CSS em conjunto com vários fragmentos de documento SVG (tags SVG), com fundos transparentes na maioria dos casos, exceto o inferior. Novamente, isso anula a elegância do modelo de renderização SVG, dificultando a movimentação de objetos para cima ou para baixo na ordem z.
NOTAS:
fonte
Já temos 2019 e
z-index
ainda não temos suporte no SVG.Você pode ver no site SVG2 support no Mozilla que o estado para
z-index
- Não implementado .Você também pode ver no site Bug 360148 "Suporte à propriedade 'z-index' nos elementos SVG" (Reportado: 12 anos atrás).
Mas você tem 3 possibilidades no SVG para configurá-lo:
element.appendChild(aChild);
parentNode.insertBefore(newNode, referenceNode);
targetElement.insertAdjacentElement(positionStr, newElement);
(sem suporte no IE para SVG)Exemplo de demonstração interativa
Com todas essas 3 funções.
fonte
Pressione o elemento SVG para durar, para que seu índice z fique no topo. No SVG, não há nenhuma propriedade chamada z-index. tente abaixo do javascript para trazer o elemento para o topo.
Alvo: É um elemento para o qual precisamos trazê-lo para o topo svg: É o contêiner de elementos
fonte
é fácil fazê-lo:
fonte