| name | elite-gsap |
| description | Complete GSAP (GreenSock Animation Platform) reference for elite web animations. Covers ScrollTrigger, SplitText, Flip, MorphSVG, DrawSVG, MotionPath, Observer, Draggable, timelines, Lenis smooth scroll, and framework integration. 2026 UPDATE: All GSAP plugins are now 100% FREE (Webflow acquisition). Use when asked about: GSAP, gsap, GreenSock, ScrollTrigger, scroll animations, SplitText, text animations, Flip plugin, layout animations, MorphSVG, DrawSVG, SVG animations, complex animations, animation library, pinned sections, horizontal scroll, parallax effects, smooth scroll, Lenis, or any sophisticated web animation needs. IMPORTANT: Always load elite-accessibility alongside this skill for reduced-motion patterns. References elite-design-core for design tokens.
|
Elite GSAP
The most powerful animation library for the web. All plugins now 100% free.
2026 Update: GSAP is Free
As of Webflow's acquisition, all GSAP plugins (including former "Club" plugins) are completely free for commercial use:
- ScrollTrigger
- SplitText
- Flip
- MorphSVG
- DrawSVG
- MotionPathPlugin
- Physics2D
- Inertia
- CustomEase
No more licensing restrictions.
Quick Reference
Core Setup
Installation
npm install gsap
Plugin Registration
Register plugins once at app entry point:
import gsap from 'gsap';
import { ScrollTrigger } from 'gsap/ScrollTrigger';
import { SplitText } from 'gsap/SplitText';
import { Flip } from 'gsap/Flip';
import { DrawSVGPlugin } from 'gsap/DrawSVGPlugin';
import { MorphSVGPlugin } from 'gsap/MorphSVGPlugin';
import { MotionPathPlugin } from 'gsap/MotionPathPlugin';
gsap.registerPlugin(
ScrollTrigger,
SplitText,
Flip,
DrawSVGPlugin,
MorphSVGPlugin,
MotionPathPlugin
);
Context & Cleanup (CRITICAL)
Always use gsap.context() to scope animations. This prevents memory leaks in SPAs and component-based frameworks.
Vanilla JS
const ctx = gsap.context(() => {
gsap.from('.hero-title', { opacity: 0, y: 50 });
gsap.from('.hero-description', { opacity: 0, y: 30, delay: 0.3 });
ScrollTrigger.create({
trigger: '.section',
start: 'top center',
onEnter: () => console.log('entered')
});
}, containerElement);
ctx.revert();
Why This Matters
Without context:
- Animations persist after component unmount
- ScrollTriggers keep listening to removed elements
- Memory leaks accumulate
- SPA navigation breaks animations
With context:
- Single
revert() call cleans everything
- Safe for React/Vue/Svelte components
- No stale references
Essential Animation Patterns
Basic Tween
gsap.to('.element', {
x: 100,
opacity: 0.5,
duration: 1,
ease: 'power2.out'
});
gsap.from('.element', {
opacity: 0,
y: 50,
duration: 0.8,
ease: 'power3.out'
});
gsap.fromTo('.element',
{ opacity: 0, y: 50 },
{ opacity: 1, y: 0, duration: 0.8 }
);
gsap.set('.element', { opacity: 1, y: 0 });
Stagger Animations
gsap.from('.card', {
opacity: 0,
y: 30,
duration: 0.6,
stagger: 0.1
});
gsap.from('.grid-item', {
opacity: 0,
scale: 0.8,
duration: 0.5,
stagger: {
each: 0.1,
from: 'center',
grid: [4, 6],
axis: 'x'
}
});
Easing
gsap.to('.el', { x: 100, ease: 'power1.out' });
gsap.to('.el', { x: 100, ease: 'power2.out' });
gsap.to('.el', { x: 100, ease: 'power3.out' });
gsap.to('.el', { x: 100, ease: 'power4.out' });
gsap.to('.el', { x: 100, ease: 'elastic.out(1, 0.3)' });
gsap.to('.el', { x: 100, ease: 'back.out(1.7)' });
gsap.to('.el', { x: 100, ease: 'bounce.out' });
gsap.to('.el', { x: 100, ease: 'M0,0 C0.7,0 0.3,1 1,1' });
Callbacks
gsap.to('.element', {
x: 100,
duration: 1,
onStart: () => console.log('Animation started'),
onUpdate: () => console.log('Frame update'),
onComplete: () => console.log('Animation complete'),
onReverseComplete: () => console.log('Reversed to start')
});
prefers-reduced-motion (CRITICAL)
Always respect user motion preferences:
const mm = gsap.matchMedia();
mm.add('(prefers-reduced-motion: no-preference)', () => {
gsap.from('.hero', {
opacity: 0,
y: 50,
duration: 1,
ease: 'power3.out'
});
});
mm.add('(prefers-reduced-motion: reduce)', () => {
gsap.set('.hero', { opacity: 1, y: 0 });
});
See elite-accessibility skill for comprehensive patterns.
GPU-Accelerated Properties
For 60fps performance, only animate:
x, y (translateX, translateY)
xPercent, yPercent
scale, scaleX, scaleY
rotation, rotationX, rotationY
opacity
Never animate:
width, height
top, left, right, bottom
margin, padding
border-width
gsap.to('.card', { x: 100, y: 50, scale: 1.1, rotation: 5, opacity: 0.8 });
gsap.to('.card', { width: 200, height: 200, marginLeft: 50 });
ScrollTrigger Quick Start
import { ScrollTrigger } from 'gsap/ScrollTrigger';
gsap.registerPlugin(ScrollTrigger);
gsap.from('.section-content', {
opacity: 0,
y: 50,
duration: 1,
scrollTrigger: {
trigger: '.section',
start: 'top 80%',
end: 'bottom 20%',
toggleActions: 'play none none none',
}
});
ScrollTrigger.create({
trigger: '.sticky-section',
start: 'top top',
end: '+=100%',
pin: true,
pinSpacing: true
});
gsap.to('.parallax-element', {
y: -100,
ease: 'none',
scrollTrigger: {
trigger: '.parallax-section',
start: 'top bottom',
end: 'bottom top',
scrub: true
}
});
See scrolltrigger.md for comprehensive patterns.
SplitText Quick Start
import { SplitText } from 'gsap/SplitText';
gsap.registerPlugin(SplitText);
const split = new SplitText('.headline', {
type: 'chars,words,lines',
linesClass: 'line'
});
gsap.from(split.chars, {
opacity: 0,
y: 50,
rotationX: -90,
stagger: 0.02,
duration: 0.8,
ease: 'power4.out'
});
See splittext.md for text animation patterns.
Flip Plugin Quick Start
import { Flip } from 'gsap/Flip';
gsap.registerPlugin(Flip);
const state = Flip.getState('.cards');
container.appendChild(newCard);
card.classList.toggle('expanded');
filterCards();
Flip.from(state, {
duration: 0.6,
ease: 'power2.inOut',
stagger: 0.05,
absolute: true,
onEnter: elements => gsap.from(elements, { opacity: 0, scale: 0.8 }),
onLeave: elements => gsap.to(elements, { opacity: 0, scale: 0.8 })
});
See flip-plugin.md for layout animation patterns.
Timeline Quick Start
const tl = gsap.timeline({
defaults: { duration: 0.8, ease: 'power3.out' }
});
tl.from('.hero-title', { opacity: 0, y: 50 })
.from('.hero-description', { opacity: 0, y: 30 }, '-=0.5')
.from('.hero-cta', { opacity: 0, y: 20 }, '-=0.3')
.from('.hero-image', { opacity: 0, scale: 0.9 }, '<');
tl.play();
tl.pause();
tl.reverse();
tl.seek(0.5);
tl.progress(0.5);
See timelines.md for orchestration patterns.
Common Patterns
Reveal on Scroll
const mm = gsap.matchMedia();
mm.add('(prefers-reduced-motion: no-preference)', () => {
gsap.utils.toArray('.reveal').forEach(element => {
gsap.from(element, {
opacity: 0,
y: 40,
duration: 0.8,
ease: 'power3.out',
scrollTrigger: {
trigger: element,
start: 'top 85%',
toggleActions: 'play none none none'
}
});
});
});
Horizontal Scroll Section
const mm = gsap.matchMedia();
mm.add('(prefers-reduced-motion: no-preference)', () => {
const panels = gsap.utils.toArray('.panel');
const wrapper = document.querySelector('.horizontal-wrapper');
gsap.to(panels, {
xPercent: -100 * (panels.length - 1),
ease: 'none',
scrollTrigger: {
trigger: wrapper,
pin: true,
scrub: 1,
snap: 1 / (panels.length - 1),
end: () => '+=' + wrapper.scrollWidth
}
});
});
Magnetic Button
const button = document.querySelector('.magnetic-btn');
button.addEventListener('mousemove', (e) => {
const rect = button.getBoundingClientRect();
const x = e.clientX - rect.left - rect.width / 2;
const y = e.clientY - rect.top - rect.height / 2;
gsap.to(button, {
x: x * 0.3,
y: y * 0.3,
duration: 0.3,
ease: 'power2.out'
});
});
button.addEventListener('mouseleave', () => {
gsap.to(button, {
x: 0,
y: 0,
duration: 0.5,
ease: 'elastic.out(1, 0.3)'
});
});
Text Reveal with Mask
const split = new SplitText('.headline', { type: 'lines', linesClass: 'line' });
split.lines.forEach(line => {
const wrapper = document.createElement('div');
wrapper.style.overflow = 'hidden';
line.parentNode.insertBefore(wrapper, line);
wrapper.appendChild(line);
});
gsap.from(split.lines, {
yPercent: 100,
opacity: 0,
duration: 1,
stagger: 0.1,
ease: 'power4.out'
});
Debugging
gsap.config({
nullTargetWarn: true
});
ScrollTrigger.defaults({
markers: process.env.NODE_ENV === 'development'
});
gsap.to('.el', {
x: 100,
onUpdate: function() {
console.log('Progress:', this.progress());
}
});
Framework Integration
See framework-integration.md for:
- React with
@gsap/react
- Vue composition API patterns
- Svelte lifecycle patterns
- Vanilla JS module patterns
Related Skills
- elite-accessibility - Motion accessibility and prefers-reduced-motion patterns
- elite-performance - Build optimization and Core Web Vitals
- elite-css-animations - CSS-native animation alternatives
- elite-layouts - Layout patterns (bento grids, horizontal scroll, sticky sections)
- elite-brand-design - Brand identity and visual systems
Resources