Линейная анимация SVG в контексте Vivus строится вокруг поэтапного увеличения видимой части контура, когда путь «рисуется» от начала до конца с равномерной скоростью. Базовая идея заключается в управлении свойствами stroke-dasharray и stroke-dashoffset, которые позволяют имитировать процесс рисования линии.
SVG-путь представляется как непрерывная линия фиксированной длины. При линейной анимации эта линия сначала полностью скрыта, затем постепенно становится видимой за счёт уменьшения смещения обводки.
Ключевой момент — равномерное изменение видимой части контура во времени без ускорений и замедлений. Это отличает линейную анимацию от easing-моделей, где скорость изменяется по кривой.
Для любого SVG path вычисляется его полная длина:
const length = path.getTotalLength();
После этого применяются параметры:
На старте весь путь скрыт, так как смещение совпадает с длиной. Далее значение stroke-dashoffset уменьшается до нуля.
Линейность достигается тем, что изменение offset происходит равномерно:
offset(t) = L - (L * t / T)
где:
Таким образом каждый кадр изменяет отображаемую часть пропорционально времени.
Несмотря на то, что Vivus абстрагирует работу с path, понимание низкоуровневой механики важно для настройки поведения.
Простейшая реализация:
const path = document.querySelector("path");
const length = path.getTotalLength();
path.style.strokeDasharray = length;
path.style.strokeDashoffset = length;
let start = null;
const duration = 2000;
function animate(timestamp) {
if (!start) start = timestamp;
const progress = timestamp - start;
const percent = Math.min(progress / duration, 1);
path.style.strokeDashoffset = length * (1 - percent);
if (progress < duration) {
requestAnimationFrame(animate);
}
}
requestAnimationFrame(animate);
В этом примере используется строго линейное изменение прогресса без нелинейных функций интерполяции.
В Vivus линейная анимация чаще всего проявляется через режимы рисования, где отсутствует перераспределение времени между сегментами пути.
Основные параметры, влияющие на линейное поведение:
При установке линейного поведения важно исключить любые эффекты ускорения или задержек между сегментами.
Хотя линейная анимация часто воспринимается как единый режим, в Vivus она зависит от типа обработки путей.
Каждый путь анимируется один за другим, но внутри каждого сегмента движение остаётся линейным.
new Vivus('svg', {
type: 'delayed',
duration: 200
});
Особенность:
Все пути начинают и заканчивают анимацию одновременно.
new Vivus('svg', {
type: 'sync',
duration: 200
});
Особенность:
Каждый сегмент имеет свою фазу, но внутри неё сохраняется линейное изменение.
new Vivus('svg', {
type: 'oneByOne',
duration: 200
});
Особенность:
Линейность напрямую зависит от механизма обновления кадров. requestAnimationFrame обеспечивает синхронизацию с частотой обновления экрана, предотвращая рывки.
Без него возможны:
Принцип:
каждый кадр = одинаковый временной шаг
что критично для сохранения линейного восприятия движения.
Линейная анимация определяется отсутствием нелинейной интерполяции. В терминах анимации это означает:
progress = time / duration
без применения функций вида:
Любое отклонение от линейной интерполяции приводит к изменению скорости прорисовки и нарушает равномерность.
SVG-документы часто содержат множество path-элементов. При линейной анимации важно учитывать:
Пример логики:
paths.forEach(path => {
const length = path.getTotalLength();
path.style.strokeDasharray = length;
path.style.strokeDashoffset = length;
});
Далее единый прогресс применяется ко всем элементам одновременно.
При большом количестве элементов возникает нагрузка на браузер. Линейная анимация требует:
Критический момент:
getTotalLength()
должен вызываться один раз при инициализации, а не на каждом кадре.
Каждая из этих ошибок приводит к нарушению равномерного движения и визуальным рывкам.
Линейная анимация используется там, где важна предсказуемость движения:
В каждом случае ключевым фактором остаётся одинаковая скорость прорисовки без акцентов на отдельных участках.
SVG сохраняет геометрическую корректность при масштабировании, однако длина пути остаётся константой в координатах документа.
Это означает:
При адаптивных интерфейсах это обеспечивает стабильность эффекта.