ToolHub
View All Posts

CSS-Animationsleitfaden: Übergänge, Keyframes und Performance

CSS-Animationen erwecken Oberflächen zum Leben, bieten visuelles Feedback, lenken die Benutzeraufmerksamkeit und schaffen unvergessliche Erlebnisse. Gut gemachte Animationen fühlen sich natürlich und intuitiv an; schlecht gemachte verursachen Ruckeln, lenken Benutzer ab und können sogar körperliches Unbehagen hervorrufen. Dieser Leitfaden deckt alles ab – von den Grundlagen der Übergänge und Keyframes bis hin zu fortgeschrittener Performance-Optimierung und Barrierefreiheit – und gibt Ihnen das Wissen, um flüssige, zweckmäßige und inklusive Animationen zu erstellen.

CSS-Übergänge vs. Animationen

CSS bietet zwei verschiedene Mechanismen zur Erstellung von Bewegung: Übergänge und Animationen. Das Verständnis, wann jeder zu verwenden ist, ist grundlegend für effektives CSS-Animationsarbeiten.

CSS-Übergänge

Übergänge animieren die Änderung zwischen zwei Zuständen einer CSS-Eigenschaft. Sie definieren, welche Eigenschaft animiert werden soll, die Animationsdauer und die Easing-Kurve, und der Browser übernimmt automatisch die Interpolation zwischen Start- und Endwert. Übergänge werden durch Zustandsänderungen wie Hover, Fokus, Hinzufügen von Klassen oder JavaScript-Eigenschaftsänderungen ausgelöst.

.button {
  background: #3b82f6;
  transform: scale(1);
  transition: background 0.3s ease, transform 0.2s ease;
}

.button:hover {
  background: #2563eb;
  transform: scale(1.05);
}

Übergänge eignen sich hervorragend für einfache Zwei-Zustands-Animationen. Sie erfordern minimalen Code, sind leicht zu verstehen und funktionieren zuverlässig in allen Browsern. Die Einschränkung besteht darin, dass sie nur zwischen zwei Werten animieren – Sie können keine Zwischenschritte definieren.

CSS-Animationen (Keyframes)

Animationen verwenden die @keyframes-Regel, um eine Sequenz von Stiländerungen über eine beliebige Anzahl von Schritten zu definieren. Im Gegensatz zu Übergängen können Animationen unabhängig von Zustandsänderungen ausgeführt werden, endlos schleifen, rückwärts abspielen und pausieren. Sie geben Ihnen präzise Kontrolle über jeden Frame der Animation.

@keyframes pulse {
  0% {
    transform: scale(1);
    opacity: 1;
  }
  50% {
    transform: scale(1.05);
    opacity: 0.8;
  }
  100% {
    transform: scale(1);
    opacity: 1;
  }
}

.pulse-element {
  animation: pulse 2s ease-in-out infinite;
}

Wann welche verwenden

SzenarioÜbergang verwendenAnimation verwenden
Hover-EffektJaNein
Fokus-ZustandJaNein
Sichtbarkeit umschaltenJaMöglicherweise
Mehrstufige SequenzNeinJa
Schleifende AnimationNeinJa
ZustandsunabhängigNeinJa
EingangsanimationMöglicherweiseJa

Keyframe-Syntax im Detail

Die @keyframes-Regel ist das Herzstück von CSS-Animationen. Ein gründliches Verständnis ihrer Syntax erschließt die volle Kraft mehrstufiger Animationssequenzen.

Prozentbasierte Keyframes

Keyframes werden mit Prozentwerten von 0% bis 100% definiert, die den Fortschritt auf der Animationszeitachse darstellen. Sie können so viele Keyframes definieren, wie Sie benötigen, und der Browser interpoliert zwischen ihnen:

@keyframes bounce {
  0%, 100% {
    transform: translateY(0);
  }
  25% {
    transform: translateY(-20px);
  }
  50% {
    transform: translateY(0);
  }
  75% {
    transform: translateY(-10px);
  }
}

Mehrere Keyframes können denselben Stilblock teilen, indem Prozentwerte durch Kommas getrennt werden, wie 0%, 100% im obigen Beispiel. Dies ist nützlich für Animationen, die zu ihrem Ausgangszustand zurückkehren.

Animation-Kurzschreibweise

Die animation-Kurzschreibeigenschaft kombiniert acht Untereigenschaften in einer Deklaration. Die Reihenfolge ist: name, duration, timing-function, delay, iteration-count, direction, fill-mode und play-state.

.element {
  animation: slideIn 0.5s ease-out 0.2s 1 forwards running;
}

/* Equivalent longhand */
.element {
  animation-name: slideIn;
  animation-duration: 0.5s;
  animation-timing-function: ease-out;
  animation-delay: 0.2s;
  animation-iteration-count: 1;
  animation-direction: normal;
  animation-fill-mode: forwards;
  animation-play-state: running;
}

