SVG-текст в многорядной структуре в корне отличается от привычной
работы с DOM-текстом: браузер отрисовывает <text> и
<tspan> как единый объект, но внутри SVG отсутствует
привычная блочная модель. При анимации через Vivus это становится
критичным, потому что библиотека работает не с текстовыми узлами, а с
путями (paths), и каждая строка многострочного текста превращается в
набор отдельных геометрических контуров.
SVG не имеет полноценной текстовой верстки уровня HTML. Многострочный текст формируется через:
<tspan>x и y<text>
элементыПример структуры:
<text x="0" y="30">
<tspan x="0" dy="0">Первая строка</tspan>
<tspan x="0" dy="25">Вторая строка</tspan>
<tspan x="0" dy="25">Третья строка</tspan>
</text>
Каждый tspan фактически становится независимым
сегментом, но логически остаётся частью одного текстового блока. При
преобразовании в пути это приводит к множеству отдельных контуров,
которые Vivus будет анимировать по очереди или параллельно.
Vivus не работает с текстовыми узлами напрямую. Для анимации многострочного текста используется предварительная конвертация в SVG paths. Это можно сделать несколькими способами:
После конвертации структура выглядит так:
<svg>
<path d="M10 10 ..."/>
<path d="M10 40 ..."/>
<path d="M10 70 ..."/>
</svg>
Каждый path соответствует отдельной строке текста.
Именно это делает возможной корректную анимацию многорядных блоков.
Vivus строит анимацию на основе:
Многострочный текст в виде paths становится набором независимых контуров, но логически может быть объединён в единый анимационный поток.
Ключевой момент: порядок path в DOM определяет порядок появления строк.
Пример поведения:
<svg id="logo">
<path d="..." />
<path d="..." />
<path d="..." />
</svg>
<script>
new Vivus('logo', {
type: 'oneByOne',
duration: 120
});
</script>
Каждый path будет анимирован отдельно, что визуально соответствует появлению строк текста.
После перевода текста в paths теряется семантика строк. Интервал между строками теперь определяется исключительно координатами контуров.
Типичные проблемы:
Решение заключается в предварительном построении координат:
<g>translate(y)Пример:
<svg id="text">
<g transform="translate(0, 0)">
<path d="..." />
</g>
<g transform="translate(0, 40)">
<path d="..." />
</g>
<g transform="translate(0, 80)">
<path d="..." />
</g>
</svg>
Такой подход сохраняет управляемую структуру многострочного текста.
Vivus позволяет управлять порядком отрисовки, но не предоставляет встроенного уровня для строк. Поэтому логика многорядного текста строится через:
<g>При поэтапной анимации:
const blocks = document.querySelectorAll('#text g');
blocks.forEach((block, index) => {
new Vivus(block, {
type: 'delayed',
duration: 80,
start: 'autostart'
});
});
Каждая строка начинает анимацию независимо, создавая эффект «печатающегося» многострочного текста.
При необходимости сохранить ощущение единого текста используется режим синхронизации:
new Vivus('text', {
type: 'sync',
duration: 200
});
В этом режиме все paths, включая строки текста, анимируются одновременно, но с сохранением их геометрической структуры.
При работе с многострочным текстом в виде paths важно учитывать стили:
fill часто отключается для эффекта «рисования»strokestroke-dasharray и
stroke-dashoffsetТипичная конфигурация:
path {
fill: none;
stroke: #000;
stroke-width: 2;
}
После завершения анимации часто выполняется переключение:
SVG с текстом, преобразованным в paths, теряет текстовую адаптивность. При изменении размера:
Решение заключается в использовании:
viewBoxПример:
<svg viewBox="0 0 300 150">
Это позволяет сохранять структуру многострочного текста независимо от контейнера.
При сложных композициях многострочный текст делится на смысловые блоки:
Каждый блок становится отдельной группой SVG:
<g id="title"></g>
<g id="subtitle"></g>
<g id="body"></g>
Это позволяет управлять анимацией на уровне смысловой структуры, а не только геометрии.
Один из наиболее выразительных эффектов при работе с Vivus — каскадное появление строк.
Реализуется через:
pathTimingFunctionПример каскада:
blocks.forEach((block, i) => {
setTimeout(() => {
new Vivus(block, {
type: 'oneByOne',
duration: 100
});
}, i * 300);
});
Такой подход создаёт эффект постепенного «раскрытия» текста построчно.
При использовании многострочного текста в Vivus важно учитывать ограничения:
Поэтому оптимизация часто включает:
Расширенные визуальные эффекты строятся через SVG masks:
Пример логики:
Это позволяет создавать эффект «проявляющегося текста» построчно.
При построении сложных интерфейсов с Vivus многострочный текст рассматривается как система:
Такой подход позволяет масштабировать: