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
You Might Also Like
Related Skills

verify
Use when you want to validate changes before committing, or when you need to check all React contribution requirements.
facebook
test
Use when you need to run tests for React core. Supports source, www, stable, and experimental channels.
facebook
feature-flags
Use when feature flag tests fail, flags need updating, understanding @gate pragmas, debugging channel-specific test failures, or adding new flags to React.
facebook
extract-errors
Use when adding new error messages to React, or seeing "unknown error code" warnings.
facebook