====== LU13c - CSS Keyframe-Animationen ======
{{ :de:modul:m291:learningunits:lu13:theorie:keyframe_animation.gif?nolink | Keyframe Animationen}}
Im Gegensatz zu Transitions laufen Keyframe-Animationen **eigenständig** – sie benötigen keinen Auslöser wie einen Klick oder Hover. Sie eignen sich für Ladeanimationen, Einblend-Effekte beim Seitenaufruf und dekorative Bewegungen.
Ein einzelnes Bild aus einer Animation heisst ein **Frame**. Dabei werden Schlüsselframes (Keyframes) vorgegeben – vor allem Start und Ende – und alle Frames dazwischen werden vom Browser automatisch berechnet.
===== Demo-Seite =====
[[https://css-transitions-animations.vercel.app|{{ :de:modul:m291:learningunits:lu13:theorie:screenshot_2026-05-31_at_23.39.20.png?nolink&800 | Link zur Demo-Seite für Animationen}}]]
[[https://css-transitions-animations.vercel.app|Demo-Seite mit Keyframe-Animationen]]
===== Teil 1: Die Animation definieren =====
Eine Keyframe-Animation besteht aus **zwei getrennten Teilen**: der Definition und der Zuweisung. Ohne Zuweisung an ein Element bewegt sich nichts.
==== @keyframes mit from / to ====
@keyframes einblenden {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
- ''@keyframes'' leitet die Animationsdefinition ein.
- Danach folgt ein frei wählbarer **Name** – er wird beim Zuweisen benötigt.
- ''from'' (= ''0%'') ist der erste Frame, ''to'' (= ''100%'') der letzte.
- Im Keyframe stehen CSS-Eigenschaften, deren Wert sich **interpolieren** lässt: Grösse, Position, Farbe, ''opacity'', ''transform'' und viele mehr. Eigenschaften wie ''background-image'' können nicht interpoliert werden – sie wechseln sofort.
==== @keyframes mit Prozent-Schritten ====
Für mehr als zwei Zwischenschritte können beliebig viele Prozent-Schritte angegeben werden:
@keyframes farbwechsel {
from { background-color: yellow; }
33% { background-color: red; }
66% { background-color: blue; }
to { background-color: yellow; }
}
===== Teil 2: Die Animation zuweisen =====
Die Animation wird einem Element über den ''animation''-Befehl zugewiesen:
.card {
animation-name: farbwechsel;
animation-duration: 0.6s;
animation-timing-function: ease;
animation-delay: 0s;
animation-iteration-count: 1;
animation-direction: normal;
animation-fill-mode: both;
}
^ Eigenschaft ^ Beispielwert ^ Bedeutung ^
| ''animation-name'' | ''farbwechsel'' | Name des ''@keyframes''-Blocks |
| ''animation-duration'' | ''0.6s'' | Dauer der Animation |
| ''animation-timing-function'' | ''ease'' | Beschleunigungskurve |
| ''animation-delay'' | ''0.2s'' | Verzögerung vor dem Start |
| ''animation-iteration-count'' | ''1'', ''3'', ''infinite'' | Wie oft die Animation wiederholt wird |
| ''animation-direction'' | ''normal'', ''alternate'', ''reverse'' | Richtung der Wiederholung – ''alternate'' geht hin und zurück |
| ''animation-fill-mode'' | ''both'' | Zustand vor / nach der Animation (→ siehe unten) |
| ''animation-play-state'' | ''running'', ''paused'' | Animation pausieren und fortsetzen |
==== Kurzschreibweise ====
Alle Eigenschaften lassen sich in einer einzigen Zeile zusammenfassen:
.card {
animation: farbwechsel 0.6s ease 0.2s 1 normal both;
/* Name Dauer Easing Delay Anzahl Richtung fill-mode */
}
**Reihenfolge bei zwei Zeitangaben:** Wenn Dauer und Delay beide angegeben werden, gilt: **Dauer kommt zuerst**, Delay an zweiter Stelle. ''animation: name 0.6s 0.2s'' → 0.6 s Dauer, 0.2 s Delay.
==== Zeitangaben ====
animation-duration: 1s; /* 1 Sekunde */
animation-duration: 300ms; /* 300 Millisekunden = 0.3 Sekunden */
===== animation-fill-mode =====
Ohne ''fill-mode'' springt ein Element nach der Animation sofort in seinen ursprünglichen Zustand zurück. Ausserdem ist es vor dem Start in seinem normalen Zustand sichtbar – auch wenn die Animation mit ''opacity: 0'' beginnen würde.
^ Wert ^ Bedeutung ^
| ''none'' | Standardverhalten: kein spezieller Zustand vor oder nach der Animation |
| ''forwards'' | Das Element bleibt nach dem Ende im ''to''-Zustand |
| ''backwards'' | Das Element startet im ''from''-Zustand (auch während eines Delays) |
| ''both'' | Kombination aus ''forwards'' und ''backwards'': empfohlener Wert für Einblend-Animationen |
@keyframes hereinschieben {
from { opacity: 0; transform: translateX(-30px); }
to { opacity: 1; transform: translateX(0); }
}
.element {
opacity: 0; /* Ohne fill-mode wäre das Element vor dem Start kurz sichtbar */
animation: slideIn 0.5s ease 0.3s both;
}
Mit ''fill-mode: both'' übernimmt das Element den ''from''-Zustand (''opacity: 0'') bereits während des Delays – kein Aufflackern.
===== Weiterführende Ressourcen =====
* 📺 [[https://www.youtube.com/watch?v=CAK5kTApkMU|Kevin Powell – Simplifying CSS animations]] (5 Min., Englisch)
* 📖 [[https://developer.mozilla.org/en-US/docs/Web/CSS/@keyframes|MDN – @keyframes]]
* 📖 [[https://developer.mozilla.org/en-US/docs/Web/CSS/animation|MDN – animation (Shorthand)]]
* 📖 [[https://www.joshwcomeau.com/animation/keyframe-animations/|Josh W. Comeau – Keyframe Animations]] (sehr empfehlenswert)