Animation/Übergänge
Auf Webseiten können Besucher interaktive Elemente wie Links oder Checkboxen mit Maus „hovern“ oder mit der Tastatur fokussieren. Eine solche Benutzeraktion kann mit dynamischen Pseudoklassen wie hover, focus oder :checked selektiert und entsprechend gestaltet werden.
Während dies früher nach dem Motto „Ein/Aus“ umgeschaltet wurde, kann man mit transition weiche Übergänge erzeugen. Dabei werden Werte von CSS-Eigenschaften allmählich oder schrittweise geändert, indem die dazwischenliegenden Werte interpoliert werden.
Inhaltsverzeichnis
Allerdings sind nicht alle Eigenschaften animierbar. So kann man etwa nicht weich zwischen verschiedenen Schriftarten umschalten und auch die Animation von z-index wird kein Fading erzeugen.
→ CSS/Eigenschaften/animierbare Eigenschaften
Vorüberlegungen
Animationen auslösen
Wie oben erwähnt, werden transitions durch Benutzeraktionen ausgelöst, die mit CSS selektiert werden können:
- :hover (nicht auf Touchgeräten ohne Maus)
- :active, :focus
- Input-States (z. B. :checked)
- animation-timeline: scroll() - wenn Elemente durch Scrollen in den sichtbaren Bereich gelangen
Benutzeraktionen können auch mit JavaScript verarbeitet werden. Um die Aufmerksamkeit des Nutzers zu lenken, könnte man Klassen hinzufügen oder ändern:
Den Nutzer entscheiden lassen
Animationen können eine Seite beleben - sie können aber auch nerven. Dies kann bis hin zur körperlichen Übelkeit (Motion-triggered vestibular spectrum disorder) führen.[1][2] Deshalb lautet ein Grundsatz im Webdesign, dass Festlegungen im CSS die Wünsche der Nutzer berücksichtigen sollten.
Warum auch Transitions problematisch sein können
Für viele Nutzer sind nicht nur lange Animationen unangenehm, sondern auch:
- Zoom-, Slide- oder Parallax-Transitions
- große Bewegungen (translate) über den Bildschirm
- Easing-Effekte, die sich „schwammig“ anfühlen
- häufige Mikro-Transitions (z. B. Hover überall)
Menschen mit
- vestibulären Störungen,
- Migräne,
- Konzentrationsproblemen
können schon auf kurze Transitions reagieren.
nav a {
background-color: skyblue;
transition:
transform 0.5s,
background-color 1s;
}
nav a:hover,
nav a:focus {
background-color: gold;
transform: translate(5px, 5px);
}
@media (prefers-reduced-motion: reduce) {
nav a {
transition: background-color 0.01ms;
transform: none;
}
}
Das Merkmal prefers-reduced-motion (bevorzugt weniger Bewegung) erkennt, ob der Nutzer eine Seite mit allen Animationen und Bewegungen sehen oder ausdrücklich darauf verzichten möchte.[3]
Der Benutzer kann diese Präferenz über eine Einstellung im Betriebssystem oder im Browser angeben.
Anwendungsbeispiele
Und trotzdem helfen Animationen, Blick und Aufmerksamkeit zu steuern.
Ein Tooltip blendet weich ein, wenn zusätzliche Infos erscheinen.
Ein Menü fährt aus, damit klar ist, woher es kommt.
Weiche Übergänge verbessern Orientierung und Usability.
Ausgewählte Links sichtbar machen
Wenn der Nutzer Links entweder mit Maus oder Tastatur auswählt, soll dies sichtbar gemacht werden:
nav a {
background-color: skyblue;
transition:
transform 0.5s,
background-color 1s;
}
nav a:hover,
nav a:focus {
background-color: gold;
transform: translate(5px, 5px);
}
@media (prefers-reduced-motion: reduce) {
nav a {
transition: background-color 0.01ms;
transform: none;
}
}
Die Links der Navigation erhalten bei :hover und :focus sowohl eine Transformation als auch eine Änderung der Hintergrundfarbe.
Dies soll nicht abrupt umschalten, sondern in einem weichen Übergang verlaufen. Dazu erhält die transition eine durch Komma getrennte Liste der zu animierenden CSS-Eigenschaften (background-color und transform), sowie je eine Dauer (transition-duration) in Sekunden verwendet.
Wenn der Nutzer im Betriebssystem oder seinem Browser ausgewählt hat, weniger Animationen sehen zu wollen, wird die Transformation nicht ausgeführt, während die Farbänderung des Hintergrunds nicht mit einem weichen Übergang, sondern mit einer transition-duration von 0.01ms nahezu sofort ausgeführt wird.
Standardwert für transition-property ist all – empfehlenswert ist jedoch die zu animierenden Eigenschaften explizit zu nennen. So können unbeabsichtigte Animationen ausgeschlossen werden.
Siehe auch
Wie so etwas in einer „fertigen“ Webseite aussieht, kannst du bei unseren fertigen Layouts sehen.
transition-delay
Die Eigenschaft transition-delay legt fest, mit welcher Verzögerung der Übergang ausgelöst werden soll. Sie ist nützlich, wenn wir erst reagieren möchten, nachdem der Benutzer eine klare Absicht gezeigt hat, oder wenn wir die Aufmerksamkeit Schritt für Schritt lenken möchten, anstatt alles auf einmal zu ändern.
nav a {
transition:
background-color 1s,
translate 0.5s ease 0.25s;
}
nav a:hover,
nav a:focus {
background-color: gold;
translate: 5px 5px;
}
.galerie img {
filter: brightness(0.7);
scale: 1;
transition:
filter 0.5s,
scale 0.5s;
}
.galerie:hover img,
.galerie figure:focus img {
filter: brightness(1);
scale: 1.05;
}
.galerie figure:nth-child(1) img { transition-delay: 0; }
.galerie figure:nth-child(2) img { transition-delay: 0.5s; }
.galerie figure:nth-child(3) img { transition-delay: 1s; }
.galerie figure:nth-child(4) img { transition-delay: 1.5s; }
Die Links in der Navigation ändern ihre Hintergrundfarbe, sobald gehovert wird. Für die Verschiebung erhält die transition einen weiteren Parameter:
translate 0.5s ease 0.25s;
Der letzte Parameter legt fest, dass der Übergang erst verzögert starten soll. Beim schnellen Durchtabben wird die Verschiebung noch nicht ausgelöst, um visuelle „Sprünge“ zu vermeiden und die UI ruhig zu halten.
Die Bilder werden bei :hover vergrößert und aufgehellt - diese transition wird über den .galerie figure:nth-child(2)-Selektor in einem staggered reveal zeitverzögert ausgeführt.
Einfliegende Bildunterschriften mit transition-delay
Dieses Beispiel kann man weiter ausbauen. Hier isnd die figcaption ausführlicher:
figure h2 {
transform: translateY(-200px);
transition: all 0.3s ease-in-out;
}
figure:focus h2,
figure:hover h2 {
transform: translateY(0px);
transition-delay: 0.4s;
}
figure p {
transform: translateX(200px) rotate(90deg);
transition: all 0.4s ease-in-out;
}
figure:focus p,
figure:hover p {
transform: translateX(0px) rotate(0deg);
transition-delay: 0.2s;
}
figure a.info {
transform: translateY(-200px);
transition: all 0.2s ease-in-out;
}
figure:focus a.info,
figure:hover a.info {
transform: translateY(0px);
transition-delay: 0.3s;
}
Im Beispiel werden die Bildunterschriften bei :hover oder :focus mit unterschiedlichen Verzögerungen eingeblendet. Für die Einblendung werden die verschiedenen Funktionen von transform verwendet.
transition-timing-function
Die Eigenschaft transition-timing-function definiert die Geschwindigkeitskurve des Transitions-Übergangs.[4]
Mit den folgenden Schlüsselwörtern und CSS-Funktionen kann man transitions feintunen:
ease: Übergang mit langsamen Start, beschleunigt und endet langsam (Standardwert)
⇔ cubic-bezier(0.25,0.1,0.25,1)ease-in: Übergang mit einem langsamen Start
⇔ cubic-bezier(0.42,0,1,1)ease-out: Übergang mit einem langsamen Ende
⇔cubic-bezier(0,0,0.58,1)ease-in-out: Übergang mit einem langsamen Start und Ende
⇔ cubic-bezier(0.42,0,0.58,1)linear: Übergang mit gleicher Geschwindigkeit vom Start bis zum Stop
⇔ cubic-bezier(0,0,1,1)-
linear(): Die gleichnamige CSS-Funktion erlaubt 2 oder mehr durch Kommata getrennte Zahlen von 0 bis 1 oder Prozentangaben[5] cubic-bezier(n,n,n,n): Diese CSS-Funktion benötigt vier durch Kommata getrennte numerische Werte von 0 bis 1 oder Prozentangaben.
Sie erzeugen eine Bézier-Kurve.[6]-
steps(): Mit dieser CSS-Funktion wird der Unterschied der beiden Werte vom Browser in Einzelschritte unterteilt - der Übergang erfolgt stufenweise!
.linear .auto {
transition-timing-function: linear;
}
.ease-in .auto {
transition-timing-function: ease-in;
}
.ease-out .auto {
transition-timing-function: ease-out;
}
.ease-in-out .auto {
transition-timing-function: ease-in-out;
}
Im Beispiel sieht man, wie die Animation je nach gewählter transition-timing-function unterschiedlich beschleunigt. Allerdings kommen alle – da sie den gleichen Wert für transition-duration haben – gleichzeitig im Ziel an. Die Animation wird mit der Pseudoklasse :checked ausgelöst.
Rehe im Wald: scheinbare Animation einer Schlüsselwort-Eigenschaft
Transitionen sind grundsätzlich nur für numerische CSS-Eigenschaften möglich. Mit Schlüsselworteigenschaften geht das nicht, weil der Browser hier keine Zwischenwerte berechnen kann. Man kann eine solche Transition aber simulieren, indem beide gewünschten Darstellungen erzeugt, eine davon mit opacity:0 unsichtbar macht und dann die Opacity-Eigenschaft animiert, um zu überblenden.
Das folgende Beispiel zeigt eine Waldlandschaft mit zwei Rehen. Fährt die Maus über die Rehe (oder bringt man mit Tab den Fokus darauf), wird scheinbar der Überblendungsmodus (mix-blend-mode) animiert. In Wahrheit gibt es drei Bilder: einmal die Waldlandschaft, und dann zweimal das Rehe-Bild, absolut über dem Waldbild positioniert, aber mit verschiedenen Werten für den mix-blend-mode.
figure {
position:relative;
}
.rehe {
position:absolute;
top: 180px; left: 120px;
transition-duration: 1s;
transition-property: opacity;
}
.rehe.regular {
mix-blend-mode: saturation;
z-index: 2;
}
.rehe.hover {
opacity: 0;
mix-blend-mode: normal;
}
.rehe.regular:is(:hover,:focus) {
opacity: 0;
}
.rehe.regular:is(:hover,:focus) ~ .rehe {
opacity: 1;
}
<img src="landschaft.jpg" alt="lichter Wald mit Gras">
<img class="rehe regular" tabindex=0 src="https://wiki.selfhtml.org/images/5/53/Rehe.png" alt="zwei Rehe">
<a class="rehe hover" href="https://de.wikipedia.org/wiki/Reh">
<img src="https://wiki.selfhtml.org/images/5/53/Rehe.png" alt="">
</a>
Siehe auch
- 3D-Transforms

Flip-Cards mit
- perspective
- backface-visibility
- Memo-Quiz

- DOM-Manipulation
- Event-Delegation
Weblinks
- ↑ web.dev: prefers-reduced-motion: Sometimes less movement is more von Thomas Steiner, 10.12.2019
- ↑ Justus-Liebig-Universität: Das Vestibular-Syndrom
- ↑ css-tricks: An Introduction to the Reduced Motion Media Query
- ↑ An Interactive Guide to CSS Transitions October 28th, 2025. (joshcomeau.com)
Sehr ausführliches Tutorial, das bes. die timing-functions unter die Lupe nimmt. - ↑ MDN: linear()-Function
- ↑ MDN: cubic-bezier()