Работа с текстом в SVG в контексте анимации через Vivus требует
преобразования текстовых элементов в векторные контуры. Причина
заключается в том, что SVG-текст (<text>) остаётся
семантическим элементом, зависящим от шрифтовой подсистемы браузера,
тогда как механика рисования через stroke-dasharray и
stroke-dashoffset работает только с геометрическими путями
(<path>).
Любая типографика, предназначенная для эффекта «прорисовки линии», должна быть преобразована в набор контуров, где каждая буква представляет собой замкнутую или разомкнутую кривую Безье.
SVG-текст обладает рядом особенностей, несовместимых с построчным рисованием:
Анимационные библиотеки, ориентированные на отрисовку контура,
включая Vivus, работают исключительно с элементами, содержащими
getTotalLength() и getPointAtLength(),
доступными только для path, circle,
polyline и аналогичных геометрических примитивов.
Преобразование шрифта в path основано на декомпозиции глифов:
Каждый символ становится набором команд:
M — moveTo (перемещение пера)L — lineTo (линия)C — cubic Bezier curveQ — quadratic Bezier curveZ — замыкание контураПреобразование текста выполняется через функцию создания контуров:
Результатом становится набор <path> элементов
вместо <text>.
Особенность экспорта — генерация избыточных узлов, требующих последующей оптимизации.
Inkscape обеспечивает аналогичную операцию:
В отличие от Illustrator, структура path часто более компактна, но возможны проблемы с кривыми при сложных шрифтах.
FontForge позволяет извлекать глифы напрямую из шрифтовых файлов:
.ttf или .otfФормирование path осуществляется на уровне исходной гарнитуры, что обеспечивает более точную геометрию.
Для фронтенд-пайплайнов применяется библиотека
opentype.js, позволяющая выполнять конвертацию прямо в
браузере или Node.js.
Принцип работы:
Пример логики:
opentype.load('font.ttf', function(err, font) {
const path = font.getPath('Vivus', 0, 0, 72);
const svgPath = path.toPathData();
});
Результатом является строка, пригодная для вставки в
<path d="...">.
После конвертации текста в path структура SVG изменяется следующим образом:
<svg viewBox="0 0 500 200">
<path d="M10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80" />
</svg>
Каждая буква может быть:
Vivus использует последовательное вычисление длины каждого path и распределяет анимацию по сегментам.
Качество конвертации напрямую влияет на визуальный результат:
Оптимальная структура предполагает:
После преобразования текста в path требуется оптимизация геометрии.
Основные операции:
Инструменты оптимизации:
SVG с конвертированным текстом становится значительно тяжелее
исходного <text>:
getTotalLength()Особенно критично при:
При конвертации в path теряются:
Каждый символ становится независимой геометрией, что приводит к необходимости ручной корректировки расстояний между буквами.
Для компенсации применяются:
SVG не сохраняет автоматическую верстку после преобразования в path. Каждая строка формируется отдельно:
<g>Структура:
<g transform="translate(0, 0)">
<path d="..." />
</g>
<g transform="translate(0, 60)">
<path d="..." />
</g>
Vivus поддерживает анимацию отдельных сегментов path. Для текста это используется следующим образом:
Такой подход позволяет добиться эффекта «написания текста» с контролируемой скоростью.
После преобразования текста в path:
fill или
strokeОсобенность заключается в том, что градиенты перестают зависеть от текстовой метрики и начинают зависеть от геометрии контура.
Path-структуры позволяют применять расширенные SVG-фильтры:
Текстовые элементы в исходной форме ограничены в применении подобных эффектов.