Easing-Funktionen für CSS-Animationen und -Übergänge verstehen

Veröffentlicht: 2022-03-10
Kurze Zusammenfassung ↬ Beschleunigungsfunktionen können das Erscheinungsbild einer Animation verändern, indem sie die Rate oder Geschwindigkeit einer Animation beeinflussen. Als Menschen sind wir an eine natürliche, nichtlineare Bewegung gewöhnt. Die Verwendung dieser benutzerdefinierten Erleichterungsfunktionen in den Animationen kann zu einem verbesserten Eindruck bei den Benutzern und einem angenehmeren Benutzererlebnis führen. In diesem Artikel tauchen wir tief in die Easing-Funktionen ein und sehen, wie wir sie verwenden können, um diese natürlichen und beeindruckenden Animationen zu erstellen.

Ist Ihnen schon einmal aufgefallen, wie flüssig und reizvoll Animationen auf einem gut gemachten, professionellen Projekt aussehen? Ich erinnere mich an die In Pieces-Website, wo Animationen nicht nur zur Dekoration verwendet werden, sondern auch die Botschaft über die bedrohte Art auf wirkungsvolle Weise vermitteln. Das Animationsdesign und der Stil sind nicht nur schön, sondern sie fließen auch schön und harmonisch. Es ist genau dieser Fluss in Kombination mit dem Design und der Präsentation, der die Animation umwerfend und natürlich aussehen lässt. Das ist die Stärke von Easing-Funktionen, die auch als Timing-Funktionen bezeichnet werden.

Beim Schreiben von Übergangs- und Animationseigenschaften in CSS entscheiden wir uns normalerweise für die vordefinierten Easing-Funktionen wie ease-out weil es einfach ist, sie gut aussehen und in den meisten Fällen gut funktionieren. Wenn Sie jedoch ein Dutzend oder mehr Elemente auf einer Seite mit einer Animation haben, die die gleiche Dauer und die gleichen Werte für die Beschleunigungsfunktion aufweist, kann die Benutzeroberfläche ein wenig langweilig und monoton werden. Menschen reagieren besser auf natürliche Bewegungen, sodass eine abwechslungsreichere und natürlichere Animation und Übergänge zu einer besseren Benutzererfahrung führen.

Wenn wir zurück zum In Pieces-Beispiel gehen und das Stylesheet untersuchen, können wir feststellen, dass verschiedene benutzerdefinierte Easing-Funktionen mit cubic-bezier in Kombination mit den vordefinierten linear und ease-in Timing-Funktionen verwendet werden, um diesen schönen Animationsfluss zu erreichen. Animationen würden nicht so gut aussehen, wenn statt benutzerdefinierter Beschleunigungsfunktionen nur vordefinierte Beschleunigungsfunktionen verwendet würden. Das folgende Video zeigt die Website von In Pieces, wobei alle Easing-Funktionen auf Easing ease-out eingestellt sind. Auch wenn an den Animationen nichts auszusetzen ist, beachten Sie, dass sie weder so atemberaubend noch aufregend sind wie die Originalanimationen.

In diesem Artikel werden wir uns eingehend mit CSS-Easing-Funktionen, Arten von Easing-Funktionen und der Erstellung benutzerdefinierter Easing-Funktionen mit kubischen Bézier-Kurven befassen.

Mehr nach dem Sprung! Lesen Sie unten weiter ↓

Unter der Haube

Um die Beschleunigungsfunktionen besser zu verstehen, müssen wir einen Schritt zurücktreten und einen Blick auf die Animationsgrundlagen in CSS werfen.

Die Animation wird durch Keyframes definiert, die bestimmen, wie ein Element aussehen und an bestimmten Stellen positioniert werden soll. CSS-Übergänge verwenden zwei Keyframes (Start- und Endwert), während CSS-Animationen eine genauere Steuerung mit der @keyframes Regel ermöglichen.

