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 */
| Einzeleigenschaft | Was sie festlegt | Standard |
|---|---|---|
transition-property | welche Eigenschaften animiert werden (all oder eine Liste) | all |
transition-duration | wie lange, in s oder ms | 0s |
transition-timing-function | die Geschwindigkeitskurve | ease |
transition-delay | Wartezeit 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-Funktion | Fühlt sich an wie |
|---|---|
linear | konstante Geschwindigkeit, mechanisch |
ease (Standard) | schneller Start, sanfter Halt |
ease-in | langsamer Start, schnelles Ende: gut für Dinge, die verschwinden |
ease-out | schneller Start, langsames Ende: gut für Dinge, die erscheinen |
ease-in-out | langsam 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
transitionnur in der:hover-Regel. Der Effekt wird beim Hineinfahren animiert, springt beim Ende des Hovers aber zurück. Setztransitionin die Basisregel.- Eine Dauer ohne Einheit.
transition: opacity 300ist ungültig. Schreib300msoder0.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: noneausblendet.displayschaltet sofort um. Blende stattdessenopacityaus (und setzvisibility: hidden, wenn das Ausblenden endet). - Eine Transition zu
height: auto. Sie springt. Nimm die Technik mitgrid-template-rowsvon 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.