Vivus представляет собой легковесную библиотеку для анимации SVG-путей с использованием чистого JavaScript без зависимости от фреймворков. Основная идея — последовательное «прорисовывание» линий SVG, создающее эффект рисования от руки.
Подключение через CDN:
<script src="https://cdn.jsdelivr.net/npm/vivus@latest/dist/vivus.min.js"></script>
SVG может быть встроен напрямую в HTML или загружен как внешний файл. Оба подхода поддерживаются, но различаются по уровню контроля и гибкости.
Ключевое требование — SVG должен содержать пути
(<path>), так как именно они анимируются. Примитивы
вроде <rect>, <circle> и
<line> часто конвертируются в path на этапе экспорта
из редакторов (Figma, Illustrator, Inkscape).
Пример корректной структуры:
<svg id="logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200">
<path d="M10 10 H 190 V 190 H 10 Z" />
</svg>
Важно:
dМинимальный запуск анимации выполняется через создание экземпляра:
<script>
new Vivus('logo', {
duration: 200,
type: 'delayed'
});
</script>
Параметры:
logo — id SVG элементаduration — длительность анимации в кадрахtype — тип поведения отрисовкиКаждый path анимируется последовательно с небольшой задержкой:
new Vivus('logo', {
duration: 180,
type: 'delayed'
});
Используется для логотипов и иллюстраций, где важен «живой» эффект рисования.
Все пути анимируются одновременно:
new Vivus('logo', {
duration: 180,
type: 'sync'
});
Подходит для простых SVG или декоративных эффектов, где нет необходимости в последовательности.
Пути прорисовываются строго по очереди:
new Vivus('logo', {
duration: 180,
type: 'oneByOne'
});
Используется для сложных иллюстраций с логической структурой линий.
Поддерживается загрузка SVG по URL:
new Vivus('logo-container', {
file: '/assets/logo.svg',
duration: 200,
type: 'delayed'
});
Контейнер:
<div id="logo-container"></div>
SVG внедряется внутрь DOM автоматически, после чего применяется анимация.
Экземпляр Vivus предоставляет методы управления:
const animation = new Vivus('logo', {
duration: 200,
type: 'delayed'
});
Методы:
Запуск или продолжение:
animation.play();
Остановка анимации:
animation.stop();
Сброс состояния к исходному:
animation.reset();
Мгновенное завершение:
animation.finish();
Поддерживается функция обратного вызова:
new Vivus('logo', {
duration: 200,
type: 'delayed',
onReady: function (vivus) {
vivus.play();
}
}, function () {
console.log('animation complete');
});
Callback полезен при построении последовательных сцен интерфейса.
Параметр duration напрямую влияет на плавность и
скорость отрисовки. Чем больше значение, тем медленнее анимация.
Практическое поведение:
Порядок в DOM определяет последовательность отрисовки. Это
критический фактор при использовании oneByOne.
Пример структуры:
<svg id="logo">
<path d="..." />
<path d="..." />
<path d="..." />
</svg>
Изменение порядка элементов изменяет визуальную логику анимации без изменения JavaScript.
SVG может создаваться через JavaScript до инициализации Vivus:
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
svg.setAttribute('id', 'dynamic');
svg.setAttribute('viewBox', '0 0 100 100');
const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
path.setAttribute('d', 'M10 10 H 90 V 90 H 10 Z');
svg.appendChild(path);
document.body.appendChild(svg);
new Vivus('dynamic', {
duration: 150,
type: 'sync'
});
Vivus работает через свойства stroke-dasharray и
stroke-dashoffset.
Для корректного эффекта необходимо:
path {
stroke: black;
fill: none;
stroke-width: 2;
}
Любая заливка (fill) может визуально скрыть эффект
рисования.
Критически важно уменьшать сложность SVG:
<g>)Инструменты оптимизации:
Повторная анимация возможна через reset + play:
animation.reset();
animation.play();
Используется в интерфейсах с повторяемыми эффектами (например, hover или scroll-triggered анимации).
Несколько SVG могут анимироваться независимо:
const a = new Vivus('icon1', { duration: 120, type: 'sync' });
const b = new Vivus('icon2', { duration: 200, type: 'delayed' });
const c = new Vivus('icon3', { duration: 160, type: 'oneByOne' });
Каждый экземпляр управляет собственным DOM-элементом без пересечений состояния.
Без фреймворков Vivus интегрируется напрямую в DOM-логику:
document.addEventListener('DOMContentLoaded', () => {
const logo = new Vivus('logo', {
duration: 180,
type: 'delayed'
});
document.querySelector('#restart').addEventListener('click', () => {
logo.reset().play();
});
});
Такой подход характерен для классических SPA без зависимостей или для статических сайтов с интерактивными элементами.