Über diese Website

Dieser Kasten steht auf jeder Seite in der linken Spalte. Was darin steht, änderst du in der Konfiguration unter Plugins — oder du schaltest ihn dort ab.

Über dieses Handbuch

Dieses Handbuch gehört zur Vorlage Example für QuartzControl. Es erklärt die Vorlage und führt zugleich alles vor, was sie kann.

Der Text hier kommt aus einer Markdown-Datei, nicht aus der Konfiguration.

CSS-Transitions und Keyframe-Animationen

CSS-Transitions und Keyframe-Animationen

Kurz erklärt

CSS hat zwei Mechanismen für Bewegung:

  • Transition: Eine Eigenschaft ändert sich, etwa durch :hover, eine Klasse oder ein Attribut, und der Browser lässt die Änderung über eine gewisse Zeit ablaufen. Die Zwischenwerte rechnet er selbst aus.1
  • Keyframe-Animation: Ein Ablauf mit Anfang, Ende und beliebig vielen Zwischenschritten. Man beschreibt ihn in @keyframes und hängt ihn mit animation an ein Element. Sie kann ohne Zustandswechsel starten, sich wiederholen und rückwärts laufen.2
/* Transition: reagiert auf eine Zustandsänderung */
.button {
  transition: background-color 200ms ease-out;
}
.button:hover {
  background-color: oklch(55% 0.15 250);
}
 
/* Keyframes: eigener Ablauf */
@keyframes pulse {
  50% { scale: 1.05; }
}
.badge {
  animation: pulse 1.5s ease-in-out infinite;
}

↗ Beispiel in neuem Tab öffnen

Hintergrund

Transitions heißen auch „implizite“ Übergänge, weil man nur Anfang und Ende festlegt.1 Bei Keyframes beschreibt man den Ablauf dagegen ausdrücklich.

MDN nennt drei Vorteile gegenüber Animationen per JavaScript: Es sind nur wenige Zeilen ohne Skript nötig, die Animation läuft auch unter Last stabil (der Browser kann Frames auslassen), und der Browser kann optimieren, etwa indem er unsichtbare Tabs seltener aktualisiert.2

Wichtige Aspekte

Transition oder Keyframes?

FrageTransitionKeyframes
Gibt es einen Auslöser (Zustand A → B)?ja, Voraussetzungnicht nötig
Mehr als zwei Stationen?neinja
Wiederholen, hin und her?neinanimation-iteration-count, animation-direction
Endzustand haltenergibt sich aus dem Zielzustandanimation-fill-mode: forwards

Die Tabelle fasst die beiden MDN-Leitfäden zusammen.

Teileigenschaften

  • Transition: transition-property, transition-duration, transition-timing-function, transition-delay. MDN empfiehlt die Kurzform transition, damit die Werte nicht durcheinandergeraten. Seit 2024 kommt transition-behavior dazu, siehe Ein- und Ausblenden mit CSS animieren.1
  • Animation: animation-name, -duration, -timing-function, -delay, -iteration-count, -direction, -fill-mode, -play-state, -timeline und animation-composition (das nicht in der Kurzform).2

Nicht alles ist animierbar

  • Manche Eigenschaften lassen sich gar nicht animieren.1
  • Von oder zu auto soll man laut Spezifikation nicht animieren, die Browser verhalten sich dabei unterschiedlich.1 Ausdrücklich erlaubt wird es mit interpolate-size, das derzeit aber nur Chromium kann.3
  • display und content-visibility lassen sich in Keyframes und mit transition-behavior: allow-discrete animieren, laut web-features 3.38.0 aber nicht in Firefox.

Günstig und teuer

Flüssig bleiben Animationen von transform und opacity. Eigenschaften, die Layout oder Paint auslösen (Breite, Höhe, Position über top/left, Schatten usw.), sollte man nur animieren, wenn es wirklich nicht anders geht.4

will-change legt ein Element vorab auf einen eigenen Layer. Das ist aber nur für Elemente gedacht, die sich gleich ändern werden, nicht für alles auf Verdacht.4

Einzelne Transform-Eigenschaften

translate, rotate und scale sind eigene Eigenschaften neben transform. MDN benutzt rotate im Transition-Beispiel direkt.1 Der Vorteil (eigene Einordnung): Eine Drehung beim Hover überschreibt nicht versehentlich eine Verschiebung, die an transform hängt.

Easing

  • Die Schlüsselwörter (ease, ease-in, ease-out, ease-in-out, linear) und cubic-bezier() beschreiben Kurven mit vier Punkten.1
  • linear() nimmt beliebig viele Stützpunkte und verbindet sie mit geraden Linien. Mit genug Punkten lassen sich so auch komplizierte Kurven nachbilden. Werte unter 0 und über 1 sind erlaubt.5
