GSAP (GreenSock Animation Platform) предоставляет мощный и гибкий инструмент для анимации отдельных элементов текста. Анимация разбитого текста позволяет создавать эффект появления или трансформации каждой буквы, слова или строки независимо, обеспечивая визуально сложные и динамичные эффекты.
Для начала необходимо разделить текст на отдельные элементы. В GSAP чаще всего используют утилиту SplitText. Она позволяет автоматически разбить текст на три уровня: строки, слова и символы.
import { gsap } from "gsap";
import SplitText from "gsap/SplitText";
gsap.registerPlugin(SplitText);
const text = document.querySelector(".text");
const split = new SplitText(text, { type: "chars, words, lines" });
chars — отдельные символы.words — отдельные слова.lines — строки текста.После этого каждый символ, слово и строка становятся отдельными
HTML-элементами (<div> или
<span>), что позволяет применять к ним анимацию
независимо.
Для создания эффектов появления по буквам используется метод
gsap.from или gsap.to. Основная идея —
задавать начальные состояния символов и плавно изменять их к
конечному.
gsap.from(split.chars, {
duration: 1,
opacity: 0,
y: 50,
stagger: 0.05,
ease: "back.out(1.7)"
});
opacity: 0 делает символы прозрачными в начале.y: 50 задает смещение по вертикали.stagger: 0.05 обеспечивает последовательное появление
символов с задержкой 0.05 секунды.ease: "back.out(1.7)" добавляет эффект пружины,
создавая плавное и естественное движение.Анимация по словам позволяет создавать интересные эффекты, например, «волны» текста:
gsap.from(split.words, {
duration: 1,
opacity: 0,
scale: 0.5,
x: -30,
stagger: 0.1,
ease: "power3.out"
});
scale: 0.5 уменьшает слово до половины размера в начале
анимации.x: -30 смещает слова по горизонтали.stagger: 0.1 позволяет словам появляться друг за другом
с небольшой задержкой.Иногда эффект лучше смотреть на уровне строк:
gsap.from(split.lines, {
duration: 1.2,
opacity: 0,
y: 30,
stagger: 0.2,
ease: "power2.out"
});
Строки текста появляются последовательно, создавая плавное вертикальное движение всего абзаца.
GSAP позволяет комбинировать анимации с помощью Timeline. Это дает полный контроль над последовательностью появления символов, слов и линий:
const tl = gsap.timeline();
tl.from(split.chars, { duration: 0.8, opacity: 0, y: 20, stagger: 0.04, ease: "back.out(1.5)" })
.from(split.words, { duration: 0.6, scale: 0.8, opacity: 0, stagger: 0.08, ease: "power1.out" }, "-=0.5")
.from(split.lines, { duration: 1, y: 20, opacity: 0, stagger: 0.15, ease: "power2.out" }, "-=0.7");
"-=0.5", "-=0.7") позволяют накладывать
анимации друг на друга, создавая более сложные и динамичные
эффекты.back, elastic, power
для естественных движений.gsap.from(split.chars, {
duration: 1,
opacity: 0,
y: 40,
stagger: {
amount: 1.5,
from: "random"
},
ease: "elastic.out(1, 0.5)"
});
from: "random" случайным образом выбирает порядок
появления символов.amount: 1.5 распределяет задержку по всей
последовательности символов.Для создания бесконечной анимации текста используется свойство
repeat:
gsap.fromTo(split.chars,
{ y: 20, opacity: 0 },
{ y: 0, opacity: 1, duration: 0.8, stagger: 0.05, repeat: -1, yoyo: true }
);
repeat: -1 запускает анимацию бесконечно.yoyo: true обеспечивает обратное движение после каждого
цикла.Анимацию разбитого текста можно связывать с событиями пользователя: hover, scroll, click:
document.querySelector(".text").addEventListener("mouseenter", () => {
gsap.to(split.chars, { y: -10, rotation: 15, duration: 0.5, stagger: 0.03, ease: "power2.out" });
});
document.querySelector(".text").addEventListener("mouseleave", () => {
gsap.to(split.chars, { y: 0, rotation: 0, duration: 0.5, stagger: 0.03, ease: "power2.out" });
});
will-change: transform в CSS для
элементов, чтобы браузер заранее оптимизировал анимацию.timeline вместо
отдельного вызова анимации для каждого символа.Анимация разбитого текста с GSAP позволяет создавать визуально сложные и динамичные эффекты появления текста. Использование SplitText в комбинации с Timeline, Stagger и разнообразными Ease обеспечивает полный контроль над движением символов, слов и строк, позволяя интегрировать анимацию как в простые заголовки, так и в сложные интерактивные интерфейсы.