Menu

CSS Transition: Eigenschaft, Dauer, Easing und Verzögerung

Eine CSS-Transition animiert eine Eigenschaft von ihrem alten zu ihrem neuen Wert, wenn sie sich ändert, zum Beispiel beim Hovern. Hier lernst du die Kurzschreibweise transition, jede Timing-Funktion nebeneinander, was sich animieren lässt und was nicht, den Workaround für height: auto und reduzierte Bewegung.

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

Eine Transition in einem Beispiel

Eine Transition sagt dem Browser: Wenn sich diese Eigenschaft ändert, animiere sie über diese Zeitspanne, statt sofort umzuschalten. Setz sie in die normale Regel des Elements, nicht nur in :hover:

Fahr über den ersten Button: Seine Farbe geht in Grün über, und er steigt in 0,4 Sekunden um 4px, und wenn du den Zeiger wegbewegst, läuft dieselbe Transition zurück. Der zweite Button hat transition: none und schaltet sofort um. Tastaturnutzer bekommen denselben Effekt über :focus-visible.

Die Kurzschreibweise transition

transition: background-color 0.3s ease-in-out 0.1s;
/*          property         duration timing    delay */
EinzeleigenschaftWas sie festlegtStandard
transition-propertywelche Eigenschaften animiert werden (all oder eine Liste)all
transition-durationwie lange, in s oder ms0s
transition-timing-functiondie Geschwindigkeitskurveease
transition-delayWartezeit vor dem Start (darf negativ sein)0s

Der Standard für die Dauer ist 0s, und deshalb wird nichts animiert, bis du eine setzt. In der Kurzschreibweise ist die erste Zeit immer die Dauer und die zweite die Verzögerung. Für unterschiedliche Einstellungen pro Eigenschaft trennst du sie durch Kommas:

.card {
  transition: transform 0.2s ease-out, box-shadow 0.4s ease-out;
}

Timing-Funktionen nebeneinander

Die Timing-Funktion entscheidet, wie sich die Geschwindigkeit während der Transition ändert. Drück auf Play, und alle sieben Balken legen dieselbe Strecke in denselben 1,5 Sekunden zurück:

Timing-FunktionFühlt sich an wie
linearkonstante Geschwindigkeit, mechanisch
ease (Standard)schneller Start, sanfter Halt
ease-inlangsamer Start, schnelles Ende: gut für Dinge, die verschwinden
ease-outschneller Start, langsames Ende: gut für Dinge, die erscheinen
ease-in-outlangsam an beiden Enden
cubic-bezier(x1, y1, x2, y2)deine eigene Kurve; ein y über 1 schießt über das Ziel hinaus und pendelt sich ein
steps(n)springt in n gleichen Schritten, ohne Zwischenbilder

Für Hover-Effekte und Menüs fühlt sich ease-out mit einer Dauer zwischen 150ms und 300ms reaktionsschnell an.

Was sich animieren lässt

Eigenschaften mit Zwischenwerten lassen sich animieren: Farben, Längen (width, padding, margin), opacity, transform, box-shadow, border-radius, filter, background-color. Eigenschaften, die zwischen Schlüsselwörtern springen, wie display oder font-family, schalten sofort um.

height: auto erwischt die meisten: Ein Panel, das sich von height: 0 zu height: auto öffnet, wird standardmäßig nicht animiert, weil der Browser die Werte zwischen 0 und „auto“ nicht berechnet. Ein zuverlässiger Workaround ist ein Grid-Wrapper, dessen einzige Zeile von 0fr zu 1fr geht:

aria-expanded sagt Screenreader-Nutzern, ob das Panel offen ist, was die Animation allein nicht tut.

Code ausführen, wenn eine Transition endet

Das Event transitionend feuert, wenn eine Transition fertig ist, einmal pro Eigenschaft. Nutze es, um nach der Bewegung etwas zu tun, etwa den Fokus zu verschieben oder ein Element zu entfernen:

