JavaScript ile, bir SVG <g> öğesinin Z dizinini / katmanını değiştirebilir miyim?


Yanıtlar:


114

SVG'deki Z dizini, öğelerin belgede görünme sırasına göre tanımlanır. En üste belirli bir şekil getirmek istiyorsanız, eleman sırasını değiştirmeniz gerekecektir.


1
@theonlygusti Belgenin sonundaki öğeler en üsttedir. JQuery kullanıyorsanız, buna benzer bir şey kullanabilmelisiniz$('#thing-i-want-on-top').appendTo('#my-svg');
Adam Bradley

Yani, temel olarak, üzerine gelindiğinde bir şekli en üste (z ekseni) kaydırmanın bir yolu yok…?
chharvey

jQuery, SVG yollarının sırasının değiştirilmesini desteklemez.
Senthe

5
@chharvey, her şeyi yeniden sıralayarak en üste taşıyabilirsiniz - yeniden ekleyerek. İşte zarif bir örnek: codepen.io/osublake/pen/YXoEQe
Frazer Kirkman

36

Ağaçtaki öğeleri hareket ettirmeye bir alternatif, <use>değiştirdiğiniz öğeleri kullanmaktır .xlink:href size istediğiniz z sıralamasını verecek şekilde niteliği .

İşte svg geliştiricileri posta listesindeki eski bir konu , bu konuyu bazı şekilleri canlandırmak isteme bağlamında tartışıyor.

Güncelleme:

<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>

Bu örnekte <use> öğesi son öğedir ve bu onu en öndeki öğe yapar. Sadece xlink:hrefözniteliği değiştirerek diğer unsurlardan herhangi birini en önde hareket edecek şekilde seçebiliriz . Yukarıdaki örnekte id="c1", en üstteki öğe olarak görünmesini sağlayan daireyi seçtik .

Keman görün .


1
Bu cevap , bir örnekle veya bu posta listesinden gelen bilgilerle (kapılı) çok daha yararlı olacaktır .
Kyeotic

3
Çalışır, ancak uygun şekilde kullanmanızı sağlar. Çevirileri kullanırsanız, <use> onlar hakkında hiçbir fikre sahip değildir
Jochen Bedersdorfer

@JochenBedersdorfer ne demek istediğinizden emin değilim, çeviriler z sıralaması ile nasıl ilişkilidir?
Erik Dahlström

Bu konuda pek net değildim. Dönüşümlerle iç içe geçmiş <g> -tag'ler kullanırsanız, koordinatları getTransformToElement (..) kullanarak dönüştürmeniz gerekir; (SVG belgelerine bakın)
Jochen Bedersdorfer

3
xlink:hrefkullanımdan kaldırıldı, şimdi sadecehref
osvein

22

Bu eski bir soru, ama ...

FireFox (7+) ve Chrome'da (14+) svg_element'i en üste çekebilirsiniz. Bu size tam z ekseni kontrolü özgürlüğü vermez, ancak hiç yoktan iyidir;)

Sadece o öğeyi tekrar ekleyin.

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

Hata yapacağını düşündüm.

appendChild == kendini değiştir == yeniden çiz


3
Hiç bir hata değil; appendChildeğer varsa, yeni ebeveyn ile aynı olsa bile önce eski ebeveynden kaldırır, ardından onu yeni ebeveynin alt öğe listesine ekler.
Potatoswatter

5

Bahsedilmeyen başka bir çözüm, her svg öğesini / öğe kümesini bir div öğesine yerleştirmektir. Div'lerin z-endeksini kolaylıkla değiştirebilirsiniz.

Fiddle: Kaplar için z-endeksli SVG öğeleri döngüleri

... Bu öğeyi öne 'itmek' için düğmelere basın. (tüm seti yeniden boyamak ve 1 öğeyi öne itmek, ancak kabul edilen çözümde olduğu gibi orijinal sırayı korumakla karşılaştırıldığında)

Göreli z endekslerine sahip olmak çok güzel olurdu ...

stackOverflow, jsfiddle'dan bir bağlantıysa kodu koymamı istiyor? ... ook




3

SVGrender için bir "ressam modeli" kullanır. Boya, ardışık işlemlerde çıktı cihazına uygulanır, öyle ki her işlem çıktı cihazının bir alanını boyar. Alan önceden boyanmış bir alanla örtüştüğünde, yeni boya eskiyi kısmen veya tamamen gizler. - buna bağlantı


3

SVG'de, daha büyük bir Z indeksi elde etmek için, öğeyi DOM ağacında aşağı taşımanız gerekir. Bunu jQuery ile, SVG öğesini seçerek, kaldırarak ve istediğiniz konuma yeniden ekleyerek yapabilirsiniz:

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

2

Adam Bradley'in Sam'in cevabına yaptığı yorum tam olarak yerinde idi. Yalnızca CSS yerine jQuery kullanıyor, ancak şunu söyledi:

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

Ancak, oluşturduğum şey için, SVG Yolumun fareyle üzerine gelindiğinde diğer yolların üzerinde olmasına, ancak yine de SVG Metnimin altında olmasına ihtiyacım vardı. İşte bulduğum şey:

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

Hem appendTo hem de insertBefore, öğenizi yeni bir konuma taşıyarak SVG öğesinin derinliğini istediğiniz zaman değiştirmenize olanak tanır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.