Con JavaScript, posso cambiare l'indice Z / layer di un elemento <g> SVG?


Risposte:


114

L'indice Z in SVG è definito dall'ordine in cui gli elementi appaiono nel documento. Dovrai cambiare l'ordine degli elementi se vuoi portare una forma specifica in alto.


1
@theonlygusti Gli elementi alla fine del documento sono in alto. Se stai usando jQuery, dovresti essere in grado di usare qualcosa come$('#thing-i-want-on-top').appendTo('#my-svg');
Adam Bradley,

Quindi, in pratica, non c'è modo di far fluttuare una forma verso l'alto (asse z) al passaggio del mouse ...?
chharvey

jQuery non supporta la modifica dell'ordine dei percorsi SVG.
Senthe

5
@chharvey, puoi spostare le cose in alto riordinandole - riapplicandole. Ecco un esempio elegante: codepen.io/osublake/pen/YXoEQe
Frazer Kirkman

36

Un'alternativa allo spostamento di elementi nell'albero consiste nell'usare <use>elementi in cui si modifica il filexlink:href attributo in modo da ottenere l'ordinamento z desiderato.

Ecco un vecchio thread sulla mailinglist degli sviluppatori SVG che discute di questo argomento nel contesto del desiderio di animare alcune forme.

Aggiornare:

<svg xmlns="http://www.w3.org/2000/svg" 
     xmlns:xlink="http://www.w3.org/1999/xlink"
     style="width:100%; height: 100%">
    <circle id="c1" cx="50" cy="50" r="40" fill="lime" />
    <rect id="r1" x="4" y="20" width="200" height="50" fill="cyan" />
    <circle id="c2" cx="70" cy="70" r="50" fill="fuchsia" />
    <use id="use" xlink:href="#c1" />
</svg>

In questo esempio l'elemento <use> è l'ultimo, il che lo rende l'elemento in primo piano. Possiamo scegliere uno qualsiasi degli altri elementi per agire come in primo piano semplicemente cambiando l' xlink:hrefattributo. Nell'esempio sopra abbiamo scelto il cerchio con id="c1", che lo fa apparire come l'elemento più in alto.

Vedi violino .


1
Questa risposta sarebbe molto più utile con un esempio o con le informazioni da quella mailing list (che è chiusa).
Kyeotic

3
Funziona, ma ti fa aggiungere l'uso in modo appropriato. Se usi traduzioni, <use> non ne ha idea
Jochen Bedersdorfer,

@JochenBedersdorfer non sei sicuro di cosa intendi, in che modo le traduzioni sono correlate all'ordinamento z?
Erik Dahlström

Non era molto chiaro al riguardo. Se si utilizzano tag <g> annidati con trasformazioni, è necessario convertire le coordinate utilizzando getTransformToElement (..); (vedi documenti SVG)
Jochen Bedersdorfer

3
xlink:hrefè deprecato, ora è solohref
osvein

22

Questa è una vecchia domanda, ma ...

Su FireFox (7+) e Chrome (14+) puoi spostare svg_element in alto. Questo non ti dà la libertà di controllo completo dell'asse z, ma è meglio di niente;)

Basta aggiungere di nuovo quell'elemento.

var svg = doc.createElemNS('svg');
var circle = doc.createElemNS('circle');
var line = doc.createElemNS('line');

svg.appendChild(circle); // appends it
svg.appendChild(line);   // appends it over circle
svg.appendChild(circle); // redraws it over line now

Ho pensato che avrebbe generato un errore o qualcosa del genere.

appendChild == si sostituisce == ridisegna


3
Non è affatto un errore; appendChildprima rimuove dal vecchio genitore, se presente, anche se è uguale al nuovo genitore, quindi lo aggiunge all'elenco dei figli del nuovo genitore.
Potatoswatter

5

Un'altra soluzione non menzionata consiste nell'inserire ogni elemento / set di elementi svg in un div. Puoi modificare facilmente lo z-index dei div.

Fiddle: cicli di elementi SVG con z-index per contenitori

... Premere i pulsanti per "spingere" l'elemento in avanti. (vs ridipingere l'intero set e spingere 1 elemento in primo piano, ma mantenendo l'ordine originale come nella soluzione accettata)

Sarebbe molto bello avere indici z relativi ...

stackOverflow vuole che metta il codice se è un collegamento da jsfiddle? ... ook




3

SVGutilizza un "modello di pittura" di rendering. La vernice viene applicata in operazioni successive al dispositivo di uscita in modo tale che ciascuna operazione dipinga su una certa area del dispositivo di uscita. Quando l'area si sovrappone a un'area dipinta in precedenza, la nuova vernice oscura parzialmente o completamente la vecchia.- collegamento a questo


3

In SVG, per ottenere un indice Z più alto, dovresti spostare l'elemento in basso nell'albero DOM. Puoi farlo con jQuery, selezionando l'elemento SVG, rimuovendolo e aggiungendolo di nuovo nella posizione che desideri:

$('g.element').remove().appendTo('svg');

2

Il commento di Adam Bradley alla risposta di Sam era esattamente perfetto. Utilizza jQuery anziché solo CSS, ma ha detto questo:

$('#thing-i-want-on-top').appendTo('#my-svg');

Tuttavia, per quello che stavo creando, avevo bisogno che il mio percorso SVG fosse sopra qualsiasi altro percorso al passaggio del mouse, ma fosse ancora sotto il mio testo SVG. Quindi ecco cosa ho pensato:

$('#thing-i-want-on-top').insertBefore('#id-for-svg-text');

Sia appendTo che insertBefore sposteranno il tuo elemento in una nuova posizione permettendoti di cambiare la profondità dell'elemento SVG a piacimento.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.