Menu

CSS Animation: @keyframes, Eigenschaften und Beispiele

CSS-Animationen führen ein Element durch die Schritte, die du in @keyframes festlegst, von selbst und so oft du willst. Hier lernst du die @keyframes-Syntax, alle acht animation-Eigenschaften, fill-mode und direction, Ladeanzeigen, Pausieren und wie du reduzierte Bewegung respektierst.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

Eine CSS-Animation in einem Beispiel

Eine Animation hat zwei Teile: @keyframes, das die Schritte beschreibt, und die Eigenschaft animation, die sie mit einer Dauer auf ein Element anwendet. Diese Karte gleitet und blendet sich ein, wenn die Seite lädt:

Bearbeite den Code (oder ändere die Dauer in 2s), und die Vorschau lädt neu, sodass du der Karte noch einmal beim Hereinkommen zusehen kannst. Der Block @media (prefers-reduced-motion: reduce) ersetzt die Keyframes durch ein reines Einblenden, nur für Leser, deren System auf reduzierte Bewegung eingestellt ist.

@keyframes-Syntax

@keyframes pulse {
  0%   { transform: scale(1); }
  50%  { transform: scale(1.08); }
  100% { transform: scale(1); }
}
  • from ist dasselbe wie 0% und to dasselbe wie 100%.
  • Füge so viele Prozentschritte hinzu, wie du brauchst. Schritte mit denselben Styles können sich eine Zeile teilen: 0%, 100% { ... }.
  • Eine Eigenschaft, die im ersten oder letzten Keyframe fehlt, wird vom eigenen Wert des Elements aus oder zu ihm hin animiert.
  • Der Name (pulse) ist das, was du an animation-name übergibst. Groß- und Kleinschreibung zählt, und er darf kein Schlüsselwort wie none sein.

Die animation-Eigenschaften

EigenschaftWas sie festlegtStandard
animation-namewelche @keyframes laufennone
animation-durationLänge eines Zyklus0s
animation-timing-functionGeschwindigkeitskurve zwischen den Keyframesease
animation-delayWartezeit vor dem ersten Zyklus (negativ startet mittendrin)0s
animation-iteration-countAnzahl der Zyklen oder infinite1
animation-directionnormal, reverse, alternate, alternate-reversenormal
animation-fill-modeStyles davor und danach: none, forwards, backwards, bothnone
animation-play-staterunning oder pausedrunning

Die Kurzschreibweise nimmt sie in fast beliebiger Reihenfolge. Die einzige Regel: Der erste Zeitwert ist die Dauer und der zweite die Verzögerung:

.loader {
  animation: pulse 1.2s ease-in-out 0.2s infinite alternate both;
  /*         name  duration timing  delay count   direction fill */
}

direction und fill-mode live

Wähl eine Richtung, einen Fill-Modus und eine Anzahl und drück dann auf Play. Die Box bewegt sich 200px bis ans Ende der Bahn. Die Anzeige sagt, wo sie nach dem Ende der Animation stehen geblieben ist:

Worauf du achten solltest:

  • fill-mode: none (der Standard): Nach dem letzten Frame springt die Box auf x = 0 zurück und wird wieder bernsteinfarben.
  • forwards: Sie bleibt beim letzten Keyframe. Mit normal ist das x = 200 und grün; mit reverse endet sie bei x = 0 und blau, weil der zuletzt gespielte Keyframe from war.
  • alternate mit einer Anzahl von 2 geht hin und zurück, also endet sogar forwards bei x = 0.

Endlosschleifen: eine Ladeanzeige

infinite wiederholt für immer, und animation-delay an jedem Kind versetzt sie, sodass sie sich nacheinander bewegen. Halte Schleifen ruhig: langsam, klein, ohne Blinken.

role="status" mit einem aria-label sagt Screenreader-Nutzern, dass etwas lädt, was die Punkte allein nicht sagen. Für einen sich drehenden Kreis siehe die Seite zu rotate.

Animationen pausieren und steuern

animation-play-state: paused friert eine Animation an ihrer aktuellen Stelle ein, und running macht von dort weiter. Fahr über den Balken unten, um ihn anzuhalten:

Aus JavaScript liefert element.getAnimations() die laufenden CSS-Animationen, jede mit pause(), play(), cancel() und einer currentTime, die du lesen oder setzen kannst. Das Event animationend feuert, wenn eine nicht endlose Animation fertig ist, und animationiteration am Ende jedes Zyklus.

Reduzierte Bewegung respektieren und nie blinken

Zwei Regeln zur Barrierefreiheit gelten für jede Animation:

  1. Reduzierte Bewegung. Menschen können ihr System um weniger Bewegung bitten, weil ihnen Bewegung schlecht bekommt. Das sicherste Muster ist, Bewegung nur hinzuzufügen, wenn sie nicht um weniger gebeten haben:
@media (prefers-reduced-motion: no-preference) {
  .hero-title { animation: slide-in 0.8s ease-out both; }
}
  1. Kein Blinken. Inhalte, die mehr als dreimal pro Sekunde aufblitzen, können Anfälle auslösen. Vermeide schnelles, kontrastreiches Blinken ganz.

Animationen flüssig halten

Animiere transform und opacity, wann immer es geht. Der Browser kann sie anwenden, ohne die Seite neu anzuordnen, also bleiben sie auch auf langsamen Handys flüssig. Wer width, height, top, left oder margin animiert, lässt das Layout in jedem Frame neu berechnen. Um ein Element zu bewegen, nimm translate() von der Seite zu transform.

Häufige Fehler

  • Keine Dauer. animation: fade; bewirkt nichts, weil die Standarddauer 0s ist.
  • Ein Name, der nicht passt. animation-name muss genau dem Namen in @keyframes entsprechen, inklusive Groß- und Kleinschreibung.
  • Am Ende zurückspringen. Füge forwards (oder both) hinzu, um den letzten Keyframe zu behalten.
  • Flackern, bevor eine verzögerte Animation startet. Während animation-delay zeigt das Element seine normalen Styles. backwards (oder both) wendet während der Verzögerung den ersten Keyframe an.
  • Eine Animation neu starten, indem du denselben Wert setzt. Dasselbe animation noch einmal zu setzen, bewirkt nichts. Entferne es, erzwinge einen Reflow (el.offsetWidth) und setz es erneut, so wie es der Play-Button oben macht.
  • display animieren. Es schaltet sofort um. Animiere stattdessen opacity und transform.

Häufig gestellte Fragen

Wie erstellt man eine Animation in CSS?

Leg die Schritte mit @keyframes name { from { ... } to { ... } } fest und wende sie dann mit der Eigenschaft animation und einer Dauer auf ein Element an: animation: name 1s ease-out;. Die Dauer ist Pflicht, weil ihr Standardwert 0s ist.

Was macht animation-fill-mode: forwards?

Es behält die Styles des letzten Keyframes, nachdem die Animation endet. Ohne es springt das Element auf seine normalen Styles zurück. backwards wendet während der Verzögerung den ersten Keyframe an, und both macht beides.

Wie lasse ich eine CSS-Animation endlos laufen?

Setz animation-iteration-count: infinite oder ergänze infinite in der Kurzschreibweise: animation: spin 1s linear infinite;. Mit alternate läuft sie in jedem Zyklus erst vorwärts und dann rückwärts.

Was ist der Unterschied zwischen CSS-Animation und Transition?

Eine Transition animiert eine Eigenschaft zwischen zwei Werten, wenn sie sich ändert, meist beim Hovern oder bei einem Klassenwechsel. Eine Animation läuft von selbst, sobald sie angewendet wird, kann beliebig viele Keyframes haben und sich wiederholen, umkehren und pausieren.

Wie pausiere ich eine CSS-Animation?

Setz animation-play-state: paused am Element, zum Beispiel bei :hover oder über eine Klasse, die JavaScript hinzufügt. Setzt du es wieder auf running, läuft sie da weiter, wo sie angehalten hat.

Wie schalte ich Animationen für Nutzer ab, die reduzierte Bewegung bevorzugen?

Pack die Animation in @media (prefers-reduced-motion: no-preference) { ... } oder entferne sie in @media (prefers-reduced-motion: reduce) { ... }. Die Query folgt der Einstellung „Bewegung reduzieren“ im Betriebssystem des Nutzers.

Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S