.pop {
  transition: scale 400ms linear(0, 1.2 60%, 0.95 80%, 1);
}

↗ Beispiel in neuem Tab öffnen

Das Beispiel (kurz über das Ziel hinaus, dann zurückfedern) habe ich selbst aus der Syntax gebaut. In Chrome 152 getestet: Bei scale von 1 auf 2 erreicht der Wert zwischendurch etwa 2,17 und pendelt sich dann bei 2 ein.

Custom Properties animieren

Eine normale Custom Property ist für den Browser nur Text, deshalb springt sie von einem Wert zum nächsten. Mit @property und einem Typ kann der Browser Zwischenwerte berechnen. Details und Beispiel in CSS Custom Properties.

Nebenwirkung von forwards

Mit animation-fill-mode: forwards verhalten sich die animierten Eigenschaften so, als stünden sie in will-change. Ein Stacking Context, der während der Animation entsteht, bleibt danach bestehen.2 Das erklärt so manche z-index-Überraschung nach einer Animation.

Beispiele

Karte beim Hover leicht anheben. Animiert werden nur translate und die opacity eines Pseudoelements, das den Schatten trägt. So muss der Schatten selbst nicht animiert werden:

.card {
  position: relative;
  transition: translate 200ms ease-out;
}
.card::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  box-shadow: 0 12px 24px rgb(0 0 0 / 20%);
  pointer-events: none;
  opacity: 0;
  transition: opacity 200ms ease-out;
}
.card:hover { translate: 0 -4px; }
.card:hover::after { opacity: 1; }

↗ Beispiel in neuem Tab öffnen

Das Muster „Schatten per opacity einblenden statt box-shadow animieren“ folgt der Regel von web.dev, wird dort aber nicht vorgeführt.

Endloser Lade-Spinner:

@keyframes spin {
  to { rotate: 1turn; }
}
.spinner {
  animation: spin 1s linear infinite;
}

↗ Beispiel in neuem Tab öffnen

Mit Rücksicht auf bewegungsempfindliche Menschen gehören beide Beispiele in @media (prefers-reduced-motion: no-preference), siehe Barrierearme Animationen. Endlos laufende Bewegung neben anderem Inhalt kann außerdem unter WCAG 2.2.2 fallen, sobald sie länger als fünf Sekunden läuft. Ob und wann Ladeanzeigen als „essenziell“ davon ausgenommen sind, habe ich nicht ausgewertet.

Eigene Notizen / Einordnung

Faustregel: Zustandswechsel → Transition, eigener Ablauf → Keyframes. Die meisten UI-Effekte sind Zustandswechsel.

Wer nur transform und opacity animiert und Bewegung an prefers-reduced-motion koppelt, hat die beiden häufigsten Probleme schon vermieden: Ruckeln und Unwohlsein.

Browsersupport

FeatureStand
Transitions, Keyframe-AnimationenBaseline widely available (seit 2015)
translate, rotate, scaleBaseline widely available (seit 2022-08-05 newly)
will-changeBaseline widely available
linear()Baseline widely available seit 2026-06-11 (newly seit 2023-12-11)
@propertyBaseline newly available seit 2024-07-09
display/content-visibility animierenlimited: Chrome 116/117, Safari 18, Firefox fehlt
interpolate-sizelimited: nur Chromium ab 129

Quelle: web-features 3.38.0 (Baseline-Daten der W3C WebDX Community Group), lokal abgefragt am 2026-09-12.

Siehe auch

Quellen

Eigene Einordnung: die Vergleichstabelle, der Vorteil der einzelnen Transform-Eigenschaften und alle Codebeispiele. Die Beispiele sind am 2026-09-13 in Chrome 152 (macOS) getestet (der Link in der Karte bleibt klickbar, der Spinner dreht sich, linear() schwingt über), nicht in Firefox und Safari.

Footnotes

  1. Using CSS transitions (MDN). ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7

  2. Using CSS animations (MDN), Einleitung und „Configuring an animation“. ↩ ↩2 ↩3 ↩4

  3. Animate to height auto (Chrome for Developers). ↩

  4. How to create high-performance CSS animations (web.dev). ↩ ↩2

  5. linear() CSS-Funktion (MDN). ↩

Weiterlesen

Diese Seite gehört zu gui-test — der Beispielvorlage für QuartzControl. Ein Überblick über alle Bereiche steht auf der Startseite.

Auf einem schmalen Bildschirm ist die Navigation oben eingeklappt.