| name | gsap-fundamentals |
| description | Core GSAP animation concepts including tweens, timelines, easing functions, and animation properties. Use when implementing basic animations, transitions, or learning GSAP foundations. Essential starting point for any GSAP-based animation work. |
GSAP Fundamentals
Core animation concepts with GreenSock Animation Platform.
Quick Start
npm install gsap
import gsap from 'gsap';
// Basic tween
gsap.to('.box', {
x: 200,
duration: 1,
ease: 'power2.out'
});
Core Concepts
Tween Types
| Method | Description | Use Case |
|---|---|---|
gsap.to() |
Animate from current → target | Most common |
gsap.from() |
Animate from target → current | Entrance animations |
gsap.fromTo() |
Animate from defined start → end | Full control |
gsap.set() |
Instantly set properties | Initial state |
Basic Tweens
// To: current state → target
gsap.to('.element', {
x: 100,
y: 50,
rotation: 360,
duration: 1
});
// From: target → current state
gsap.from('.element', {
opacity: 0,
y: -50,
duration: 0.5
});
// FromTo: explicit start and end
gsap.fromTo('.element',
{ opacity: 0, scale: 0.5 }, // from
{ opacity: 1, scale: 1, duration: 1 } // to
);
// Set: instant property change
gsap.set('.element', { visibility: 'visible', opacity: 0 });
Animation Properties
Transform Properties
gsap.to('.element', {
// Position
x: 100, // translateX in pixels
y: 50, // translateY in pixels
xPercent: 50, // translateX as percentage of element width
yPercent: -100, // translateY as percentage of element height
// Rotation
rotation: 360, // 2D rotation in degrees
rotationX: 45, // 3D rotation around X axis
rotationY: 45, // 3D rotation around Y axis
// Scale
scale: 1.5, // Uniform scale
scaleX: 2, // Horizontal scale
scaleY: 0.5, // Vertical scale
// Skew
skewX: 20, // Horizontal skew in degrees
skewY: 10, // Vertical skew in degrees
// Transform origin
transformOrigin: 'center center',
transformPerspective: 500,
duration: 1
});
CSS Properties
gsap.to('.element', {
// Colors
color: '#00F5FF',
backgroundColor: '#FF00FF',
borderColor: 'rgba(255, 215, 0, 0.5)',
// Dimensions
width: 200,
height: '50%',
padding: 20,
margin: '10px 20px',
// Display
opacity: 0.8,
visibility: 'visible',
display: 'block',
// Border
borderRadius: '50%',
borderWidth: 2,
// Shadow
boxShadow: '0 0 20px rgba(0, 245, 255, 0.5)',
duration: 1
});
SVG Properties
gsap.to('svg path', {
// Path morphing (requires MorphSVGPlugin)
morphSVG: '#targetPath',
// Draw SVG
strokeDashoffset: 0,
drawSVG: '100%',
// SVG attributes
attr: {
cx: 100,
cy: 100,
r: 50,
fill: '#00F5FF'
},
duration: 2
});
Timing Controls
Duration and Delay
gsap.to('.element', {
x: 100,
duration: 1, // Animation length in seconds
delay: 0.5, // Wait before starting
repeat: 3, // Repeat 3 times (4 total plays)
repeatDelay: 0.2, // Pause between repeats
yoyo: true // Reverse on alternate repeats
});
Infinite Repeat
gsap.to('.spinner', {
rotation: 360,
duration: 1,
repeat: -1, // Infinite repeat
ease: 'none' // Linear for constant speed
});
Stagger
// Animate multiple elements with offset timing
gsap.to('.card', {
y: 0,
opacity: 1,
duration: 0.5,
stagger: 0.1 // 0.1s delay between each element
});
// Advanced stagger
gsap.to('.grid-item', {
scale: 1,
duration: 0.3,
stagger: {
each: 0.05, // Time between each
from: 'center', // Start from center, edges, random, etc.
grid: [4, 4], // Grid dimensions for 2D stagger
axis: 'x' // Stagger along axis
}
});
Easing Functions
Built-in Eases
// Power eases (1-4, higher = more pronounced)
'power1.out' // Subtle deceleration
'power2.out' // Smooth deceleration (default feel)
'power3.out' // Strong deceleration
'power4.out' // Very strong deceleration
// Directional suffixes
'power2.in' // Accelerate
'power2.out' // Decelerate
'power2.inOut' // Accelerate then decelerate
// Special eases
'back.out(1.7)' // Overshoot then settle
'elastic.out' // Springy bounce
'bounce.out' // Ball-drop bounce
'circ.out' // Circular motion
'expo.out' // Exponential
'sine.out' // Gentle sine wave
Ease Comparison
// UI Elements - snappy, responsive
gsap.to('.button', { scale: 1.1, ease: 'power2.out', duration: 0.2 });
// Entrances - smooth deceleration
gsap.from('.modal', { y: 100, opacity: 0, ease: 'power3.out', duration: 0.5 });
// Playful - bounce or elastic
gsap.to('.notification', { y: 0, ease: 'back.out(1.7)', duration: 0.6 });
// Mechanical - linear
gsap.to('.progress', { width: '100%', ease: 'none', duration: 2 });
Custom Easing
import { CustomEase } from 'gsap/CustomEase';
gsap.registerPlugin(CustomEase);
// Create custom ease from SVG path
CustomEase.create('custom', 'M0,0 C0.25,0.1 0.25,1 1,1');
gsap.to('.element', {
x: 200,
ease: 'custom',
duration: 1
});
Controlling Tweens
Tween Instance Methods
const tween = gsap.to('.element', {
x: 200,
duration: 2,
paused: true // Start paused
});
// Playback control
tween.play();
tween.pause();
tween.resume();
tween.reverse();
tween.restart();
// Seeking
tween.seek(0.5); // Jump to 0.5 seconds
tween.progress(0.5); // Jump to 50%
tween.time(1); // Jump to 1 second
// Speed control
tween.timeScale(2); // Double speed
tween.timeScale(0.5); // Half speed
// State
tween.isActive(); // Currently animating?
tween.progress(); // Get current progress (0-1)
// Cleanup
tween.kill(); // Stop and remove
Callbacks
gsap.to('.element', {
x: 200,
duration: 1,
// Lifecycle callbacks
onStart: () => console.log('Started'),
onUpdate: () => console.log('Frame update'),
onComplete: () => console.log('Finished'),
onRepeat: () => console.log('Repeated'),
onReverseComplete: () => console.log('Reverse finished'),
// With parameters
onComplete: (param) => console.log('Done:', param),
onCompleteParams: ['myValue'],
// Access tween in callback
onUpdate: function() {
console.log('Progress:', this.progress());
}
});
Targeting Elements
Selector Strings
// CSS selectors
gsap.to('.class', { x: 100 });
gsap.to('#id', { x: 100 });
gsap.to('div', { x: 100 });
gsap.to('[data-animate]', { x: 100 });
gsap.to('.parent .child', { x: 100 });
DOM References
// Direct element reference
const element = document.querySelector('.box');
gsap.to(element, { x: 100 });
// NodeList / Array
const elements = document.querySelectorAll('.item');
gsap.to(elements, { x: 100, stagger: 0.1 });
// Array of mixed targets
gsap.to(['.box', '#circle', element], { opacity: 0.5 });
Object Properties
// Animate any object property
const obj = { value: 0, x: 100, y: 200 };
gsap.to(obj, {
value: 100,
x: 500,
duration: 2,
onUpdate: () => {
console.log(obj.value); // Interpolated value
// Update Three.js, Canvas, etc.
}
});
Common Patterns
Fade In/Out
// Fade in
gsap.from('.element', {
opacity: 0,
duration: 0.5
});
// Fade out and remove
gsap.to('.element', {
opacity: 0,
duration: 0.5,
onComplete: () => element.remove()
});
Slide Animations
// Slide in from left
gsap.from('.panel', {
x: -100,
opacity: 0,
duration: 0.5,
ease: 'power2.out'
});
// Slide in from bottom
gsap.from('.notification', {
y: 50,
opacity: 0,
duration: 0.4,
ease: 'power3.out'
});
Scale Animations
// Pop in
gsap.from('.modal', {
scale: 0.8,
opacity: 0,
duration: 0.3,
ease: 'back.out(1.7)'
});
// Pulse
gsap.to('.heart', {
scale: 1.2,
duration: 0.3,
repeat: -1,
yoyo: true,
ease: 'power1.inOut'
});
Temporal Collapse Patterns
Countdown-specific animations:
// Digit flip animation
function flipDigit(element, newValue) {
gsap.to(element, {
rotationX: -90,
opacity: 0,
duration: 0.3,
ease: 'power2.in',
onComplete: () => {
element.textContent = newValue;
gsap.fromTo(element,
{ rotationX: 90, opacity: 0 },
{ rotationX: 0, opacity: 1, duration: 0.3, ease: 'power2.out' }
);
}
});
}
// Time dilation pulse (cyan glow)
gsap.to('.countdown-digit', {
textShadow: '0 0 30px #00F5FF, 0 0 60px #00F5FF',
duration: 0.5,
repeat: -1,
yoyo: true,
ease: 'sine.inOut'
});
// Final countdown intensity ramp
function intensifyCountdown(secondsRemaining) {
const intensity = 1 - (secondsRemaining / 60);
gsap.to('.glow-element', {
filter: `brightness(${1 + intensity})`,
duration: 0.5
});
}
Performance Tips
// Use transforms over layout properties
// GOOD
gsap.to('.element', { x: 100, y: 50, scale: 1.2 });
// AVOID (triggers layout)
gsap.to('.element', { left: 100, top: 50, width: 200 });
// Force GPU acceleration
gsap.set('.element', { force3D: true });
// Kill tweens when component unmounts
const tween = gsap.to('.element', { x: 100 });
// Later...
tween.kill();
// Or kill all tweens on a target
gsap.killTweensOf('.element');
Reference
- See
gsap-sequencingfor timelines and complex sequences - See
gsap-reactfor React integration patterns - See
gsap-scrolltriggerfor scroll-based animations