Скажімо, у мене є пара складених фігур ( <g>
). Я хочу мати можливість натискати та перетягувати їх, але хочу, щоб той, який зараз перетягується, був зверху іншого в порядку Z, так що, якщо я перетягну його над ІНШИМ, другий слід затьмарити.
Скажімо, у мене є пара складених фігур ( <g>
). Я хочу мати можливість натискати та перетягувати їх, але хочу, щоб той, який зараз перетягується, був зверху іншого в порядку Z, так що, якщо я перетягну його над ІНШИМ, другий слід затьмарити.
Відповіді:
Індекс Z у SVG визначається порядком відображення елементів у документі. Вам доведеться змінити порядок елементів, якщо ви хочете надати певну форму зверху.
$('#thing-i-want-on-top').appendTo('#my-svg');
Альтернативою рухомим елементам у дереві є використання <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"
якого він відображається як найвищий елемент.
Дивіться скрипка .
xlink:href
застаріло, тепер це простоhref
Це старе питання, але ...
На 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 == замінити себе == перемалювати
appendChild
спочатку видаляє зі старого батька, якщо такий є, навіть якщо він такий самий, як новий, потім додає його до списку дочірніх даних нового батька.
Інше рішення, про яке не згадується, - це розміщення кожного елемента svg / набору елементів у div. Ви можете легко змінити z-індекс div.
Скрипка: цикли елементів SVG із z-індексом для контейнерів
... Натисніть на кнопки, щоб «штовхнути» цей елемент вперед. (проти перефарбовування цілого набору та висунення 1 елемента вперед, але збереження початкового порядку, як у прийнятому рішенні)
Було б дуже добре мати відносні z-індекси ...
stackOverflow хоче, щоб я поставив код, якщо це посилання з jsfiddle? ... ook
Так, порядок - це те, що вказує, який об’єкт буде перед іншим. Щоб маніпулювати порядком, вам потрібно буде перемістити речі про DOM. Є хороший приклад цього у вікі SVG за адресою https://www.w3.org/TR/SVG11/render.html#RenderingOrder
Якщо ви використовуєте бібліотеку svg.js , ви можете скористатися командою ".front ()" для переміщення будь-якого елемента вгору.
SVG
використовує "художню модель" візуалізації. Фарба застосовується під час послідовних операцій до вихідного пристрою таким чином, що кожна операція зафарбовує деяку область вихідного пристрою. Коли область перекриває попередньо пофарбовану область, нова фарба частково або повністю затемнює стару. - посилання на це
Коментар Адама Бредлі до відповіді Сема був точно таким. Він використовує 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 за бажанням.