Анимация текста в SVG с Vivus строится вокруг преобразования буквенных форм в векторные контуры и управления параметрами обводки через stroke-dasharray и stroke-dashoffset. Библиотека Vivus ориентирована на поэтапное «прорисовывание» SVG-объектов, поэтому любые текстовые эффекты реализуются через разбиение текста на отдельные пути или группы путей.
SVG-текст в исходном виде (<text>) не содержит
геометрии обводки, пригодной для покадровой отрисовки. Vivus работает
исключительно с <path>, <line>,
<polyline>, <polygon>.
Поэтому базовая трансформация текста выглядит так:
<path>На практике текст обычно преобразуется заранее в редакторе (Inkscape, Illustrator) или динамически через font-to-path механизмы.
Пример SVG после конвертации:
<svg viewBox="0 0 600 200">
<path d="M10 80 L50 80 ..." />
<path d="M60 80 L100 80 ..." />
</svg>
Каждый <path> соответствует части букв или целому
символу.
Анимация любого SVG начинается с создания экземпляра:
new Vivus('svg-element', {
duration: 120,
type: 'delayed',
animTimingFunction: Vivus.EASE
});
Ключевые параметры:
duration — общее количество шагов анимацииtype — стратегия воспроизведенияdelayed — последовательная отрисовка путейsync — одновременная анимация всех путейoneByOne — строгая поэлементная последовательностьНаиболее важный этап — формирование структуры SVG.
Каждая буква должна быть отдельным path:
<svg id="logo" viewBox="0 0 500 100">
<g id="letter-a">
<path d="M10 80 L30 10 L50 80 Z" />
</g>
<g id="letter-b">
<path d="M60 10 L60 80 ..." />
</g>
</svg>
Такая структура позволяет управлять буквами как независимыми единицами.
Слова группируются через <g>:
<g id="word-hello">
<path d="..." />
<path d="..." />
<path d="..." />
</g>
<g id="word-world">
<path d="..." />
<path d="..." />
</g>
Это позволяет применять Vivus на уровне слова или буквы.
При анимации букв используется либо несколько экземпляров Vivus, либо
один SVG с режимом oneByOne.
new Vivus('text-svg', {
type: 'oneByOne',
duration: 200
});
Каждый path воспринимается как отдельный сегмент. Если буквы разложены на несколько path, анимация автоматически следует их порядку в DOM.
Порядок отрисовки определяется порядком узлов:
<path id="a" />
<path id="b" />
<path id="c" />
Изменение порядка DOM изменяет последовательность появления букв.
Слова требуют группировки и отдельного управления таймингом.
<g>const words = document.querySelectorAll('svg g');
words.forEach((word, index) => {
new Vivus(word, {
duration: 80,
type: 'delayed'
});
});
Каждое слово получает собственный экземпляр анимации.
Добавление задержек:
words.forEach((word, index) => {
setTimeout(() => {
new Vivus(word, {
duration: 100,
type: 'oneByOne'
});
}, index * 400);
});
Таким образом создаётся эффект «печати» текста по словам.
Vivus опирается на свойства stroke:
path {
fill: none;
stroke: #000;
stroke-width: 2;
}
Для более выраженного эффекта используется:
path {
fill: transparent;
stroke: #111;
stroke-linecap: round;
stroke-linejoin: round;
}
Внутри Vivus реализует управление длиной пути:
stroke-dasharray задаёт длину штриховstroke-dashoffset скрывает/показывает линиюПринцип:
dashoffset = длина пути → линия скрыта
dashoffset = 0 → линия полностью видима
Vivus автоматически вычисляет длину каждого path через
getTotalLength().
Сложные текстовые композиции строятся через сценарии:
new Vivus('svg-text', {
type: 'scenario',
duration: 150,
animTimingFunction: Vivus.LINEAR
});
Сценарий позволяет задавать индивидуальное поведение для групп букв и слов, комбинируя синхронную и последовательную анимацию.
Наиболее гибкая модель строится на вложенной структуре:
<svg id="text">
<g class="word">
<path class="letter" />
<path class="letter" />
</g>
<g class="word">
<path class="letter" />
<path class="letter" />
</g>
</svg>
Логика анимации:
document.querySelectorAll('.word').forEach((word, i) => {
setTimeout(() => {
new Vivus(word, { duration: 80, type: 'oneByOne' });
}, i * 500);
});
При большом количестве букв возникают проблемы производительности:
Короткие анимации снижают нагрузку на repaint:
duration: 60
Текст делится на блоки, анимация запускается по мере появления блока в зоне видимости.
Для имитации рукописного текста используются:
stroke-linecap: roundduration по буквамПример вариативной скорости:
paths.forEach((p, i) => {
new Vivus(p, {
duration: 40 + i * 10,
type: 'delayed'
});
});
При создании титров и заставок применяется комбинированная схема:
synconeByOnenew Vivus('bg-layer', { type: 'sync', duration: 100 });
setTimeout(() => {
new Vivus('main-text', { type: 'oneByOne', duration: 180 });
}, 300);
Каждая буква векторного текста представляет собой:
Это влияет на визуальное поведение анимации: сложные буквы (например, «Ж», «М», «Ю») содержат больше sub-path и анимируются дольше.
После завершения stroke-анимации часто применяется заливка:
onReady: function () {
this.el.classList.add('drawn');
}
.drawn path {
fill: #000;
transition: fill 0.4s ease;
}
Путь = буква
Путь = слово
Путь = строка
Гибридная модель
Анимация текста в SVG через Vivus опирается на структурирование графем в векторные пути и управление порядком их отрисовки через DOM-иерархию и параметры воспроизведения библиотеки.