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); }
}
fromist dasselbe wie0%undtodasselbe wie100%.- 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 ananimation-nameübergibst. Groß- und Kleinschreibung zählt, und er darf kein Schlüsselwort wienonesein.
Die animation-Eigenschaften
| Eigenschaft | Was sie festlegt | Standard |
|---|---|---|
animation-name | welche @keyframes laufen | none |
animation-duration | Länge eines Zyklus | 0s |
animation-timing-function | Geschwindigkeitskurve zwischen den Keyframes | ease |
animation-delay | Wartezeit vor dem ersten Zyklus (negativ startet mittendrin) | 0s |
animation-iteration-count | Anzahl der Zyklen oder infinite | 1 |
animation-direction | normal, reverse, alternate, alternate-reverse | normal |
animation-fill-mode | Styles davor und danach: none, forwards, backwards, both | none |
animation-play-state | running oder paused | running |
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. Mitnormalist das x = 200 und grün; mitreverseendet sie bei x = 0 und blau, weil der zuletzt gespielte Keyframefromwar.alternatemit einer Anzahl von 2 geht hin und zurück, also endet sogarforwardsbei 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:
- 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; }
}
- 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 Standarddauer0sist. - Ein Name, der nicht passt.
animation-namemuss genau dem Namen in@keyframesentsprechen, inklusive Groß- und Kleinschreibung. - Am Ende zurückspringen. Füge
forwards(oderboth) hinzu, um den letzten Keyframe zu behalten. - Flackern, bevor eine verzögerte Animation startet. Während
animation-delayzeigt das Element seine normalen Styles.backwards(oderboth) wendet während der Verzögerung den ersten Keyframe an. - Eine Animation neu starten, indem du denselben Wert setzt. Dasselbe
animationnoch einmal zu setzen, bewirkt nichts. Entferne es, erzwinge einen Reflow (el.offsetWidth) und setz es erneut, so wie es der Play-Button oben macht. displayanimieren. Es schaltet sofort um. Animiere stattdessenopacityundtransform.
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.