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 verwenden | Animation verwenden |
|---|---|---|
| Hover-Effekt | Ja | Nein |
| Fokus-Zustand | Ja | Nein |
| Sichtbarkeit umschalten | Ja | Möglicherweise |
| Mehrstufige Sequenz | Nein | Ja |
| Schleifende Animation | Nein | Ja |
| Zustandsunabhängig | Nein | Ja |
| Eingangsanimation | Möglicherweise | Ja |
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:
- none (Standard): Das Element kehrt nach Ende der Animation zu seinen Stilen vor der Animation zurück.
- forwards: Das Element behält nach Ende der Animation die Stile des letzten Frames. Entscheidend für Eingangsanimationen, bei denen das Element an seiner endgültigen Position bleiben soll.
- backwards: Während der Animationsverzögerung (bevor die Animation beginnt) wendet das Element die Stile des ersten Frames an.
- both: Kombiniert das Verhalten von forwards und backwards. Das Element zeigt den ersten Frame während der Verzögerung und behält den letzten Frame nach Abschluss.
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
- linear: Konstante Geschwindigkeit während der gesamten Animation. Wirkt selten natürlich, da sich Objekte in der realen Welt nicht mit konstanter Geschwindigkeit bewegen. Geeignet für mechanische oder rotierende Animationen.
- ease (Standard): Beginnt langsam, beschleunigt in der Mitte, verlangsamt am Ende. Ein gutes Allzweck-Easing für die meisten UI-Übergänge.
- ease-in: Beginnt langsam und beschleunigt dann. Erzeugt ein Gefühl von »Schwung aufbauen«. Geeignet für Elemente, die den Bildschirm verlassen oder herunterfallen.
- ease-out: Beginnt schnell und verlangsamt dann. Erzeugt ein Gefühl von »zur Ruhe kommen«. Das am häufigsten verwendete Easing für UI-Elemente, die den Bildschirm betreten.
- ease-in-out: Langsamer Start und Ende, schneller in der Mitte. Ähnlich wie ease, aber mit ausgeprägterer Beschleunigung und Verzögerung. Geeignet für größere, dramatischere Übergänge.
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:
- Stil: Bestimmt, welche CSS-Regeln auf welche Elemente angewendet werden.
- 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.
- Paint: Füllt Pixel für jedes Element. Wird durch Änderungen an color, background, box-shadow, border-radius und anderen visuellen Eigenschaften ausgelöst.
- 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
| Eigenschaft | Löst Layout aus? | Löst Paint aus? | GPU-Compositing? |
|---|---|---|---|
| transform | Nein | Nein | Ja |
| opacity | Nein | Nein | Ja |
| filter | Nein | Ja | Manchmal |
| top / left | Ja | Ja | Nein |
| width / height | Ja | Ja | Nein |
| margin / padding | Ja | Ja | Nein |
| background-color | Nein | Ja | Nein |
| box-shadow | Nein | Ja | Nein |
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:
- Verwenden Sie transform: translateX(100px) anstelle von left: 100px
- Verwenden Sie transform: translateY(50px) anstelle von top: 50px
- Verwenden Sie transform: scale(1.5) anstelle von width: 150%; height: 150%
- Verwenden Sie transform: rotate(45deg) anstelle von Rotation über Layout
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:
- Entfernen: Dekorative Animationen, Parallax-Scrolling, Auto-Play-Karussells, Pulseffekte und schleifende Hintergrundanimationen.
- Vereinfachen: Übergangsdauern sollten auf nahezu augenblicklich (0,01 ms) verkürzt werden, anstatt vollständig entfernt zu werden, damit Zustandsänderungen noch wahrnehmbar sind.
- Beibehalten: Funktionale Zustandsübergänge (Hover, Fokus, Aktiv-Zustände), Fortschrittsindikatoren und alle Animationen, die wichtige Informationen vermitteln.
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
- Animate.css: Eine Sammlung vorgefertigter CSS-Animationsklassen. Fügen Sie einfach Klassennamen zu Elementen hinzu, um Animationen anzuwenden. Gut für schnelles Prototyping, kann aber zu generischen Bewegungen führen, wenn es übermäßig verwendet wird.
- Hamburgers: Eine Sammlung animierter Hamburger-Menü-Icon-Übergänge, alle in reinem CSS implementiert.
JavaScript-Animationsbibliotheken
- Framer Motion: Eine React-Animationsbibliothek mit deklarativer Animations-API, die Federphysik, Layout-Animationen und Gestenunterstützung bietet. Die beste Wahl für React-Anwendungen.
- GSAP (GreenSock): Die leistungsstärkste JavaScript-Animationsbibliothek. Bietet präzise Zeitachsensteuerung, komplexes Easing, SVG-Morphing und scrollgetriggerte Animationen. Wird von großen Marken für Marketing-Websites und interaktive Erlebnisse verwendet.
- Anime.js: Eine leichtgewichtige JavaScript-Animationsbibliothek mit einer sauberen API. Unterstützt CSS-Eigenschaften, SVG, DOM-Attribute und JavaScript-Objekte. Eine gute Mittelstufe zwischen CSS und GSAP.
- Motion One: Eine moderne, leichtgewichtige Animationsbibliothek, die auf der Web Animations API aufbaut. Bietet eine minimale API mit Unterstützung für Federphysik und Zeitachsen.
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:
- Zeitachsenansicht: Sehen Sie alle aktiven Animationen auf der Seite mit ihren Dauern, Verzögerungen und Keyframes.
- Wiedergabesteuerung: Verlangsamen Sie Animationen auf 1/4 Geschwindigkeit, pausieren Sie sie oder ziehen Sie Frame für Frame durch die Zeitachse.
- Eigenschaftsinspektion: Klicken Sie auf eine Animation in der Zeitachse, um genau zu sehen, welche CSS-Eigenschaften animiert werden und welche Werte sie bei jedem Keyframe haben.
- Live-Bearbeitung: Ändern Sie Animationsdauer, -verzögerung und -easing in Echtzeit, ohne die Seite neu laden zu müssen.
Performance-Analyse
Verwenden Sie das Performance-Panel in Chrome DevTools, um Animationsruckeln zu identifizieren:
- Zeichnen Sie einen Performance-Trace auf, während die Animation läuft
- Suchen Sie nach Frames, die das 16,67-ms-Budget überschreiten (als rote Balken im Frame-Diagramm dargestellt)
- Überprüfen Sie, ob Animations-Frames »Layout«-Operationen enthalten, die auf layoutauslösende Eigenschaften hinweisen
- Verwenden Sie den Tab »Rendering«, um »Paint flashing« (zeigt Neuzeichnungsbereiche in Grün) und »Layer borders« (zeigt Compositor-Ebenen) zu aktivieren
Häufige Debugging-Szenarien
- Animation läuft nicht: Überprüfen Sie, ob animation-fill-mode korrekt gesetzt ist. Ohne forwards oder both kehrt das Element in den Zustand vor der Animation zurück. Überprüfen Sie auch, ob das Element die richtigen Abmessungen hat – transform: scale(0) macht das Element unsichtbar, aber es existiert noch.
- Animation ruckelt: Öffnen Sie das Performance-Panel und suchen Sie nach langen Frames. Überprüfen Sie, ob Sie Eigenschaften animieren, die Layout auslösen. Wechseln Sie zu transform und opacity.
- Animationsverzögerung fühlt sich falsch an: Denken Sie daran, dass animation-delay eine Lücke vor dem Start der Animation erzeugt. Während dieser Lücke zeigt das Element den Zustand vor der Animation, es sei denn, animation-fill-mode: backwards oder both ist gesetzt.
- Animation funktioniert in Chrome, aber nicht in Safari: Safari analysiert die animation-Kurzschreibweise strenger. Stellen Sie sicher, dass alle Werte in der richtigen Reihenfolge sind und Sie keine nicht unterstützten Funktionen verwenden.
Arbeiten Sie mit CSS? Probieren Sie unsere kostenlosen CSS-Tools zum Formatieren, Minifizieren und Optimieren Ihrer Stylesheets für die Produktion aus.
CSS-FormatiererCSS-MinifiziererHä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.