Beispiel einer Animationsausgabe (Keyframes) einer Box, die sich von 0 Pixel (0 % Animationsausgabe) auf 500 Pixel (100 % Animationsausgabe) von links nach rechts bewegt
Beispiel einer Animationsausgabe (Keyframes) einer Box, die sich von 0 Pixel (0 % Animationsausgabe) auf 500 Pixel (100 % Animationsausgabe) von links nach rechts bewegt. (Große Vorschau)

Die Animationsdauer bestimmt die Zeitspanne, die die Animation vom ersten bis zum letzten Keyframe benötigt. Das folgende Diagramm zeigt die Verbindung zwischen den Keyframes der Animation und der Dauer.

Beispiel für die Animationsausgabe einer Box, die sich mit einer Dauer von 1000 ms von 0 Pixel (0 % Animationsausgabe) auf 500 Pixel (100 % Animationsausgabe) bewegt. Die beiden Punkte werden durch eine Gerade verbunden.
Beispiel für die Animationsausgabe einer Box, die sich mit einer Dauer von 1000 ms von 0 Pixel (0 % Animationsausgabe) auf 500 Pixel (100 % Animationsausgabe) bewegt. Die beiden Punkte werden durch eine Gerade verbunden. (Große Vorschau)

Es gibt viele Möglichkeiten, wie die Animation zwischen zwei Keyframes fortschreiten kann. Beispielsweise kann eine Animation eine konstante Geschwindigkeit haben oder sie kann sich am Anfang schnell bewegen und am Ende langsamer werden, oder sich am Anfang langsam bewegen und dann beschleunigen, bis sie das Ende erreicht, usw. Diese Rate oder Geschwindigkeit wird mit definiert die Easing-Funktionen (Timing-Funktionen) . Wenn wir uns das vorherige Diagramm ansehen, wird die Beschleunigungsfunktion durch die Form der Linie dargestellt, die die beiden Punkte verbindet. Wir haben für das vorherige Beispiel die lineare Funktion (gerade Linie) verwendet, aber wir können auch eine Kurve verwenden, um die Keyframes zu verbinden.

Beispiel für die Animationsausgabe einer Box, die sich mit einer Dauer von 1000 ms von 0 Pixel (erster Keyframe) auf 500 Pixel (letzter Keyframe) bewegt. Die Animation wird am Start-Keyframe beschleunigt und in der Nähe des letzten Keyframes verlangsamt.
Beispiel für die Animationsausgabe einer Box, die sich mit einer Dauer von 1000 ms von 0 Pixel (erster Keyframe) auf 500 Pixel (letzter Keyframe) bewegt. Die Animation wird am Start-Keyframe beschleunigt und in der Nähe des letzten Keyframes verlangsamt. (Große Vorschau)

Wie Sie sehen können, gibt es viele mögliche Optionen und Variationen für Animationsbeschleunigungsfunktionen, die wir uns als Nächstes ansehen werden.

Arten von Lockerungsfunktionen

Es gibt drei Haupttypen von Easing-Funktionen, die in CSS verwendet werden können:

  • Lineare Funktionen ( linear ),
  • Kubische Bezier-Funktionen (umfasst ease , ease-in , ease-out und ease-in-out ),
  • Treppenhausfunktionen ( steps ).

Lineare Funktionen

Wir haben lineare Funktionen in einem der vorherigen Beispiele behandelt, also fassen wir sie kurz zusammen. Mit der linearen Timing-Funktion durchläuft die Animation die Keyframes mit konstanter Geschwindigkeit. Wie Sie vielleicht bereits wissen, kann die lineare Timing-Funktion einfach in CSS mithilfe des Schlüsselworts linear festgelegt werden.

Beispiel für die Animationsausgabe einer Box, die sich mit einer Dauer von 1000 ms von 0 Pixel (0 % Animationsausgabe) auf 500 Pixel (100 % Animationsausgabe) bewegt.
Beispiel für die Animationsausgabe einer Box, die sich mit einer Dauer von 1000 ms von 0 Pixel (0 % Animationsausgabe) auf 500 Pixel (100 % Animationsausgabe) bewegt. (Große Vorschau)
Beispiel für die Animationsausgabe einer Box, die sich von 0 Pixel (erster Keyframe) auf 200 Pixel (zweiter Keyframe) und dann auf 500 Pixel (letzter Keyframe) mit einer Dauer von 1000 ms bewegt.
Beispiel für die Animationsausgabe einer Box, die sich von 0 Pixel (erster Keyframe) auf 200 Pixel (zweiter Keyframe) und dann auf 500 Pixel (letzter Keyframe) mit einer Dauer von 1000 ms bewegt. (Große Vorschau)

