За допомогою JavaScript, чи можу я змінити індекс Z / шар елемента SVG <g>?


85

Скажімо, у мене є пара складених фігур ( <g>). Я хочу мати можливість натискати та перетягувати їх, але хочу, щоб той, який зараз перетягується, був зверху іншого в порядку Z, так що, якщо я перетягну його над ІНШИМ, другий слід затьмарити.


дивіться тут .
Еліран Малка

можливий дублікат
переупорядкування zg

Відповіді:


113

Індекс Z у SVG визначається порядком відображення елементів у документі. Вам доведеться змінити порядок елементів, якщо ви хочете надати певну форму зверху.


1
@theonlygusti Елементи в кінці документа знаходяться вгорі. Якщо ви використовуєте jQuery, ви повинні мати можливість використовувати щось на зразок$('#thing-i-want-on-top').appendTo('#my-svg');
Адам Бредлі,

Отже, в основному, немає можливості перемістити фігуру до верху (вісь z) при наведенні ...?
chharvey

jQuery не підтримує зміну порядку шляхів SVG.
Відправлено

4
@chharvey, ти можеш розмістити речі на вершині, змінивши їх порядок - повторно додавши. Ось елегантний приклад: codepen.io/osublake/pen/YXoEQe
Фрейзер Кіркман

36

Альтернативою рухомим елементам у дереві є використання <use>елементів, де ви змінюєте xlink:hrefатрибут так, щоб він давав вам z-упорядкування, яке ви хочете.

Ось стара тема в списку розсилки svg-developers, яка обговорює цю тему в контексті бажання анімувати деякі фігури.

Оновлення:

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

У цьому прикладі елемент <use> є останнім, що робить його найпершим елементом. Ми можемо вибрати будь-який інший елемент, який буде діяти як передовий, просто змінивши xlink:hrefатрибут. У наведеному вище прикладі ми вибрали коло за допомогою id="c1"якого він відображається як найвищий елемент.

Дивіться скрипка .


1
Ця відповідь була б набагато кориснішою на прикладі, або з інформацією з цього списку розсилки (який закритий).
Kyeotic

3
Працює, але змусити вас додати відповідне використання. Якщо ви використовуєте переклади, <use> не має про них уявлення
Йохен Бедерсдорфер

@JochenBedersdorfer не знаєш, що ти маєш на увазі, як переклади пов'язані із замовленням z?
Ерік Далстрем

Це було не дуже зрозуміло. Якщо ви використовуєте вкладені <g> -теги з перетвореннями, вам потрібно перетворити координати за допомогою getTransformToElement (..); (див. документи SVG)
Йохен Бедерсдорфер

3
xlink:hrefзастаріло, тепер це простоhref
osvein

22

Це старе питання, але ...

На FireFox (7+) та Chrome (14+) ви можете потягнути svg_element вгору. Це не дає вам свободи повного контролю осі z, але це краще, ніж нічого;)

Просто додайте цей елемент ще раз.

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

Я думав, що це викличе помилку чи щось інше.

appendChild == замінити себе == перемалювати


3
Зовсім не помилка; appendChildспочатку видаляє зі старого батька, якщо такий є, навіть якщо він такий самий, як новий, потім додає його до списку дочірніх даних нового батька.
Potatoswatter

5

Інше рішення, про яке не згадується, - це розміщення кожного елемента svg / набору елементів у div. Ви можете легко змінити z-індекс div.

Скрипка: цикли елементів SVG із z-індексом для контейнерів

... Натисніть на кнопки, щоб «штовхнути» цей елемент вперед. (проти перефарбовування цілого набору та висунення 1 елемента вперед, але збереження початкового порядку, як у прийнятому рішенні)

Було б дуже добре мати відносні z-індекси ...

stackOverflow хоче, щоб я поставив код, якщо це посилання з jsfiddle? ... ook


5

Так, порядок - це те, що вказує, який об’єкт буде перед іншим. Щоб маніпулювати порядком, вам потрібно буде перемістити речі про DOM. Є хороший приклад цього у вікі SVG за адресою https://www.w3.org/TR/SVG11/render.html#RenderingOrder


4
Це посилання більше не працює. Це посилання пояснює ту саму ідею: посилання
Стів


3

SVGвикористовує "художню модель" візуалізації. Фарба застосовується під час послідовних операцій до вихідного пристрою таким чином, що кожна операція зафарбовує деяку область вихідного пристрою. Коли область перекриває попередньо пофарбовану область, нова фарба частково або повністю затемнює стару. - посилання на це


3

У SVG, щоб отримати вищий більший індекс Z, слід перемістити елемент вниз у дереві DOM. Ви можете зробити це за допомогою jQuery, вибравши елемент SVG, видаливши його та додавши ще раз у потрібну позицію:

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

2

Коментар Адама Бредлі до відповіді Сема був точно таким. Він використовує jQuery, а не лише CSS, але він сказав наступне:

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

Однак для того, що я створював, мені потрібно було, щоб мій шлях SVG був вище будь-якого іншого шляху при наведенні, але все одно був нижче мого тексту SVG. Ось ось що я придумав:

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

І appendTo, і insertBefore перемістять ваш елемент у нове розташування, що дозволить вам змінювати глибину елемента SVG за бажанням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.