SVG (Scalable Vector Graphics) представляет собой векторный формат, который идеально подходит для анимаций на веб-страницах благодаря своей масштабируемости без потери качества. GSAP (GreenSock Animation Platform) предоставляет мощные инструменты для работы с SVG, включая анимацию отдельных элементов, атрибутов и даже сложных путей.
Для начала, каждый SVG-элемент можно анимировать с помощью GSAP через
функцию gsap.to() или gsap.fromTo(). Например,
анимация движения круга по оси X:
gsap.to("#circle", {
duration: 2,
x: 200,
ease: "power2.inOut"
});
Ключевой момент: GSAP напрямую манипулирует свойствами CSS и
SVG-атрибутами, такими как cx, cy,
r, stroke-dasharray,
stroke-dashoffset.
stroke-dasharray и
stroke-dashoffsetДля создания эффекта “рисования” линии используется комбинация
stroke-dasharray и stroke-dashoffset.
Вычисление длины пути: Метод
getTotalLength() возвращает длину пути в пикселях:
const path = document.querySelector("#line");
const length = path.getTotalLength();Инициализация атрибутов:
path.style.strokeDasharray = length;
path.style.strokeDashoffset = length;Анимация рисования:
gsap.to(path, {
strokeDashoffset: 0,
duration: 2,
ease: "power1.inOut"
});Эта техника особенно эффективна для анимации логотипов и интерактивных диаграмм.
SVG-элементы имеют свои особенности при трансформациях. Свойство
transformOrigin определяет точку, вокруг которой происходят
вращения и масштабирование. Значения можно задавать в процентах или
пикселях:
gsap.to("#square", {
rotation: 45,
scale: 1.5,
transformOrigin: "50% 50%",
duration: 1
});
Важно: при анимации сложных SVG-групп <g> точка
трансформации применяется ко всей группе, а не к отдельным
элементам.
gsap.timeline() позволяет объединять последовательные
анимации в единый поток, упрощая синхронизацию нескольких
SVG-элементов:
const tl = gsap.timeline({ repeat: -1, yoyo: true });
tl.to("#circle", { x: 100, duration: 1 })
.to("#rect", { y: 50, duration: 1 }, "<")
.to("#line", { strokeDashoffset: 0, duration: 2 }, "-=0.5");
Ключевой момент: относительные позиции ("<" и
"-=0.5") позволяют запускать анимации одновременно или с
перекрытием.
Для адаптивного дизайна важно, чтобы SVG-элементы корректно масштабировались на различных экранах. Основные подходы:
Использование viewBox и preserveAspectRatio
viewBox="0 0 200 200" задает координатную систему
SVG.preserveAspectRatio="xMidYMid meet" сохраняет пропорции
при изменении размеров контейнера.Анимация относительно процентов Вместо абсолютных пикселей применять относительные единицы:
gsap.to("#circle", {
x: "50%", // смещение на 50% ширины контейнера
duration: 1.5
});Обновление при ресайзе Использование события
resize для пересчета координат:
window.addEventListener("resize", () => {
const width = window.innerWidth;
gsap.set("#circle", { x: width * 0.5 });
});MorphSVGPlugin позволяет плавно трансформировать один путь в другой. Это особенно полезно для интерактивных и визуально выразительных интерфейсов.
gsap.to("#shape1", {
duration: 2,
morphSVG: "#shape2",
ease: "power2.inOut"
});
Особенности использования:
GSAP предоставляет большое количество easing-функций
(power1, power2, elastic,
bounce) для создания естественного движения. Пример:
gsap.to("#circle", {
x: 300,
duration: 2,
ease: "elastic.out(1, 0.3)"
});
Использование stagger позволяет добавлять
последовательное смещение для группы элементов:
gsap.to(".dots", {
y: 50,
duration: 1,
stagger: 0.2,
ease: "power1.inOut"
});
will-change: transform
для элементов, которые анимируются.viewBox и
preserveAspectRatio.stroke-dasharray и
stroke-dashoffset.Эти практики обеспечивают плавные, адаптивные и масштабируемые SVG-анимации с высокой производительностью на всех устройствах.