Siehe den Stift [Animation - linear](https://codepen.io/smashingmag/pen/Bapbgxg) von Adrian Bece.

Siehe die Stiftanimation - linear von Adrian Bece.

Kubische Bezier-Funktionen

Obwohl lineare Timing-Funktionen ihre Anwendungsfälle haben, können sie die Animationen langweilig und unnatürlich aussehen lassen, wenn sie falsch oder zu oft verwendet werden. Wie wir am Beispiel von In Pieces gesehen haben, reagieren Benutzer besser auf natürliche Bewegungen , dh nichtlineare Timing-Funktionen, die beschleunigen und verlangsamen können.

Bezier-Kurven werden häufig in Vektorgrafiken, Animationen und Robotik verwendet, um auf einfache Weise glatte Kurven und Trajektorien zu erstellen. In CSS verwenden wir Bezier-Kurven, die durch vier Punkte definiert sind, die als kubische Bezier- Kurven bekannt sind.

Häufig verwendete vordefinierte Easing-Funktionen wie ease , ease-in , ease-out und ease-in-out gehören zu den Cubic Bezier-Funktionen. Sie können als schnelle Methode zum Einstellen einer nichtlinearen Easing-Funktion verwendet werden. Sogar eine lineare Funktion kann mit einer cubic-bezier Funktion definiert werden.

Easing-Funktion cubic-bezier Wert Startgeschwindigkeit Mittlere Geschwindigkeit Endgeschwindigkeit
linear cubic-bezier(0.0, 0.0, 1.0, 1.0) Konstante Konstante Konstante
ease cubic-bezier(0.25, 0.1, 0.25, 1.0) schnelle Beschleunigung schnelle Beschleunigung langsame Beschleunigung
ease-in cubic-bezier(0.42, 0, 1.0, 1.0) langsame Beschleunigung schnelle Beschleunigung Vollgas
ease-out cubic-bezier(0, 0, 0.58, 1.0) Vollgas langsame Beschleunigung langsame Beschleunigung
ease-in-out cubic-bezier(0.42, 0, 0.58, 1.0) langsame Beschleunigung Vollgas schnelle Beschleunigung

Auch wenn vordefinierte Werte in vielen Fällen gut funktionieren, gibt Ihnen das Wissen, wie benutzerdefinierte Cubic Bezier-Funktionen erstellt werden, noch mehr Kontrolle über das Erscheinungsbild der Animation, wodurch die Animation noch beeindruckender und wirkungsvoller aussehen kann.

Im folgenden Beispiel habe ich die Animationen für das In Pieces-Beispiel bearbeitet, um eine andere kubische Bezier-Funktion mit anderen Werten zu verwenden. Mit dieser Easing-Funktion können Sie sehen, wie unterschiedlich die Animation aussieht und sich anfühlt.

 cubic-bezier(0, 1.2, 1, 0.2)

Werfen wir einen Blick auf die cubic-bezier Funktion, die verwendet wird, um kubische Bezier-Kurven in CSS zu definieren. Die kubische Bezier-Funktion wird durch vier Punkte (x- und y-Koordinatenpaare) definiert, aber wir definieren nur 2 Punkte in der cubic-bezier Funktion. Warum ist das so?

Beispiel einer kubischen Bezier-Kurve für CSS-Animationen.
Beispiel einer kubischen Bezier-Kurve für CSS-Animationen. (Bildquelle: MDN Web docs) (Große Vorschau)

Dies liegt daran, dass der erste (P0) und der letzte Punkt (P3) am Start (anfänglicher Animationszustand) und am Ende (endgültiger Animationszustand) der Kurve fixiert sind, da die Animation auf einem bestimmten Keyframe und innerhalb des angegebenen enden muss Dauer. Mit den beiden verbleibenden Punkten (P1 und P2) können wir die Kurve und die Beschleunigung der Funktion feinabstimmen, was zu einer nichtlinearen Animationsgeschwindigkeit führt.

 cubic-bezier(x1, y1, x2, y2)

Die X-Koordinaten ( x1 und x2 ) stellen das Zeitverhältnis dar und sind auf Werte zwischen 0 und 1 begrenzt (die Animation kann nicht früher beginnen oder länger als angegeben dauern), während die Y-Koordinaten ( y1 und y2 ) die Animationsausgabe und ihre Werte darstellen, die sind normalerweise irgendwo zwischen 0 und 1 eingestellt, sind aber nicht auf diesen Bereich beschränkt. Wir können die y1 und y2 Werte außerhalb des Bereichs 0 und 1 verwenden, um Prelleffekte zu erzeugen.

Animation mit Sprungeffekten
(Große Vorschau)

Wenn die Animation aus mehreren Keyframes besteht, die in der CSS-Eigenschaft @keyframes definiert sind, wird die Easing-Funktion auf jede Kurve zwischen den beiden Punkten angewendet. Wenn wir die Beschleunigungsfunktion auf eine Animation mit 3 Keyframes anwenden ease-out beschleunigt die Animation am Anfang des ersten Keyframes und verlangsamt sich in der Nähe des zweiten Keyframes, und die gleiche Bewegung wird für das nächste Keyframe-Paar wiederholt (zweiter Keyframe und das letzte Schlüsselbild).

Siehe Pen [Cubic-bezier functions 2 keyframes](https://codepen.io/smashingmag/pen/zYNbVME) von Adrian Bece.

Siehe Pen Cubic-Bezier-Funktionen 2 Keyframes von Adrian Bece.

Beachten Sie, wie die Easing-Funktion zwischen jedem Keyframe-Paar wiederholt wird – erster und zweiter Keyframe (erstes Paar) und zweiter Keyframe und letzter Keyframe (zweites Paar). Die Animationsdauer ist für das vorherige und das folgende Beispiel gleich.

Siehe Pen [Cubic Bezier functions 3 keyframes](https://codepen.io/smashingmag/pen/KKaEjbM) von Adrian Bece.

Siehe Pen Cubic Bezier-Funktionen 3 Keyframes von Adrian Bece.

Das Erstellen dieser Funktionen kann eine komplexe Aufgabe sein, daher werden Sie die Koordinaten wahrscheinlich nicht anpassen, indem Sie die cubic-bezier Parameter erraten. Sie müssen ein Tool verwenden, das Ihnen hilft, diese magischen Zahlen festzunageln, um eine Timing-Funktion zu erstellen, die perfekt zu Ihrer Animation passt. Glücklicherweise gibt es zahlreiche Browser- und Online-Tools, die uns dabei helfen. Wir werden in einem der folgenden Abschnitte in diesem Artikel darüber sprechen.

Treppenhausfunktionen

Treppenhausfunktionen ermöglichen es der Animation, zwischen einer bestimmten Anzahl von Frames auf nicht kontinuierliche Weise zu springen. Sie können es sich als „tickende“ Animation vorstellen.

Wenn wir uns zum Beispiel eines der vorherigen Beispiele ansehen, wo sich eine Box von 0px auf 500px bewegt und wir die Animationen auf 5 Schritte beschränken, springt die Animation zwischen den folgenden 5 Keyframes – 0px, 100px, 200px, 300px und 400px Positionen.

Wir können dies leicht mit der steps Funktion in CSS erreichen.

 steps(number_of_frames)
 steps(5)

Diese Funktion hat eine zusätzliche Option zum Steuern, welche Keyframes enthalten sind. Wie Sie im vorherigen Beispiel gesehen haben, endet die Animation einer Box, die sich in 5 Schritten von 0 Pixel auf 500 Pixel bewegt, an einer Position von 400 Pixel. Wenn wir möchten, dass die Animation bei 100 Pixel beginnt und an einer 500-Pixel-Position endet, können wir die Sprungbegriffsoption als zweites Argument verwenden. Der Sprungbegriff wirkt sich darauf aus, wie die Keyframes aus der Animationszeitachse ausgewählt werden.

 steps(number_of_frames, jump_term)
 steps(5, jump-start)

Die folgenden Sprungbegriffsoptionen können in der CSS- steps verwendet werden:

  • jump-start
    Die Animation springt direkt vom Startpunkt und der Startpunkt ist nicht sichtbar t. In unserem Beispielbeispiel sind Keyframes 100 px, 200 px, 300 px, 400 px, 500 px.
  • jump-end
    Der letzte Sprung erfolgt, wenn die Animation endet, und ist nicht sichtbar. In unserem Beispielbeispiel sind Keyframes 0px, 100px, 200px, 300px, 400px.
  • jump-both
    Sowohl der erste als auch der letzte Sprung erfolgen, wenn die Animation beginnt bzw. endet, sodass sie nicht sichtbar sind. Alle 5 Sprünge finden zwischen Start- und Endpunkt statt. In unserem Beispiel sind diese Keyframes 80 px, 165 px, 250 px, 335 px, 420 px groß.
  • jump-none
    Sowohl der erste als auch der letzte Sprung sind sichtbar. In unserem Beispiel sind diese Keyframes 0px, 125px, 250px, 375px, 500px.
Zeitleiste der Animation von Schritt (5) mit einer Dauer von 1000 ms
Zeitachse der Schritt(5)-Animation mit einer Dauer von 1000 ms. (Große Vorschau)

Das folgende Beispiel zeigt, wie sich verschiedene Sprungbegriffe auf das Animationsverhalten auswirken. Auf die 5-Schritt-Animation werden verschiedene Sprungterme mit gleicher Dauer angewendet.

Siehe Pen [Step function](https://codepen.io/smashingmag/pen/ZELPdPK) ​​von Adrian Bece.

Siehe die Pen Step-Funktion von Adrian Bece.

Debuggen von Animationen und nützlichen Tools

Wie wir aus dem Beispiel „Cubic Bezier“ gesehen haben, benötigen wir ein Werkzeug, das uns bei der Feinabstimmung der Parameter der Cubic Bezier-Kurve hilft, damit wir das gewünschte Erscheinungsbild der Animation erzielen können.

In diesem Abschnitt werfen wir einen Blick auf die Browser-Tools, Websites und CSS-Stile, die uns dabei helfen sollten.

Browser-Tools

Browser-Entwicklertools bieten nützliche Funktionen zum Bearbeiten von Beschleunigungsfunktionen, die sofort einsatzbereit sind. Bitte beachten Sie, dass nur kubische Bezier-Funktionen zur Bearbeitung zur Verfügung stehen. Diese Tools bieten eine schnelle und einfache Animationsvorschau, sodass der Entwickler sofortiges Feedback erhalten und die Easing-Funktion feinabstimmen kann.

Chrom, Safari, Firefox.
Chrom, Safari, Firefox. (Große Vorschau)

Chrome, Safari und Firefox bieten auch eine spezielle Registerkarte Animationen in den Entwicklertools, die eine detailliertere Übersicht bietet, einschließlich Animationseigenschaften, Dauer, Zeitleiste, Keyframes, Verzögerung usw.

Chrom, Safari, Firefox.
Chrom, Safari, Firefox. (Große Vorschau)

Nützliche Tools und Websites

Es gibt viele nützliche Online-Ressourcen und Easing-Voreinstellungen, die den Easing-Funktionen viel mehr Vielfalt verleihen können.

Weitere beliebte Online-Ressourcen sind Easing Functions Cheat Sheet von Andrey Sitnik und Ivan Solovev und CSS Easing Animation Tool von Matthew Lein. Diese Tools bieten eine große Auswahl an Voreinstellungen, die Sie als Grundlage für Ihre Easing-Funktion verwenden und dann die Kurve feinabstimmen können, damit sie zu Ihrer Animationszeitachse passt.

Der Spickzettel für Easing-Funktionen enthält 30 nützliche Voreinstellungen für kubische Bezier-Funktionen
Das Spickzettel zur Erleichterung der Funktionen enthält 30 nützliche Funktionsvoreinstellungen. (Große Vorschau)

Animationen & Barrierefreiheit

Bei der Arbeit mit Beschleunigungsfunktionen und Animationen im Allgemeinen ist es wichtig, Barrierefreiheitsanforderungen zu berücksichtigen. Einige Leute surfen lieber mit reduzierter Bewegung im Internet, daher sollten wir einen geeigneten Fallback bereitstellen. Dies kann leicht mit der weithin unterstützten Medienabfrage „Präferenzen mit reduzierter Bewegung“ erfolgen. Diese Medienabfrage ermöglicht es uns, die Animation entweder zu entfernen oder je nach Benutzerpräferenz eine andere Animation zuzuweisen.

 .animated-element { animation: /* Regular animation */; } @media (prefers-reduced-motion) { .animated-element { /* Accessible animation with reduced motion */ } }

Ich habe ein Beispiel für eine analoge Uhr von Alvaro Montoro so modifiziert, dass es alternative Animationen für Benutzer mit gesetztem Flag für prefers-reduced-motion enthält.

Siehe Pen [CSS Analog Clock with Preferreds Reduced Motion](https://codepen.io/smashingmag/pen/QWdoXPN) von Adrian Bece.

Sehen Sie sich die Pen CSS Analog Clock mit bevorzugten reduzierten Bewegungen von Adrian Bece an.

Bei einer Standardanimation bewegt sich der Sekundenzeiger der Uhr ständig, was einigen Benutzern Schwierigkeiten bereiten kann. Wir können die Animation leicht zugänglicher machen, indem wir die Animations-Timing-Funktion auf steps ändern. Im folgenden Beispiel wird Benutzern, bei denen das Flag „ prefers-reduced-motion “ gesetzt ist, eine Animation angezeigt, bei der der Sekundenarm alle fünf Sekunden tickt.

 @media (prefers-reduced-motion) { .arm.second { animation-timing-function: steps(12); } }

Fazit

Beschleunigungsfunktionen oder Timing-Funktionen ändern das Erscheinungsbild der Animation, indem sie die Animationsrate (Geschwindigkeit) beeinflussen. Easing-Funktionen ermöglichen es uns, Animationen zu erstellen, die natürlichen Bewegungen ähneln, was zu einer verbesserten, ansprechenderen UX und einem besseren Eindruck bei den Benutzern führen kann. Wir haben gesehen, wie wir vordefinierte Werte wie linear , ease-out , ease usw. verwenden können, um schnell eine Timing-Funktion hinzuzufügen, und wie Sie benutzerdefinierte Beschleunigungsfunktionen mit cubic-bezier Funktion für beeindruckendere und wirkungsvollere Animationen erstellen können. Wir haben auch Treppenfunktionen behandelt, die zum Erstellen von „tickenden“ Animationen verwendet werden können und selten verwendet werden. Beim Erstellen von Animationen ist es wichtig, die Zugänglichkeit im Auge zu behalten und Benutzern mit festgelegtem Flag „ prefers-reduced-motion “ eine alternative, weniger ablenkende Animation mit weniger Bewegung bereitzustellen.

Es gibt viele Browser- und Online-Tools, die das Erstellen benutzerdefinierter Beschleunigungsfunktionen vereinfachen und rationalisieren können, sodass das Erstellen von Animationen mit einem schönen Fluss einfacher denn je ist. Wenn Sie dies noch nicht getan haben, würde ich empfehlen, mit verschiedenen Beschleunigungsfunktionen zu experimentieren und Ihre eigene Beschleunigungsfunktionsbibliothek zu erstellen.

Verweise

  • <easing-function> , MDN Web Docs
  • „Mit Animationen arbeiten“, MDN Web Docs
  • „Webanimationen in Safari 13.1“, Antoine Quint, WebKit
  • „Die Grundlagen der Erleichterung“, Paul Lewis, Web Fundamentals, Google Developers
  • „Untersuchen Sie Animationen“, Kayce Basques, Chrome DevTools, Chrome Developers