Чисті, швидкі та прості рішення, розміщені на дату цієї відповіді, незадовільні. Вони побудовані на хибному твердженні про відсутність порядку SVG-документах. Бібліотеки теж не потрібні. Один рядок коду може виконувати більшість операцій, щоб керувати порядком z об'єктів або груп об'єктів, які можуть знадобитися при розробці програми, яка переміщує 2D-об'єкти навколо в ксизовому просторі.
Z Замовлення напевно існує у фрагментах документа SVG
Фрагмент документа SVG називається деревом елементів, похідним від базового вузла типу SVGElement. Кореневий вузол фрагмента документа SVG - це SVGSVGElement, який відповідає тегу HTML5 <svg> . SVGGElement відповідає тегу <g> і дозволяє об'єднувати дітей.
Наявність атрибута z-індексу на 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 мають два методи, які підтримують просту та просту маніпуляцію із замовленням.
- parent.removeChild (дитина)
- parent.insertBefore (дитина, дитинаRef)
Правильний відповідь, який не створює безлад
Оскільки SVGGElement ( <g> тег) можна видалити та вставити так само легко, як SVGCircleElement або будь-яку іншу форму, шари зображень, характерні для продуктів Adobe та інших графічних інструментів, можна легко реалізувати за допомогою SVGGElement. Цей JavaScript по суті є командою " Перемістити внизу" .
parent.insertBefore(parent.removeChild(gRobot), gDoorway)
Якщо шар робота, намальований дітьми SVGGElement gRobot, був перед дверима, намальованим як діти SVGGElement gDoorway, робот зараз знаходиться за дверима, оскільки порядок z в дверному отворі тепер один плюс z порядок робота.
Команда « Перемістити вище» майже так само просто.
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' (див. Елементи контейнерів), створюють тимчасове окреме полотно, ініційоване на прозорий чорний колір, на якому намальовані дочірні елементи. Після завершення групи всі ефекти фільтру, визначені для групи, застосовуються для створення модифікованого тимчасового полотна. Змінене тимчасове полотно компонується на задньому плані з урахуванням будь-яких параметрів маскування на рівні групи та непрозорості для групи.