Режим oneByOne в Vivus задаёт последовательную отрисовку SVG-путей,
при которой каждый контур анимируется строго после завершения
предыдущего. Механика основана на поочерёдном изменении свойств
stroke-dashoffset для каждого пути внутри SVG-документа,
создавая эффект «рисования линии» с контролируемым порядком
воспроизведения.
В отличие от параллельной анимации, где все элементы начинают движение одновременно, здесь формируется строгая цепочка исполнения. Каждый следующий путь ожидает завершения предыдущего, что делает визуальный результат более структурированным и читаемым, особенно при работе с иллюстрациями, логотипами и схемами.
SVG-графика в Vivus разбивается на набор отдельных путей
(<path>, <line>,
<polyline>, <polygon>). Для
каждого элемента вычисляется длина контура, после чего применяется
техника обводки через:
stroke-dasharray — задаёт длину штриха и пробелаstroke-dashoffset — смещает видимую часть линииПри режиме oneByOne каждый путь получает собственный временной интервал анимации. После завершения текущего сегмента происходит переход к следующему элементу в последовательности DOM.
Ключевая особенность заключается в строгой очередности:
Порядок напрямую зависит от структуры SVG-кода. Группы
<g> не изменяют последовательность сами по себе, но
влияют на иерархию обхода элементов.
new Vivus('svg-element', {
type: 'oneByOne',
duration: 200,
animTimingFunction: Vivus.EASE
});
Параметр type: 'oneByOne' определяет режим
последовательной отрисовки. Значение duration задаёт общую
продолжительность анимации, которая распределяется между всеми путями
SVG.
В режиме oneByOne длительность не привязана к отдельным элементам напрямую. Вместо этого:
При увеличении количества элементов SVG уменьшается среднее время отрисовки каждого сегмента, если не компенсировать это увеличением общей длительности.
Последовательность определяется порядком обхода DOM:
<svg id="svg-element">
<path d="M10 10 L100 10" />
<path d="M100 10 L100 100" />
<path d="M100 100 L10 100" />
</svg>
Анимация выполнится строго по порядку объявления путей.
При наличии групп:
<svg id="svg-element">
<g>
<path d="M0 0 L50 50" />
<path d="M50 50 L100 0" />
</g>
<path d="M0 100 L100 100" />
</svg>
сначала будут обработаны пути внутри <g>, затем
внешний путь.
Изменение последовательности достигается только через модификацию структуры SVG:
<path> внутри документаVivus не предоставляет встроенного механизма сортировки путей по атрибутам, поэтому DOM-структура является единственным источником порядка.
Библиотека поддерживает несколько типов анимации:
delayed — элементы запускаются с задержкой, но
перекрываются по времениasync — все пути анимируются независимоoneByOne — строгая последовательная цепочкаВ режиме oneByOne отсутствует пересечение анимаций, что снижает визуальную динамику, но повышает читаемость сложных форм.
<svg id="svg-element" viewBox="0 0 200 200">
<path d="M10 10 H 190" />
<path d="M190 10 V 190" />
<path d="M190 190 H 10" />
<path d="M10 190 V 10" />
<path d="M50 50 L150 150" />
</svg>
В режиме oneByOne будет создана цепочка из пяти последовательных анимаций. Каждый контур завершает своё движение перед стартом следующего.
При большом количестве элементов важно учитывать влияние параметра
duration.
Условная зависимость:
Рекомендуется увеличивать duration при сложных SVG,
чтобы избежать ускоренного «дробления» анимации.
new Vivus('svg-element', {
type: 'oneByOne',
duration: 400
});
Пути с большой длиной обводки могут визуально занимать больше времени даже при равномерном распределении длительности. Это создаёт эффект асимметрии:
При проектировании SVG это влияет на восприятие ритма анимации.
Группы <g> не изменяют принцип oneByOne, но влияют
на порядок обхода:
Глубоко вложенные структуры могут привести к неожиданной последовательности, если порядок групп не выстроен явно.
Экземпляр Vivus может быть перезапущен:
const anim = new Vivus('svg-element', {
type: 'oneByOne',
duration: 300
});
anim.reset().play();
Повторная активация приводит к повторному вычислению последовательности путей и их длины.
Vivus поддерживает события завершения анимации:
new Vivus('svg-element', {
type: 'oneByOne',
duration: 200,
onReady: function () {
console.log('SVG подготовлен');
}
}, function () {
console.log('Анимация завершена');
});
Callback после завершения всей цепочки срабатывает только после последнего пути.
Эффективность режима зависит от структуры графики:
Избыточное дробление на десятки мелких path приводит к
увеличению времени переключений между этапами анимации.
Последовательная отрисовка особенно эффективна в случаях:
Строгая очередность подчёркивает структуру изображения и задаёт направление визуального повествования.
Изменение SVG после создания экземпляра Vivus не пересчитывает автоматически последовательность. Новые элементы не включаются в уже созданную цепочку без повторной инициализации.
Это означает, что структура фиксируется на момент запуска анимации и зависит от исходного состояния документа.