Sternkarte wird gezeichnetRaumanzug wird angelegtTriebwerke laufen warmBereit zum Start00%

Alle Notizen
3 Min. LesezeitGSAPMotion

Warum ich immer wieder zu GSAP greife

Zum ersten Mal habe ich GSAP vor Jahren bei einem Spielestart eingesetzt. Bis heute ist es die Animations-Library, mit der ich am liebsten arbeite – und das habe ich dabei gelernt.

Zum ersten Mal habe ich GSAP auf der Website zu Saints Row eingesetzt. Das Briefing war alles andere als leise: große Typo, Explosionen, eine Seite, die sich anfühlt wie das Spiel selbst. Mit CSS-Transitions wären wir da nicht weit gekommen, also haben wir zu GreenSock gegriffen. Seitdem ist es in fast jedem meiner Projekte mit echter Animation dabei, auch in diesem hier.

Es ist weder das neueste noch das angesagteste Werkzeug. Aber es kann das, was mir bei Animationen am wichtigsten ist: Es hält sich im Hintergrund und lässt mich über das Timing nachdenken.

Timelines statt Verzögerungen

Die erste Angewohnheit, die mir GSAP abgewöhnt hat, waren Animationsketten mit Verzögerungen. Delays funktionieren genau so lange, bis man einen davon ändert – und dann ist alles danach aus dem Takt.

Eine Timeline beschreibt stattdessen die Abfolge:

TypeScript
gsap
  .timeline({ defaults: { ease: "expo.out" } })
  .fromTo(menu, { clipPath: "circle(0% at 94% 4%)" }, { clipPath: "circle(150% at 94% 4%)", duration: 1 })
  .from(links, { yPercent: 110, stagger: 0.06 }, "-=0.5")
  .from(footer, { autoAlpha: 0, y: 16 }, "-=0.7");

Das ist das mobile Menü auf dieser Seite. "-=0.5" bedeutet: eine halbe Sekunde vor dem Ende des vorigen Schritts beginnen. Die Links tauchen also schon auf, während sich der Kreis noch öffnet. Mache ich den Kreis langsamer, zieht alles andere automatisch mit. Und weil es eine Timeline ist, genügt zum Schließen ein tl.reverse(), nur etwas schneller abgespielt.

Das meiste Gefühl steckt im Easing

Wenn ich eine einzige Sache nennen müsste, die hochwertige Animation von billiger unterscheidet, dann das Easing. Fast alles auf dieser Seite verwendet expo.out: ein schneller Start und eine lange, weiche Landung. Das wirkt reaktionsschnell, weil die Bewegung sofort einsetzt, und trotzdem ruhig, weil nichts abrupt stehen bleibt.

Ich lege es einmal als Standard fest und weiche nur ab, wenn es einen guten Grund gibt:

TypeScript
gsap.defaults({ ease: "expo.out", duration: 1.1 });

ScrollTrigger und SplitText erledigen die schwere Arbeit

Die meisten Text-Animationen hier sind drei Zeilen Code. SplitText zerlegt eine Überschrift in Zeilen und legt jede davon in eine Maske; ScrollTrigger spielt die Animation ab, sobald sie ins Bild scrollt:

TypeScript
SplitText.create(heading, {
  type: "lines",
  mask: "lines",
  autoSplit: true,
  onSplit: (self) => gsap.from(self.lines, { yPercent: 105, stagger: 0.09, scrollTrigger: { trigger: heading, start: "top 88%" } }),
});

autoSplit teilt den Text neu auf, sobald Schriften geladen sind oder sich die Fenstergröße ändert. Darum musste ich mich früher selbst kümmern, und es war eine nie versiegende Quelle für Bugs. Seit GSAP komplett kostenlos ist, Plugins wie SplitText inklusive, gibt es auch keinen Grund mehr, darauf zu verzichten.

Ein Takt für alles

Auf dieser Seite laufen Lenis für weiches Scrollen, eine 3D-Szene und eine Handvoll ScrollTrigger gleichzeitig. Hätte jedes davon seine eigene requestAnimationFrame-Schleife, würden sie um einen Frame auseinanderlaufen – und das spürt man als Ruckeln. Deshalb hängt alles an GSAPs Ticker:

TypeScript
gsap.ticker.add((time) => lenis.raf(time * 1000));
gsap.ticker.lagSmoothing(0);

Astronaut, Sterne und Scrollposition werden im selben Frame und in derselben Reihenfolge aktualisiert. Eine Kleinigkeit, durch die sich die ganze Seite solide anfühlt.

Hinter sich aufräumen

In React ist der useGSAP-Hook der wohl am meisten unterschätzte Teil der Library. Alles, was darin entsteht, wird zurückgesetzt, sobald die Komponente verschwindet – beim Seitenwechsel bleiben also keine ScrollTrigger übrig. Und was erst später entsteht, etwa in einem Promise oder Event-Handler, wird mit contextSafe ebenfalls sauber mit aufgeräumt. Bevor ich das konsequent genutzt habe, waren liegengebliebene ScrollTrigger der häufigste Animationsfehler in meinem Code.

Rücksicht auf alle, die keine Bewegung wollen

Zum Schluss das Wichtigste: Manchen Menschen wird von Animationen schwindlig, oder sie lenken sie zu sehr ab – und das teilen sie ihrem System auch mit. Ich prüfe das, bevor ich irgendetwas einrichte. Wer reduzierte Bewegung eingestellt hat, sieht den Text einfach erscheinen, und der Astronaut bleibt ruhig. Gute Animation ist von vornherein optional.

GSAP macht Animationen nicht von selbst gut. Aber es macht es billig, Dinge auszuprobieren, umzuentscheiden und am Timing zu feilen – und genau dort entsteht das Gute.

Melde dich

Worum geht's?