Я использую круги SVG в моем проекте, как это,
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 120">
<g>
<g id="one">
<circle fill="green" cx="100" cy="105" r="20" />
</g>
<g id="two">
<circle fill="orange" cx="100" cy="95" r="20" />
</g>
</g>
</svg>
И я использую z-index в g
теге, чтобы показать элементы первыми. В моем проекте мне нужно использовать только значение z-index, но я не могу использовать z-index для своих элементов svg. Я много гуглил, но ничего не нашел относительно. Поэтому, пожалуйста, помогите мне использовать z-index в моем svg.
Вот ДЕМО.
javascript
jquery
svg
z-index
Карти Киан
источник
источник
Ответы:
Технические характеристики
В спецификации версии SVG 1.1 порядок рендеринга основан на порядке документов:
Ссылка на SVG 1.1. Технические характеристики
Решение (чище быстрее)
Вы должны поставить зеленый круг как последний объект, который будет нарисован. Так что поменяйте местами два элемента.
Вот вилка вашего jsFiddle .
Решение (альтернатива)
Тег
use
с атрибутомxlink:href
и как значение идентификатором элемента. Имейте в виду, что это может быть не лучшим решением, даже если результат кажется хорошим. Имея немного времени, здесь ссылка на спецификацию SVG 1.1 "use" Element .Заметки о SVG 2
SVG 2 Specification является следующей основной версией и все еще поддерживает вышеуказанные функции.
источник
Как уже говорили другие, z-индекс определяется порядком, в котором элемент появляется в DOM. Если переупорядочить html вручную не вариант или это будет сложно, вы можете использовать D3 для переупорядочения групп / объектов SVG.
Используйте D3 для обновления порядка DOM и функции имитации Z-индекса
Обновление SVG Element Z-Index с помощью D3
На самом базовом уровне (и если вы не используете идентификаторы для чего-либо еще), вы можете использовать идентификаторы элементов в качестве замены для z-index и переупорядочивать их. Помимо этого вы можете в значительной степени позволить своему воображению сойти с ума.
Примеры в фрагменте кода
Основная идея:
Используйте D3 для выбора элементов SVG DOM.
Создайте некоторый массив z-индексов с соотношением 1: 1 с вашими элементами SVG (которые вы хотите изменить в порядке). Массивы Z-индекса, используемые в приведенных ниже примерах, представляют собой идентификаторы, координаты x & y, радиусы и т. Д.
Затем используйте D3, чтобы связать ваши z-индексы с этим выбором.
Наконец, вызовите D3.sort, чтобы изменить порядок элементов в DOM на основе данных.
Примеры
[3,4,1,2,5]
перемещает / переупорядочивает 3-й круг (в исходном порядке HTML), чтобы быть 1-м в DOM, 4-м - 2-м, 1-м - 3-м , и так далее...источник
Попробуйте инвертировать
#one
и#two
. Посмотрите на эту скрипку: http://jsfiddle.net/hu2pk/3/Update
В SVG z-индекс определяется порядком, в котором элемент появляется в документе . Вы также можете просмотреть эту страницу, если хотите: https://stackoverflow.com/a/482147/1932751
источник
d3.selection.prototype.moveToFront = function() { return this.each(function() { this.parentNode.appendChild(this); }); };
И тогда вы можете сказатьselection.moveToFront()
через stackoverflow.com/questions/14167863/…Вы можете использовать использование .
Зеленый круг появляется сверху.
jsFiddle
источник
#one
рисуется дважды. Но если вы хотите, вы можете скрыть первый экземпляр с помощью CSS.use
имеет тот же эффект, что и клонирование упомянутого элемента DOM<g>
себя при изменении DOM перед загрузкой в любом случае.Как уже говорилось, svgs рендерится по порядку и не учитывает z-index (пока). Может быть, просто отправить конкретный элемент в нижней части его родителя, чтобы он отображался последним.
Работал на меня.
Обновить
Если у вас есть вложенный SVG, содержащий группы, вам нужно вывести элемент из его parentNode.
Приятной особенностью SVG является то, что каждый элемент содержит свое местоположение независимо от того, в какую группу он вложен: +1:
источник
Используя D3:
Если вы хотите повторно вставить каждый выбранный элемент, по порядку, как последний дочерний элемент его родителя.
источник
selection.raise()
новый в D3 с v4.Для svgs нет z-индекса. Но svg определяет, какой из ваших элементов является самым верхним по своей позиции в DOM. Таким образом, вы можете удалить объект и поместить его в конец svg, сделав его «последним отрендеренным» элементом. Затем он визуализируется как «самый верхний».
Используя jQuery:
использование:
Используя D3.js:
использование:
источник
Используя D3:
Если вы хотите добавить элемент в обратном порядке к данным, используйте:
Вместо .append
Добавление элемента в начало элемента группы
источник
Другим решением будет использование div, которые используют zIndex для хранения элементов SVG. Как здесь: https://stackoverflow.com/a/28904640/4552494
источник
Чистые, быстрые и простые решения, опубликованные на дату данного ответа, являются неудовлетворительными. Они построены на ошибочном утверждении, что в документах SVG отсутствует порядок z. Библиотеки тоже не нужны. Одна строка кода может выполнять большинство операций для управления порядком z объектов или групп объектов, которые могут потребоваться при разработке приложения, которое перемещает 2D-объекты в пространстве XYZ.
Порядок Z определенно существует во фрагментах документов SVG
То, что называется фрагментом документа SVG, представляет собой дерево элементов, полученных из базового типа узла SVGElement. Корневым узлом фрагмента документа SVG является SVGSVGElement, который соответствует тегу HTML5 <svg> . SVGGElement соответствует тегу <g> и разрешает агрегирование дочерних элементов .
Наличие атрибута z-index в SVGElement, как в CSS, победило бы модель рендеринга SVG. В разделах 3.3 и 3.4 Рекомендации W3C SVG v1.1 2-го издания говорится, что фрагменты документа SVG (деревья потомков из SVGSVGElement) визуализируются с использованием так называемого поиска в глубине дерева . Эта схема в любом смысле этого слова.
Z-порядок - это, по сути, ярлык компьютерного зрения, позволяющий избежать необходимости реального 3D-рендеринга со сложностями и вычислительными требованиями трассировки лучей. Линейное уравнение для неявного z-индекса элементов во фрагменте документа SVG.
Это важно, потому что если вы хотите переместить круг, который был ниже квадрата, над ним, вы просто вставляете квадрат перед кругом. Это можно легко сделать в JavaScript.
Методы поддержки
Экземпляры SVGElement имеют два метода, которые поддерживают простое и легкое манипулирование z-порядком.
Правильный ответ, который не создает беспорядок
Поскольку SVGGElement ( тег <g> ) можно удалять и вставлять так же легко, как SVGCircleElement или любую другую форму, слои изображений, типичные для продуктов Adobe и других графических инструментов, могут быть легко реализованы с помощью SVGGElement. Этот JavaScript по сути является командой Move Below .
Если слой робота, нарисованный в качестве дочерних элементов SVGGElement gRobot, находился до проема дверного проема в качестве дочерних элементов SVGGElement gDoorway, то теперь робот находится за дверным проемом, потому что порядок z дверного проема теперь равен единице плюс порядок z робота.
Команда Move Above почти так же проста.
Просто подумайте a = a и b = b, чтобы запомнить это.
Оставить DOM в состоянии, совместимом с точкой зрения
Причина того, что этот ответ является правильным, заключается в том, что он минимален и полон, и, подобно внутренним компонентам продуктов Adobe или других хорошо разработанных графических редакторов, оставляет внутреннее представление в состоянии, которое соответствует представлению, созданному при рендеринге.
Альтернативный, но ограниченный подход
Другой обычно используемый подход заключается в использовании z-индекса CSS в сочетании с несколькими фрагментами документа SVG (тегами SVG) с почти прозрачным фоном на всех, кроме нижнего. Опять же, это отрицательно сказывается на элегантности модели рендеринга SVG, затрудняя перемещение объектов вверх или вниз в z-порядке.
НОТЫ:
источник
У нас уже 2019 год и
z-index
до сих пор не поддерживается SVG.Вы можете увидеть на сайте поддержку SVG2 в Mozilla , для которой состояние
z-index
- Не реализовано .Вы также можете увидеть на сайте ошибку 360148 «Поддержка свойства z-index для элементов SVG» (сообщается: 12 лет назад).
Но у вас есть 3 возможности в SVG:
element.appendChild(aChild);
parentNode.insertBefore(newNode, referenceNode);
targetElement.insertAdjacentElement(positionStr, newElement);
(нет поддержки в IE для SVG)Интерактивный демонстрационный пример
При всем этом 3 функции.
источник
Нажмите на элемент SVG, чтобы продлиться, чтобы его z-индекс был сверху. В SVG нет свойства, называемого z-index. попробуйте ниже javascript, чтобы вывести элемент наверх.
Цель: элемент, для которого нам нужно вывести его наверх svg: контейнер элементов
источник
это легко сделать:
источник