Чистые, быстрые и простые решения, опубликованные на дату данного ответа, являются неудовлетворительными. Они построены на ошибочном утверждении, что в документах 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.
z-index = z-index_of_svg_tag + depth_first_tree_index / tree_node_qty
Это важно, потому что если вы хотите переместить круг, который был ниже квадрата, над ним, вы просто вставляете квадрат перед кругом. Это можно легко сделать в JavaScript.
Методы поддержки
Экземпляры SVGElement имеют два метода, которые поддерживают простое и легкое манипулирование z-порядком.
- parent.removeChild (ребенок)
- parent.insertBefore (child, childRef)
Правильный ответ, который не создает беспорядок
Поскольку SVGGElement ( тег <g> ) можно удалять и вставлять так же легко, как SVGCircleElement или любую другую форму, слои изображений, типичные для продуктов Adobe и других графических инструментов, могут быть легко реализованы с помощью SVGGElement. Этот JavaScript по сути является командой Move Below .
parent.insertBefore(parent.removeChild(gRobot), gDoorway)
Если слой робота, нарисованный в качестве дочерних элементов SVGGElement gRobot, находился до проема дверного проема в качестве дочерних элементов SVGGElement gDoorway, то теперь робот находится за дверным проемом, потому что порядок z дверного проема теперь равен единице плюс порядок z робота.
Команда Move Above почти так же проста.
parent.insertBefore(parent.removeChild(gRobot), gDoorway.nextSibling())
Просто подумайте a = a и b = b, чтобы запомнить это.
insert after = move above
insert before = move below
Оставить DOM в состоянии, совместимом с точкой зрения
Причина того, что этот ответ является правильным, заключается в том, что он минимален и полон, и, подобно внутренним компонентам продуктов Adobe или других хорошо разработанных графических редакторов, оставляет внутреннее представление в состоянии, которое соответствует представлению, созданному при рендеринге.
Альтернативный, но ограниченный подход
Другой обычно используемый подход заключается в использовании z-индекса CSS в сочетании с несколькими фрагментами документа SVG (тегами SVG) с почти прозрачным фоном на всех, кроме нижнего. Опять же, это отрицательно сказывается на элегантности модели рендеринга SVG, затрудняя перемещение объектов вверх или вниз в z-порядке.
НОТЫ:
- ( https://www.w3.org/TR/SVG/render.html v 1.1, 2-е издание, 16 августа 2011 г.)
3.3. Элементы порядка рендеринга во фрагменте документа SVG имеют неявный порядок рисования, причем первые элементы во фрагменте документа SVG сначала «закрашиваются». Последующие элементы окрашиваются поверх ранее окрашенных элементов.
3.4 Как визуализируются группы Элементы группировки, такие как элемент 'g' (см. Элементы контейнера), создают эффект создания отдельного временного холста, инициализированного прозрачным черным, на котором закрашиваются дочерние элементы. После завершения группы все эффекты фильтра, указанные для группы, применяются для создания измененного временного холста. Измененный временный холст накладывается на фон, принимая во внимание любые параметры маскирования и непрозрачности на уровне группы в группе.