Animation-Fill-Mode

Die animation-fill-mode-Eigenschaft steuert, welche Stile vor und nach der Ausführung der Animation angewendet werden. Dies ist eine der am häufigsten missverstandenen Animationseigenschaften:

Easing-Funktionen

Easing-Funktionen (auch Timing-Funktionen genannt) definieren die Beschleunigungskurve der Animation. Sie bestimmen, ob die Animation langsam beginnt und dann beschleunigt, schnell beginnt und dann verlangsamt oder komplexeren Mustern folgt. Die richtige Easing-Funktion lässt eine Animation natürlich wirken; die falsche lässt sie mechanisch oder abrupt erscheinen.

Integrierte Easing-Funktionen

Kubische Bézierkurven

Die cubic-bezier()-Funktion ermöglicht es Ihnen, benutzerdefinierte Easing-Kurven mit präziser Kontrolle zu definieren. Sie akzeptiert vier Parameter, die die Kontrollpunkte einer kubischen Bézierkurve darstellen: cubic-bezier(x1, y1, x2, y2). Die x-Werte repräsentieren die Zeit (0 bis 1), die y-Werte den Fortschritt (können 0-1 für Überschwingeffekte überschreiten).

.element {
  /* Smooth deceleration - great for entrances */
  transition: transform 0.3s cubic-bezier(0.0, 0.0, 0.2, 1.0);

  /* Smooth acceleration - great for exits */
  transition: transform 0.2s cubic-bezier(0.4, 0.0, 1, 1);

  /* Material Design standard easing */
  transition: transform 0.3s cubic-bezier(0.4, 0.0, 0.2, 1);
}

Schrittfunktionen

Die steps()-Funktion erstellt diskrete Frame-für-Frame-Animationen anstelle von glatter Interpolation. Dies ist nützlich für Sprite-Animationen oder zur Erstellung eines »Tipp«-Effekts:

@keyframes typing {
  from { width: 0; }
  to { width: 100%; }
}

.typing-effect {
  animation: typing 3s steps(40, end);
  overflow: hidden;
  white-space: nowrap;
}

Performance-Optimierung

Flüssige Animationen erfordern 60 Bilder pro Sekunde (fps), was bedeutet, dass jeder Frame innerhalb von 16,67 Millisekunden abgeschlossen sein muss. Das Nichterreichen dieses Budgets führt zu sichtbarem Ruckeln – Bildschirmzittern, ausgelassenen Frames und verschlechterter Benutzererfahrung. Das Verständnis der Browser-Render-Pipeline ist der Schlüssel zum Schreiben performanter Animationen.

Render-Pipeline

Wenn sich eine CSS-Eigenschaft ändert, durchläuft der Browser bis zu drei Phasen, um die Anzeige zu aktualisieren:

  1. Stil: Bestimmt, welche CSS-Regeln auf welche Elemente angewendet werden.
  2. Layout: Berechnet die Größe und Position jedes Elements. Wird durch Änderungen an width, height, margin, padding, top, left, font-size und anderen geometrischen Eigenschaften ausgelöst.
  3. Paint: Füllt Pixel für jedes Element. Wird durch Änderungen an color, background, box-shadow, border-radius und anderen visuellen Eigenschaften ausgelöst.
  4. Compositing: Kombiniert die gemalten Ebenen in der richtigen Reihenfolge. Nur dieser Schritt läuft auf der GPU. Wird durch Änderungen an transform und opacity ausgelöst.

Animationen, die nur den Compositing-Schritt auslösen, sind am performantesten, da sie Layout und Paint vollständig überspringen. Deshalb sind transform und opacity der Goldstandard für performante CSS-Animationen.

Nur-Compositor-Eigenschaften

EigenschaftLöst Layout aus?Löst Paint aus?GPU-Compositing?
transformNeinNeinJa
opacityNeinNeinJa
filterNeinJaManchmal
top / leftJaJaNein
width / heightJaJaNein
margin / paddingJaJaNein
background-colorNeinJaNein
box-shadowNeinJaNein

Verwendung von will-change

Die will-change-Eigenschaft teilt dem Browser mit, welche Eigenschaften sich voraussichtlich ändern werden, und ermöglicht ihm, im Voraus zu optimieren, indem das Element in eine eigene Compositor-Ebene heraufgestuft wird. Sie sollte jedoch mit Bedacht verwendet werden:

/* Apply will-change just before the animation */
.element:hover {
  will-change: transform;
}

/* Remove it after the animation completes */
.element {
  transition: transform 0.3s ease;
}

