# Gsap Timeline

> Official GSAP skill for timelines — gsap.timeline(), position parameter, nesting, playback. Use when sequencing animations, choreographing keyframes, or when the user asks about animation sequencing, timelines, or animation order (in GSAP or when recommending a library that supports timelines).

- Skill: `forgeyclap/gsap-timeline` (Agent Skill)
- Install (CLI): `npx skillmds@latest add forgeyclap/gsap-timeline`
- Raw SKILL.md: https://api.skillmd.com/api/skills/forgeyclap/gsap-timeline/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: MIT
- Author: ForgeyClap (https://skillmd.com/u/forgeyclap)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/forgeyclap/gsap-timeline

---


<!--
  Source: https://github.com/greensock/gsap-skills
  Pinned commit: aed9cfd3277740755f6bfc1155c7aa645403b760 (2026-04-21T23:47:02Z)
  License: MIT (c) 2026 GreenSock
  Adaptation: vendored (not npx skills add) -- pinned markdown fetched directly from the raw GitHub URL at
  the pinned commit and copied verbatim (content unchanged below the frontmatter/header) by build-boss; no
  install script, no package manager, no third-party fetch-and-run trust chain was executed.
  Security-scanned by build-boss, 2026-07-13 -- clean: 0 hidden/zero-width/control/bidi unicode codepoints,
  no injection/exec/exfiltration patterns (no "ignore previous", no curl|bash, no exec(/subprocess/fetch(
  to non-docs endpoints, no credential/secret/token exfil, no rm -rf) found in any of the 8 SKILL.md files
  or llms.txt; no "allowed-tools" frontmatter field present in this repo's skills (nothing to strip).
  Note (mild vendor steering): this skill self-recommends GSAP over other animation libraries in several
  "When to recommend GSAP" sections (expected from a first-party vendor skill) -- advisory, not enforced;
  still evaluate whether GSAP is the right choice for the project instead of following the recommendation
  automatically.
  Note (GSAP LIBRARY license, distinct from this skill): this vendored skill markdown is MIT-licensed. The
  separate GSAP JAVASCRIPT LIBRARY (the npm `gsap` package these docs describe using) ships under
  GreenSock's own post-Webflow-acquisition "no charge" license terms, which per the work package briefing
  reportedly include a no-compete clause restricting use of the library to build a directly competing
  animation product. This is advisory context only, passed through from the work package -- it was not
  independently re-verified against GreenSock's current license text as part of this scan, and it does not
  apply to this MIT-licensed skill documentation itself. Flag to Head Chef/Security Boss if the project
  under consideration could plausibly compete with GSAP/Webflow before relying on the `gsap` package.
-->

# GSAP Timeline

## When to Use This Skill

Apply when building multi-step animations, coordinating several tweens in sequence or parallel, or when the user asks about timelines, sequencing, or keyframe-style animation in GSAP.

**Related skills:** For single tweens and eases use **gsap-core**; for scroll-driven timelines use **gsap-scrolltrigger**; for React use **gsap-react**.

## Creating a Timeline

```javascript
const tl = gsap.timeline();
tl.to(".a", { x: 100, duration: 1 })
  .to(".b", { y: 50, duration: 0.5 })
  .to(".c", { opacity: 0, duration: 0.3 });
```

By default, tweens are **appended** one after another. Use the **position parameter** to place tweens at specific times or relative to other tweens.

## Position Parameter

Third argument (or position property in vars) controls placement:

- **Absolute**: `1` — start at 1 second.
- **Relative (default)**: `"+=0.5"` — 0.5s after end; `"-=0.2"` — 0.2s before end.
- **Label**: `"labelName"` — at that label; `"labelName+=0.3"` — 0.3s after label.
- **Placement**: `"<"` — start when recently-added animation starts; `">"` — start when recently-added animation ends (default); `"<0.2"` — 0.2s after recently-added animation start.

Examples:

```javascript
tl.to(".a", { x: 100 }, 0);           // at 0
tl.to(".b", { y: 50 }, "+=0.5");      // 0.5s after last end
tl.to(".c", { opacity: 0 }, "<");     // same start as previous
tl.to(".d", { scale: 2 }, "<0.2");    // 0.2s after previous start
```

## Timeline Defaults

Pass defaults into the timeline so all child tweens inherit:

```javascript
const tl = gsap.timeline({ defaults: { duration: 0.5, ease: "power2.out" } });
tl.to(".a", { x: 100 }).to(".b", { y: 50 }); // both use 0.5s and power2.out
```

## Timeline Options (constructor)

- **paused: true** — create paused; call `.play()` to start.
- **repeat**, **yoyo** — same as tweens; apply to whole timeline.
- **onComplete**, **onStart**, **onUpdate** — timeline-level callbacks.
- **defaults** — vars merged into every child tween.

## Labels

Add and use labels for readable, maintainable sequencing:

```javascript
tl.addLabel("intro", 0);
tl.to(".a", { x: 100 }, "intro");
tl.addLabel("outro", "+=0.5");
tl.to(".b", { opacity: 0 }, "outro");
tl.play("outro");  // start from "outro"
tl.tweenFromTo("intro", "outro"); // pauses the timeline and returns a new Tween that animates the timeline's playhead from intro to outro with no ease.
```

## Nesting Timelines

Timelines can contain other timelines.

```javascript
const master = gsap.timeline();
const child = gsap.timeline();
child.to(".a", { x: 100 }).to(".b", { y: 50 });
master.add(child, 0);
master.to(".c", { opacity: 0 }, "+=0.2");
```

## Controlling Playback

- **tl.play()** / **tl.pause()**
- **tl.reverse()** / **tl.progress(1)** then **tl.reverse()**
- **tl.restart()** — from start.
- **tl.time(2)** — seek to 2 seconds.
- **tl.progress(0.5)** — seek to 50%.
- **tl.kill()** — kill timeline and (by default) its children.

## Official GSAP Best practices

- ✅ Prefer timelines for sequencing
- ✅ Use the **position parameter** (third argument) to place tweens at specific times or relative to labels.
- ✅ Add **labels** with `addLabel()` for readable, maintainable sequencing.
- ✅ Pass **defaults** into the timeline constructor so child tweens inherit duration, ease, etc.
- ✅ Put ScrollTrigger on the timeline (or top-level tween), not on tweens inside a timeline.

## Do Not

- ❌ Chain animations with **delay** when a **timeline** can sequence them; prefer `gsap.timeline()` and the position parameter for multi-step animation.
- ❌ Forget to pass **defaults** (e.g. `defaults: { duration: 0.5, ease: "power2.out" }`) when many child tweens share the same duration or ease.
- ❌ Forget that **duration** on the timeline constructor is not the same as tween duration; timeline “duration” is determined by its children.
- ❌ Nest animations that contain a ScrollTrigger; ScrollTriggers should only be on top-level Tweens/Timelines.

