SVG в браузере предоставляет два ключевых механизма управления
пунктирными линиями: stroke-dasharray и
stroke-dashoffset. Именно на их основе библиотека Vivus
реализует эффект «прорисовки» контура, создавая иллюзию того, что линия
появляется постепенно, как будто её рисуют вручную.
Каждый путь в SVG можно представить как непрерывную геометрическую
кривую, которая визуально формируется с помощью обводки
(stroke). Параметры пунктирности позволяют разбить эту
обводку на повторяющиеся сегменты.
stroke-dasharray определяет структуру
чередования «штрихов» и «пробелов».
Пример:
<path d="M10 10 H 300" stroke="black" stroke-dasharray="10 5" />
В этом случае линия будет состоять из отрезка длиной 10 единиц и пробела длиной 5 единиц, повторяющихся по всей траектории.
Если задать одно число:
stroke-dasharray="20"
то создаётся равномерный паттерн: 20 единиц линии и 20 единиц пробела.
Второй ключевой параметр —
stroke-dashoffset. Он смещает начальную
точку штрихов вдоль пути.
Если длина пути полностью покрыта одним «пунктиром», можно скрыть всю линию, сдвинув штрихи за пределы видимой области:
stroke-dasharray="1000"
stroke-dashoffset="1000"
В таком состоянии линия становится полностью невидимой, несмотря на наличие stroke.
Постепенное уменьшение stroke-dashoffset создаёт эффект
появления:
1000 → 0
Vivus использует именно комбинацию stroke-dasharray +
stroke-dashoffset, но автоматизирует вычисление длины
пути.
Основная логика:
Вычисляется длина каждого SVG path через
getTotalLength()
Устанавливается:
stroke-dasharray = pathLength
stroke-dashoffset = pathLengthЗначение stroke-dashoffset анимируется до 0
Таким образом каждая линия становится «завёрнутой» в невидимый контур, который постепенно разворачивается.
При использовании Vivus важно учитывать, что SVG path может иметь:
<g>Каждый из этих элементов получает собственный расчёт длины. Если путь состоит из нескольких сегментов, библиотека применяет анимацию к каждому отдельно.
Базовый вызов:
new Vivus('svgElement', {
type: 'delayed',
duration: 200,
animTimingFunction: Vivus.EASE
});
Хотя библиотека скрывает работу с dash-параметрами, внутренняя логика остаётся той же: установка полного смещения и его постепенное уменьшение.
Vivus поддерживает несколько режимов, которые по-разному управляют
изменением stroke-dashoffset.
Все элементы начинают и заканчивают прорисовку одновременно. Dash-offset изменяется синхронно для всех путей.
Каждый path анимируется отдельно. В этом случае создаётся эффект рисования сложного объекта по частям.
Пути начинают анимацию с небольшими задержками, создавая ощущение естественного рисования.
Метод getTotalLength() возвращает точную длину SVG-пути
в пикселях, но есть особенности:
Vivus фиксирует эти значения на момент инициализации, чтобы избежать скачков при перерисовке.
Ключевая идея: реальная пунктирная линия используется как маска.
Схема:
полный путь
→ превращается в один большой «штрих»
→ смещается за пределы видимости
→ постепенно возвращается
Это превращает обычную линию в управляемый анимационный объект.
Несмотря на то, что Vivus сам управляет
stroke-dasharray, ручная настройка может усиливать
визуальные эффекты.
stroke-dasharray="4 2"
Мелкий пунктир создаёт ощущение шероховатости при прорисовке.
stroke-dasharray="1 0"
Сплошная линия, максимально чистый эффект рисования.
stroke-dasharray="12 6"
Создаёт эффект карандашной штриховки.
Если SVG содержит несколько path-элементов, Vivus применяет к каждому:
Это позволяет строить сложные сцены: логотипы, схемы, иконки с детализацией.
SVG-элементы внутри <g> ведут себя как контейнеры.
Vivus рекурсивно обходит DOM-структуру и применяет анимацию ко всем
поддерживаемым элементам.
Особенность:
При работе с dash-offset возможны артефакты:
Причина — дробные значения длины пути и округление в рендерере браузера.
Тип окончания линии влияет на восприятие анимации:
butt — резкое завершениеround — мягкое округлениеsquare — удлинённый крайstroke-linecap="round"
Округлые окончания визуально сглаживают процесс «дорисовки».
При масштабировании SVG через viewBox важно
учитывать:
Vivus обычно рассчитывает длины один раз, поэтому изменение размеров после инициализации может нарушать синхронизацию.
Логотипы часто состоят из:
Vivus обрабатывает каждый контур независимо, но порядок отрисовки влияет на визуальную структуру:
Хотя Vivus управляет dashoffset через JavaScript, возможна параллельная работа с CSS:
path {
transition: stroke 0.3s ease;
}
В таком случае:
При повторной инициализации важно учитывать, что:
Это позволяет многократно запускать эффект прорисовки без ручного сброса состояния SVG.
При большом количестве элементов:
getTotalLength() становится затратнымТипичная оптимизация:
Параметр stroke-dashoffset используется не только для
прорисовки, но и для создания динамических эффектов:
Пример циклического смещения:
dashoffset → dashoffset - speed
Эффект работы Vivus основан на когнитивной интерпретации:
Именно управление пунктиром делает этот эффект возможным без сложной графической логики.