Reduzierte Bewegung respektieren

Manche Menschen schalten in den Systemeinstellungen „Bewegung reduzieren“ ein, weil Bewegung auf dem Bildschirm ihnen schwindlig macht oder sie ablenkt. Behalte Farb- und Opacity-Übergänge und verzichte mit einer Media Query auf große Bewegungen:

@media (prefers-reduced-motion: reduce) {
  .btn { transition: background-color 0.2s ease; } /* no movement, only the color */
}

Transitions flüssig halten

transform und opacity sind die günstigsten Eigenschaften zum Animieren: Der Browser kann ein Element verschieben und ausblenden, ohne das Layout neu zu berechnen. Eine Transition auf width, height, top oder margin zwingt den Browser, die Seite in jedem Frame neu anzuordnen, was auf langsamen Handys ruckeln kann. Um etwas zu bewegen, nimm lieber transform: translate() als left oder margin. Die Seite zu transform behandelt die Funktionen.

Häufige Fehler

  • transition nur in der :hover-Regel. Der Effekt wird beim Hineinfahren animiert, springt beim Ende des Hovers aber zurück. Setz transition in die Basisregel.
  • Eine Dauer ohne Einheit. transition: opacity 300 ist ungültig. Schreib 300ms oder 0.3s.
  • transition: all. Es animiert jede Eigenschaft, die sich ändert, auch solche, die du gar nicht animieren wolltest, und kann Layoutänderungen träge machen. Liste die Eigenschaften auf.
  • Erwarten, dass display: none ausblendet. display schaltet sofort um. Blende stattdessen opacity aus (und setz visibility: hidden, wenn das Ausblenden endet).
  • Eine Transition zu height: auto. Sie springt. Nimm die Technik mit grid-template-rows von oben.
  • Lange Dauern bei kleinen Interaktionen. Alles über etwa 400ms an einem Button oder Menü fühlt sich langsam an.

Häufig gestellte Fragen

Wie funktionieren CSS-Transitions?

Du legst an einem Element fest, welche Eigenschaften wie lange animiert werden sollen, zum Beispiel transition: background-color 0.3s ease;. Ändert sich der Wert dieser Eigenschaft (über :hover, eine Klasse oder JavaScript), animiert der Browser vom alten zum neuen Wert, statt sofort umzuschalten.

In welcher Reihenfolge stehen die Werte in der Kurzschreibweise transition?

transition: property duration timing-function delay;, zum Beispiel transition: opacity 0.3s ease-in 0.1s;. Die einzige strikte Regel: Der erste Zeitwert ist die Dauer, der zweite die Verzögerung. Mehrere Transitions trennst du durch Kommas.

Warum funktioniert meine CSS-Transition nicht?

Häufige Ursachen: Die transition steht nur in der :hover-Regel (also wird sie beim Hineinfahren animiert und springt dann zurück), die Eigenschaft lässt sich nicht animieren (display oder height zu auto), die Dauer hat keine Einheit (0.3 statt 0.3s) oder der Wert ändert sich im selben Moment, in dem das Element zur Seite hinzugefügt wird.

Lässt sich height: auto per Transition animieren?

Nicht in jedem Browser mit einer einfachen height-Transition: Die Interpolation zu auto braucht die neuere Eigenschaft interpolate-size, die noch nicht überall unterstützt wird. Übliche Workarounds sind, grid-template-rows an einem Grid-Wrapper von 0fr zu 1fr zu animieren oder max-height auf einen Wert größer als der Inhalt.

Was ist der Unterschied zwischen transition und animation in CSS?

Eine Transition läuft einmal zwischen zwei Werten, wenn sich eine Eigenschaft ändert. Eine Animation nutzt @keyframes, kann viele Schritte haben, startet beim Laden der Seite von selbst und kann sich wiederholen oder endlos laufen.

Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S