Векторная графика в SVG формируется на основе последовательной обработки DOM-узлов, где каждый элемент получает визуальное представление в соответствии с порядком его появления в документе. Это означает, что порядок отрисовки напрямую зависит от структуры SVG-кода, а не от визуальных свойств или координат объектов.
При использовании библиотеки Vivus этот принцип становится ключевым, поскольку именно он определяет последовательность анимации линий и контуров.
SVG рендерится строго сверху вниз по дереву документа. Каждый новый элемент перекрывает предыдущий, если они пересекаются в пространстве.
Ключевые особенности:
<g> влияет только на
группировку, но не отменяет порядок внутри группы;Простейший пример:
<svg width="200" height="200">
<circle cx="50" cy="50" r="40" fill="red" />
<circle cx="80" cy="80" r="40" fill="blue" />
</svg>
Красный круг будет находиться под синим, потому что он объявлен раньше.
Vivus строит анимацию на основе последовательного обхода
SVG-элементов, способных быть анимированными через
stroke-dasharray.
При инициализации происходит:
<path>, а также поддерживаемых
форм)Таким образом, порядок в исходном SVG становится основой всей временной структуры анимации.
Библиотека предоставляет несколько режимов, которые определяют, как интерпретируется порядок элементов.
Каждый путь анимируется строго после завершения предыдущего.
Логика:
Это создаёт эффект рисования контура по частям.
Все элементы начинают анимацию одновременно, но с разной длительностью в зависимости от длины пути.
Особенности:
Каждый элемент начинает анимацию с задержкой, зависящей от его позиции в DOM.
Формируется временная шкала:
Такой подход создаёт равномерное «протекание» отрисовки по структуре SVG.
<g>
на порядокГруппы в SVG позволяют структурировать элементы, но не меняют фундаментального принципа линейного обхода.
Рассмотрим пример:
<svg>
<g>
<path d="..." />
<path d="..." />
</g>
<path d="..." />
</svg>
Порядок анимации будет:
Vivus не делает приоритизации по группам, он разворачивает структуру в плоский список.
Важно различать:
Эти два процесса связаны, но не идентичны.
Даже если элемент анимируется позже, он может визуально находиться ниже или выше в зависимости от DOM-позиции.
Пример:
<defs> и скрытых элементовЭлементы внутри <defs> не участвуют в визуальной
отрисовке и игнорируются Vivus при построении последовательности.
Также исключаются:
<clipPath><mask>display: noneЭто влияет на итоговый порядок массива анимации, так как он формируется уже после фильтрации.
Внутренний процесс можно описать следующим образом:
Результирующая очередь становится основой таймлайна анимации.
Оптимизаторы SVG могут менять структуру документа:
Это напрямую влияет на Vivus, поскольку изменяется исходная последовательность элементов.
Например:
До оптимизации:
<path id="1" />
<path id="2" />
<path id="3" />
После оптимизации:
<path id="2" />
<path id="1" />
<path id="3" />
Анимация изменит визуальную последовательность без изменения логики кода Vivus.
Контроль порядка осуществляется исключительно через изменение DOM-структуры.
Основные методы управления:
<path> в коде SVG<g> для логической
сегментацииVivus не предоставляет API для ручной сортировки элементов, так как опирается на DOM как на источник истины.
Некоторые SVG-редакторы создают сложные структуры:
<path> внутри <symbol><use>Vivus обрабатывает только реальные экземпляры в DOM, а не ссылки, поэтому:
<symbol> игнорируется напрямую<use> может быть развернут или пропущен в
зависимости от реализации браузераЭто влияет на финальный порядок, поскольку виртуальные элементы не участвуют в очереди напрямую.
Порядок отрисовки тесно связан с временными параметрами:
В режимах oneByOne и delayed порядок DOM
становится осью времени, превращая структуру SVG в временную
диаграмму.
Типичные проблемы возникают при неправильной организации SVG:
Это приводит к визуальным разрывам анимации и несогласованности движения.
Предсказуемость Vivus полностью определяется стабильностью DOM:
Любая модификация SVG после инициализации не пересчитывает очередь автоматически, что закрепляет порядок как фиксированную модель на момент запуска.