Animiere auf dem Compositor mit transform und opacity, strukturiere deine @keyframes und respektiere die Bewegungspräferenzen der Nutzenden.
Diese Lektion in Kodokon öffnenBevor du entscheidest, was du animierst, ruf dir die Rendering-Pipeline in Erinnerung: Layout (Geometrie), Paint (Pixel), Composite (Zusammensetzen der Ebenen auf der GPU). Das Animieren von width oder top löst bei jedem Frame ein Layout aus, oft gefolgt von einem Paint: das ist das Rezept für Ruckler unter 60 fps. transform und opacity werden direkt vom Compositor verarbeitet, ohne die ersten beiden Stufen erneut zu durchlaufen. Die professionelle Regel: Animiere nach Möglichkeit nur diese beiden Properties und simuliere den Rest (translate statt top, scale statt width).
.button {
transform: translateY(0);
transition:
transform 0.2s cubic-bezier(0.2, 0.8, 0.2, 1),
opacity 0.15s ease-out;
}
.button:hover {
transform: translateY(-2px);
}
.button:active {
transform: translateY(0) scale(0.97);
}Wenn ein Übergang nicht mehr ausreicht (Zwischenschritte, Schleifen, automatischer Start), wechsle zu @keyframes. Zwei Einstellungen machen den Unterschied zwischen einer sauberen Animation und einem visuellen Bug: animation-fill-mode steuert den Zustand vor dem Start (backwards wendet den ersten Keyframe während der Verzögerung an) und nach dem Ende (forwards friert den letzten ein); both kombiniert beides. Beachte außerdem, dass die Timing-Funktion zwischen jedem Keyframe-Paar gilt, nicht über die Gesamtdauer: Du kannst sie innerhalb eines Keyframes neu definieren.
@keyframes slide-in {
from {
transform: translateX(-100%);
opacity: 0;
}
70% {
transform: translateX(8px);
opacity: 1;
}
to {
transform: translateX(0);
}
}
.toast {
animation: slide-in 0.35s ease-out both;
}Zwei ergänzende Werkzeuge, die man kennen sollte. will-change: transform hebt das Element vor der Animation auf seine eigene Ebene, was ein spätes Rastern vermeidet; aber jede Ebene kostet GPU-Speicher, wende es also erst kurz vor der Animation an und entferne es danach, niemals als dauerhaften Stil auf Dutzenden von Elementen. steps(n) ersetzt die kontinuierliche Interpolation durch diskrete Sprünge: unverzichtbar für Sprites, Schreibmaschinen-Cursor oder Uhren.
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}transform: translateX(100px) gegenüber left: 100px bevorzugen?transform wird von älteren Browsern besser unterstützttransform wird vom Compositor verarbeitet, ohne bei jedem Frame das Layout neu zu berechnenleft funktioniert nur bei absolut positionierten Elementen, transform überalltransform akzeptiert im Gegensatz zu left negative Werteanimation-fill-mode: both?will-change?* anwenden, um die ganze Seite zu beschleunigentransform: translateZ(0) kombinierentransition für Mikrointeraktionen verwenden