С помощью JavaScript я могу изменить индекс Z / слой элемента SVG?
допустим, у меня есть пара композитных фигур (<g>). Я хочу иметь возможность щелкнуть и перетащить их, но я хочу, чтобы тот, который я перетаскиваю в данный момент, был поверх другого в порядке Z, так что если я перетащу его поверх другого, другой должен быть затмен.
9 ответов:
индекс Z в SVG определяется порядком отображения элементов в документе. Вам придется изменить порядок элементов, если вы хотите, чтобы принести определенную форму в верхней части.
альтернативой перемещению элементов в дереве является использование
<use>элементы, где вы меняетеxlink:hrefатрибут, так что он дает вам Z заказ вы хотите.здесь старые нити на svg-developers mailinglist обсуждается эта тема в контексте желания анимировать некоторые фигуры.
обновление:
<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>в этом примере элемент
посмотреть скрипка.
Это старый вопрос, но...
в 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Я думал, что он собирается бросить en error или что-то в этом роде.
appendChild = = заменить себя == перерисовать
другое решение, не упомянутое, состоит в том, чтобы поместить каждый элемент svg/набор элементов в div. Вы можете легко изменить Z-индекс divs.
Скрипка: циклы элементов SVG с Z-индексом для контейнеров
...Нажмите на кнопки, чтобы "нажать" этот элемент спереди. (против перекраски всего набора и выталкивания 1 элемента вперед, но сохраняя первоначальный порядок, как в принятом решении)
было бы очень приятно иметь относительный z индексы...
stackOverflow хочет, чтобы я поставил код, если это ссылка из jsfiddle?...УК
var orderArray=[0,1,2]; var divArray = document.querySelectorAll('.shape'); var buttonArray = document.querySelectorAll('.button'); for(var i=0;i<buttonArray.length;i++){ buttonArray[i].onclick=function(){ var localI = i; return function(){clickHandler(orderArray.indexOf(localI));}; }(); } function clickHandler(divIndex) { orderArray.push(orderArray.splice(divIndex, 1)[0]); orderDivs(); } function orderDivs(){ for(var i=0;i<orderArray.length;i++){ divArray[orderArray[i]].style.zIndex=i; } }svg { width: 100%; height: 100%; stroke: black; stroke-width:2px; pointer-events: all; } div{ position:absolute; } div.button{ top:55%; height:5%; width:15%; border-style: outset; cursor:pointer; text-align: center; background:rgb(175, 175, 234); } div.button:hover{ border-style: inset; background:yellow; } div.button.first{ left:0%; } div.button.second{ left:20%; } div.button.third{ left:40%; }<div class="shape"> <svg> <circle cx="50" cy="50" r="40" fill="lime" /> </svg> </div> <div class="shape"> <svg> <rect x="4" y="20" width="200" height="50" fill="cyan" /> </svg> </div> <div class="shape"> <svg> <circle cx="70" cy="70" r="50" fill="fuchsia" /> </svg> </div> <div class='button first'>lime</div> <div class='button second'>cyan</div> <div class='button third'>fuchsia</div>
Если вы используете svg.библиотека js, вы можете использовать ".front () " команда для перемещения любого элемента в верхнюю часть.
да порядок-это то, что указывает, какой объект будет перед другим. Чтобы манипулировать порядком, вам нужно будет перемещать вещи о DOM. Есть хороший пример этого на SVG wiki в https://www.w3.org/TR/SVG/render.html#RenderingOrder
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 по своему усмотрению.
в SVG, чтобы получить более высокий индекс Z, вы должны переместить элемент вниз в дереве DOM. Вы можете сделать это с помощью jQuery, выбрав элемент SVG, удалив его и добавив его снова в нужное положение:
$('g.element').remove().appendTo('svg');
Comments