| Need | Use |
|---|---|
| Animate from current values to new ones | gsap.to(target, {...}) |
| Animate from given values to current ones | gsap.from(target, {...}) |
| Full control over start and end | gsap.fromTo(target, {...}, {...}) |
| Instantly set values, no animation | gsap.set(target, {...}) |
| Several steps in sequence/parallel | gsap.timeline() then .to()/.from() on it |
| High-frequency updates (mousemove/drag) | gsap.quickTo() / gsap.quickSetter() |
| Effect | Plugin |
|---|---|
| Scroll-triggered play/scrub/pin | ScrollTrigger |
| Smooth-scrolling wrapper | ScrollSmoother (built on ScrollTrigger) |
| Drag/sortable/spinnable elements | Draggable |
| Animate between two DOM/layout states | Flip |
| Per-char/word/line text animation | SplitText |
| Typewriter/scramble text reveal | ScrambleTextPlugin |
| Animate along an SVG path | MotionPathPlugin |
| Morph one SVG shape into another | MorphSVGPlugin |
| Draw/erase an SVG stroke | DrawSVGPlugin |
| Animate a raw CSS rule (not an element) | CSSRulePlugin |
| Physics-based deceleration/snap | InertiaPlugin |
| Normalize wheel/touch/pointer input | Observer (low-level; ScrollTrigger uses it internally) |
| Debug/scrub a timeline visually | GSDevTools |
scrub when the animation should track scroll position (parallax, progress bar). toggleActions (with start/end) when it should play once on entering/leaving the viewport.stagger — it supports from, grid, and per-index easing that a manual loop has to reimplement.quickTo/quickSetter — calling gsap.to() per frame creates a new tween each time and is wasteful.gsap.registerPlugin(...) once (per plugin) before use — a missing registration is the most common "my plugin properties are ignored" bug.gsap.context() and call ctx.revert() on unmount — prevents leaked tweens/ScrollTriggers across remounts.ScrollTrigger.refresh() after any layout change that happens outside GSAP's control (images loading, fonts swapping, accordion toggles) so trigger positions stay accurate.invalidateOnRefresh: true on a ScrollTrigger-driven tween when its start/end values depend on element size (so they recalculate on resize instead of using stale pixel values).x, y, scale, rotation) over left/top/width/height — they're GPU-accelerated and don't trigger layout.force3D: "auto" (the default) decide when to promote to the GPU; don't force true globally, it costs memory per promoted element.autoAlpha instead of opacity when an element should also stop intercepting pointer events at 0.