Häufige Fehler bei will-change sind die Anwendung auf zu viele Elemente (jede Compositor-Ebene verbraucht GPU-Speicher) und das dauerhafte Beibehalten (verschwendet Ressourcen). Gute Praxis ist, will-change kurz vor Beginn der Animation per JavaScript hinzuzufügen und nach Ende der Animation zu entfernen.

Transform statt Layout-Eigenschaften verwenden

Die effektivste Performance-Optimierung besteht darin, layoutauslösende Eigenschaften durch transform zu ersetzen:

Performance-Regel: Wenn Sie denselben visuellen Effekt mit transform oder opacity erzielen können, priorisieren Sie diese immer gegenüber Eigenschaften, die Layout oder Paint auslösen. Dieses Prinzip beseitigt die meisten Animations-Performance-Probleme.

Häufige Animationsmuster

Bestimmte Animationsmuster tauchen in Web-Oberflächen immer wieder auf. Die Beherrschung dieser Muster gibt Ihnen ein Toolkit für die meisten gängigen UI-Animationsbedürfnisse.

1. Einblenden

Die einfachste und vielseitigste Eingangsanimation. Das Element geht von transparent zu deckend über:

@keyframes fadeIn {
  from { opacity: 0; }
  to { opacity: 1; }
}

.fade-in {
  animation: fadeIn 0.4s ease-out forwards;
}

2. Nach oben gleiten und einblenden

Ein dynamischerer Eingangseffekt, der vertikale Bewegung mit Transparenzänderung kombiniert. Dies erzeugt das Gefühl, dass das Element von unten ankommt:

