home / skills / bbeierle12 / skill-mcp-claude / gsap-fundamentals
This skill helps you learn and apply core GSAP animation concepts like tweens, timelines, and easing to create smooth web animations.
npx playbooks add skill bbeierle12/skill-mcp-claude --skill gsap-fundamentalsReview the files below or copy the command above to add this skill to your agents.
---
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
```bash
npm install gsap
```
```javascript
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
```javascript
// 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
```javascript
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
```javascript
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
```javascript
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
```javascript
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
```javascript
gsap.to('.spinner', {
rotation: 360,
duration: 1,
repeat: -1, // Infinite repeat
ease: 'none' // Linear for constant speed
});
```
### Stagger
```javascript
// 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
```javascript
// 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
```javascript
// 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
```javascript
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
```javascript
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
```javascript
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
```javascript
// 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
```javascript
// 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
```javascript
// 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
```javascript
// 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
```javascript
// 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
```javascript
// 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:
```javascript
// 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
```javascript
// 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-sequencing` for timelines and complex sequences
- See `gsap-react` for React integration patterns
- See `gsap-scrolltrigger` for scroll-based animations
This skill teaches core GSAP animation concepts for building smooth, performant web animations. It covers tweens (to/from/fromTo/set), transform/CSS/SVG properties, easing, timing controls, and basic control APIs. Use it as the essential starting point when implementing UI transitions, element entrances, or simple timeline sequences. The content focuses on practical examples and patterns you can drop into projects.
The skill inspects and explains GSAP primitives: how to create tweens, configure properties, and control playback with instance methods and callbacks. It breaks down timing (duration, delay, repeat, stagger), easing selection, and performance tips like preferring transforms and killing tweens on teardown. Examples show targeting via selectors, DOM refs, NodeLists, and animating plain objects for canvas/Three.js integration.
Which tween method should I use for entrances?
Use gsap.from for entrance animations (targets animate from a defined state into the current layout).
How do I choose an ease?
Pick snappy eases like power1/out for UI, power2/3 for natural motion, and back/elastic for playful effects; test values visually.
How do I prevent memory leaks?
Kill tweens on unmount with tween.kill() or gsap.killTweensOf(target) and avoid lingering infinite repeats unless needed.