Библиотека Vivus строится вокруг принципа пошаговой отрисовки
SVG-пути через управление состоянием каждого элемента
<path>. Внутри движка каждая линия SVG
рассматривается как независимая сущность с собственным прогрессом
анимации, который синхронизируется с глобальным состоянием
экземпляра.
Система состояния обычно включает:
Каждый кадр анимации пересчитывает параметры
stroke-dashoffset и stroke-dasharray, формируя
иллюзию рисования линии в реальном времени.
getStatus в контексте управления анимациейМетод getStatus используется как точка доступа к
текущему состоянию экземпляра Vivus. Он предоставляет информацию о том,
на каком этапе находится анимационный процесс и каково его текущее
положение в общей шкале прогресса.
Типовой набор возвращаемых данных включает:
Структура состояния обычно абстрагирована от DOM и представляет собой
вычисляемую модель, обновляемую в цикле
requestAnimationFrame.
Внутри Vivus отслеживание статуса связано с количеством уже анимированных сегментов. Каждый путь SVG разбивается на длину, после чего вычисляется коэффициент заполнения:
P =
где:
Полученное значение используется как основа для
getStatus, позволяя получить непрерывное представление
прогресса.
getStatusПоведение метода может быть интерпретировано через конечный автомат состояний:
start — анимация не запущена, все пути находятся в
исходном положении;progress — идёт процесс отрисовки, значение прогресса
изменяется;end — все пути полностью отрисованы;pause — активная анимация приостановлена.В некоторых реализациях вместо строковых значений используется числовая шкала или комбинированный объект.
При обращении к getStatus возвращаемый объект может быть
представлен следующим образом:
{
isAnimating: true,
isPaused: false,
progress: 0.63,
totalLength: 842.5,
currentLength: 531.8,
status: "progress"
}
Каждое поле связано с отдельным аспектом анимационного движка:
isAnimating отражает активность цикла обновления;progress показывает нормализованное выполнение;totalLength и currentLength обеспечивают
метрическую точность;status агрегирует состояние в человекочитаемую
форму.getStatus с системой рендера SVGSVG-рендеринг в Vivus основан на манипуляции свойствами
stroke-dasharray и stroke-dashoffset. Статус
анимации напрямую зависит от того, насколько смещён текущий offset
относительно полной длины контура.
При каждом обновлении кадра:
getStatus.Эта цепочка обеспечивает согласованность между визуальной отрисовкой и логической моделью состояния.
В сложных SVG-композициях несколько экземпляров Vivus могут работать
параллельно. В таких случаях getStatus применяется как
средство синхронизации.
Общая логика:
P_{global} = _{i=1}^{n} P_i
где:
Такой подход используется при построении сложных последовательных анимаций интерфейсов.
getStatus при завершённой анимацииПосле завершения отрисовки все внутренние таймеры Vivus прекращают обновление состояния. В этот момент:
progress фиксируется на значении 1;isAnimating принимает значение false;status переключается в финальное состояние;getStatus возвращают стабильный
результат без изменений.Особенность реализации заключается в отсутствии перерисовок после
достижения финального состояния, что снижает нагрузку на
requestAnimationFrame.
delayed и asyncVivus поддерживает различные режимы отрисовки SVG:
В этих режимах getStatus отражает не только глобальный
прогресс, но и распределение по элементам:
Это позволяет точно отслеживать визуальную динамику даже в сложных сценариях анимации.
getStatus с пользовательским циклом обновленияВстроенный цикл Vivus опирается на
requestAnimationFrame, однако внешний код может
использовать getStatus для построения собственной логики
синхронизации:
Каждое обращение к статусу не инициирует перерасчёт анимации, а возвращает уже вычисленное состояние, что делает метод лёгким с точки зрения производительности.
Точность getStatus зависит от корректности вычисления
длины каждого пути. SVG-геометрия может содержать:
Vivus предварительно вычисляет длины сегментов, что позволяет стабилизировать расчёт прогресса даже при сложной геометрии. Ошибки округления могут приводить к минимальным отклонениям в значении прогресса, особенно при большом количестве мелких сегментов.