@keyframes slideUpFade {
  from {
    opacity: 0;
    transform: translateY(20px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

.slide-up {
  animation: slideUpFade 0.5s cubic-bezier(0.4, 0, 0.2, 1) forwards;
}

3. Hover-Skalierung

Eine subtile Skalierungserhöhung beim Hover bietet zufriedenstellendes Interaktionsfeedback:

.card {
  transition: transform 0.2s ease, box-shadow 0.2s ease;
}

.card:hover {
  transform: translateY(-4px) scale(1.02);
  box-shadow: 0 12px 24px rgba(0, 0, 0, 0.15);
}

4. Gestaffelte Listenanimation

Wenn eine Liste von Elementen erscheint, erzeugt das Festlegen gestaffelter Animationsverzögerungen für jedes Element einen kaskadierenden Effekt, der das Auge führt:

.list-item {
  opacity: 0;
  transform: translateY(10px);
  animation: slideUpFade 0.3s ease-out forwards;
}

.list-item:nth-child(1) { animation-delay: 0.0s; }
.list-item:nth-child(2) { animation-delay: 0.05s; }
.list-item:nth-child(3) { animation-delay: 0.1s; }
.list-item:nth-child(4) { animation-delay: 0.15s; }
.list-item:nth-child(5) { animation-delay: 0.2s; }

Für dynamische Listen verwenden Sie JavaScript, um animation-delay basierend auf dem Index jedes Elements festzulegen, oder CSS-Benutzerdefinierte Eigenschaften: style="animation-delay: calc(var(--i) * 0.05s)".

5. Lade-Spinner

Eine sanfte kontinuierliche Rotation ist der klassische Ladeindikator:

@keyframes spin {
  to { transform: rotate(360deg); }
}

.spinner {
  width: 24px;
  height: 24px;
  border: 3px solid rgba(255, 255, 255, 0.2);
  border-top-color: #3b82f6;
  border-radius: 50%;
  animation: spin 0.8s linear infinite;
}

Animations-Barrierefreiheit: prefers-reduced-motion

Nicht alle Benutzer profitieren von Animationen. Für Menschen mit vestibulären Störungen, Bewegungsempfindlichkeit oder bestimmten kognitiven Erkrankungen können Animationen Schwindel, Übelkeit oder Anfälle verursachen. Die prefers-reduced-motion-Medienabfrage ermöglicht es Ihnen, die systemweite Präferenz des Benutzers für reduzierte Bewegung zu respektieren.

Reduzierte Animation implementieren

Der empfohlene Ansatz besteht darin, Animationen für Benutzer zu aktivieren, die keine Präferenz für reduzierte Bewegung eingestellt haben:

/* Default: no animation for users who prefer reduced motion */
.element {
  opacity: 1;
  transform: none;
}

/* Only animate for users who have no motion preference */
@media (prefers-reduced-motion: no-preference) {
  .element {
    animation: slideUpFade 0.5s ease-out forwards;
  }
}

Alternativ können Sie bestimmte Animationen für Benutzer deaktivieren, die reduzierte Bewegung bevorzugen:

.element {
  animation: slideUpFade 0.5s ease-out forwards;
}

@media (prefers-reduced-motion: reduce) {
  .element {
    animation: none;
    opacity: 1;
    transform: none;
  }

  /* Keep functional transitions but shorten duration */
  * {
    animation-duration: 0.01ms !important;
    transition-duration: 0.01ms !important;
  }
}

Was beibehalten und was entfernen

Wenn ein Benutzer reduzierte Bewegung bevorzugt, sollten nicht alle Animationen entfernt werden. Funktionale Animationen, die Bedeutung oder Zustand vermitteln, sollten beibehalten, aber vereinfacht werden:

Animationsbibliotheken

Während CSS-Animationen die meisten UI-Anforderungen abdecken, bieten JavaScript-Animationsbibliotheken fortgeschrittene Funktionen wie physikbasierte Bewegung, scrollgesteuerte Animationen und Orchestrierung komplexer Sequenzen.

CSS-First-Bibliotheken

JavaScript-Animationsbibliotheken

Wann JavaScript vs. CSS verwenden

CSS für einfache deklarative Animationen, die auf Zustandsänderungen reagieren. JavaScript für: physikbasierte Bewegung (Federn, Impuls), scrollgesteuerte Animationen, komplexe Sequenzen mit präziser Zeitsteuerung, dynamische Animationsparameter, die zur Laufzeit berechnet werden, oder Animationen, die programmatisch pausiert, umgekehrt oder gezogen werden müssen.

Animationen debuggen

Animationsfehler können subtil und schwer zu diagnostizieren sein. Die richtigen Debugging-Tools und -Techniken machen den Prozess effizienter.

Chrome DevTools Animationspanel

Chrome DevTools enthält ein spezielles Animationspanel mit leistungsstarken Debugging-Funktionen:

Performance-Analyse

Verwenden Sie das Performance-Panel in Chrome DevTools, um Animationsruckeln zu identifizieren:

Häufige Debugging-Szenarien

Arbeiten Sie mit CSS? Probieren Sie unsere kostenlosen CSS-Tools zum Formatieren, Minifizieren und Optimieren Ihrer Stylesheets für die Produktion aus.

CSS-FormatiererCSS-Minifizierer

Häufig gestellte Fragen

Sollte ich CSS-Übergänge oder CSS-Animationen verwenden?

CSS-Übergänge eignen sich für einfache Zustandsänderungen von Punkt A nach Punkt B, wie Hover-Effekte, Fokus-Zustände und Sichtbarkeitsumschaltung. CSS-Animationen (Keyframes) eignen sich für komplexe mehrstufige Sequenzen, schleifende Animationen oder Animationen, die unabhängig von Zustandsänderungen ausgeführt werden müssen. Übergänge sind einfacher; Animationen bieten mehr Kontrolle.

Welche CSS-Eigenschaften können sicher für die Performance animiert werden?

Die performantesten Eigenschaften für Animationen sind transform und opacity, da sie vollständig vom GPU-Compositor verarbeitet werden können, ohne Layout oder Paint auszulösen. Andere Eigenschaften wie width, height, margin und top lösen teure Layout-Neuberechnungen aus. Priorisieren Sie immer transform: translateX() gegenüber left und transform: scale() gegenüber width/height-Änderungen.

Wie mache ich Animationen für empfindliche Benutzer barrierefrei?

Verwenden Sie die prefers-reduced-motion-Medienabfrage, um Animationen für Benutzer zu deaktivieren oder zu vereinfachen, die die Einstellung »Bewegung reduzieren« in ihrem Betriebssystem aktiviert haben. Wickeln Sie nicht wesentliche Animationen in @media (prefers-reduced-motion: no-preference) und bieten Sie sofortige Zustandsänderungen als Fallback für Benutzer, die reduzierte Bewegung bevorzugen.

Was ist will-change und wann sollte ich es verwenden?

will-change ist eine CSS-Eigenschaft, die dem Browser mitteilt, welche Eigenschaften sich in Zukunft ändern werden, und ihm ermöglicht, im Voraus zu optimieren. Verwenden Sie es sparsam und nur, wenn Sie Performance-Probleme beobachten. Wenden Sie es kurz vor Beginn der Animation an und entfernen Sie es nach Ende der Animation. Übermäßige Verwendung von will-change verschwendet GPU-Speicher und kann die Performance tatsächlich beeinträchtigen.

Wie debugge ich CSS-Animationen?

Chrome DevTools bietet leistungsstarke Tools zum Debuggen von Animationen. Öffnen Sie das Animationspanel (im Menü »Weitere Tools«), um alle aktiven Animationen anzuzeigen, die Zeitachse zu ziehen, Dauer und Verzögerung in Echtzeit zu ändern und Animationen auf 1/4 Geschwindigkeit zu verlangsamen. Sie können auch das Performance-Panel verwenden, um Animationsruckeln und Layout-Thrashing zu identifizieren.