Для создания анимации обводки SVG (stroke animation) в GSAP
используется сочетание свойств stroke-dasharray и
stroke-dashoffset. Эти свойства позволяют имитировать
постепенное “рисование” линий, кривых и фигур.
stroke-dasharray задаёт шаблон пунктирной линии: длины сегментов и пробелов. Для плавной анимации линии обычно устанавливают значение равное общей длине контура SVG. stroke-dashoffset определяет смещение начала линии. Анимация от полной длины к нулю создаёт эффект прорисовки.
gsap.fromTo("#line",
{ strokeDasharray: 500, strokeDashoffset: 500 },
{ strokeDashoffset: 0, duration: 2, ease: "power1.inOut" }
);
В этом примере:
#line — идентификатор SVG-элемента;strokeDasharray и strokeDashoffset равны
длине линии, что полностью скрывает контур;strokeDashoffset: 0 открывает линию по мере
анимации;duration задаёт длительность;ease контролирует плавность движения.Для динамических SVG часто требуется автоматически вычислять длину
пути. GSAP не делает этого автоматически, поэтому используется метод
getTotalLength():
const path = document.querySelector("#line");
const length = path.getTotalLength();
gsap.fromTo(path,
{ strokeDasharray: length, strokeDashoffset: length },
{ strokeDashoffset: 0, duration: 3, ease: "power2.out" }
);
Этот подход гарантирует корректную анимацию для любых кривых и сложных контуров.
Для сложных SVG с несколькими элементами удобно использовать
timeline. Это позволяет синхронизировать анимации или
запускать их с задержкой.
const tl = gsap.timeline({ defaults: { duration: 1, ease: "power1.inOut" } });
tl.fromTo("#path1",
{ strokeDasharray: path1Length, strokeDashoffset: path1Length },
{ strokeDashoffset: 0 }
)
.fromTo("#path2",
{ strokeDasharray: path2Length, strokeDashoffset: path2Length },
{ strokeDashoffset: 0 },
"-=0.5"
);
"-=0.5" указывает на перекрытие анимаций: вторая линия
начинает анимироваться за 0.5 секунды до окончания первой.
Для усиления визуального эффекта можно комбинировать обводку с
изменением stroke и opacity:
gsap.fromTo("#line",
{ strokeDasharray: length, strokeDashoffset: length, stroke: "#ff0000", opacity: 0 },
{ strokeDashoffset: 0, stroke: "#0000ff", opacity: 1, duration: 2 }
);
В этом примере:
GSAP позволяет привязать анимацию к событиям, например, hover или клику:
const line = document.querySelector("#line");
const length = line.getTotalLength();
line.addEventListener("mouseenter", () => {
gsap.fromTo(line,
{ strokeDasharray: length, strokeDashoffset: length },
{ strokeDashoffset: 0, duration: 1 }
);
});
Такой подход делает SVG более интерактивным и динамичным.
Свойство timeScale позволяет управлять скоростью всей
анимации timeline:
tl.timeScale(2); // ускоряет анимацию в 2 раза
Для циклических эффектов применяется repeat и
yoyo:
gsap.fromTo("#line",
{ strokeDasharray: length, strokeDashoffset: length },
{ strokeDashoffset: 0, duration: 2, repeat: -1, yoyo: true, ease: "power1.inOut" }
);
Это создаёт бесконечную анимацию “рисования и стирания” контура.
Анимацию обводки SVG можно комбинировать с масками и другими элементами SVG:
<svg width="400" height="200">
<mask id="mask">
<path id="line" d="M10 80 C 40 10, 65 10, 95 80" stroke="white" fill="transparent" stroke-width="4"/>
</mask>
<rect width="100%" height="100%" fill="blue" mask="url(#mask)"/>
</svg>
Анимация линии в маске будет постепенно открывать цветной фон, создавая эффект прорисовки с заполнением.
getTotalLength() для
надёжной анимации любых SVG.timeline для комплексных сцен и
синхронизации нескольких элементов.strokeDashoffset с цветом и прозрачностью
для более выразительных эффектов.Такой подход делает работу с обводкой SVG в GSAP гибкой, эффективной и визуально привлекательной.