Zrozumienie funkcji łagodzenia dla animacji i przejść CSS

Opublikowany: 2022-03-10
Krótkie podsumowanie ↬ Funkcje wygładzania mogą zmienić wygląd animacji, wpływając na szybkość lub szybkość animacji. Jako istoty ludzkie jesteśmy przyzwyczajeni do naturalnego, nieliniowego ruchu. Korzystanie z tych niestandardowych funkcji łagodzenia w animacjach może prowadzić do lepszego wrażenia na użytkownikach i przyjemniejszego doświadczenia użytkownika. W tym artykule przyjrzymy się bliżej funkcjom wygładzania i zobaczymy, jak możemy ich użyć do stworzenia tych naturalnych i zachwycających animacji.

Czy zauważyłeś, jak płynne i zachwycające animacje wyglądają na dobrze wykonanym, profesjonalnym projekcie? Przypomina mi się strona In Pieces, na której animacje służą nie tylko do dekoracji, ale także w przekonujący sposób przekazują wiadomość o zagrożonym gatunku. Nie tylko piękny projekt i styl animacji, ale także ładnie i harmonijnie płyną. To właśnie ten przepływ w połączeniu z projektem i prezentacją sprawia, że ​​animacja wygląda oszałamiająco i naturalnie. To jest siła funkcji wygładzających, które są również nazywane funkcjami czasowymi.

Pisząc właściwości przejścia i animacji w CSS, zwykle korzystamy z predefiniowanych funkcji wygładzania, takich jak ease-out ponieważ jest to proste, wyglądają dobrze i działają dobrze w większości przypadków. Jednak posiadanie kilkunastu elementów na stronie z animacją, która ma ten sam czas trwania i wartości funkcji wygładzania, może sprawić, że interfejs użytkownika będzie nieco mdły i monotonny. Ludzie lepiej reagują na naturalny ruch, więc urozmaicenie i naturalność animacji i przejść zapewni lepsze wrażenia użytkownika.

Jeśli wrócimy do przykładu In Pieces i przyjrzymy się arkuszowi stylów, zauważymy, że różne niestandardowe funkcje ease-in cubic-bezier są używane w połączeniu z predefiniowanymi funkcjami linear i funkcjami synchronizacji czasu, aby osiągnąć ten piękny przepływ animacji. Animacje nie wyglądałyby tak dobrze, gdyby zamiast niestandardowych funkcji wygładzania były używane tylko predefiniowane funkcje wygładzania. Poniższy film przedstawia witrynę In Pieces ze wszystkimi funkcjami wygładzania ustawionymi na ease-out . Nawet jeśli w animacjach nie ma nic złego, zauważ, że nie są one tak oszałamiające ani ekscytujące, jak oryginalne animacje.

W tym artykule przyjrzymy się bliżej funkcjom wygładzania CSS, rodzajom funkcji wygładzania oraz sposobom tworzenia niestandardowych funkcji wygładzania przy użyciu krzywych Cubic Beziera.

Więcej po skoku! Kontynuuj czytanie poniżej ↓

Pod maską

Aby lepiej zrozumieć funkcje wygładzające, musimy cofnąć się o krok i przyjrzeć się podstawom animacji w CSS.

Animacja jest definiowana przez klatki kluczowe , które określają, jak element powinien wyglądać i być umiejscowiony w określonych punktach. Przejścia CSS wykorzystują dwie klatki kluczowe (wartość początkową i końcową), podczas gdy animacje CSS umożliwiają bardziej precyzyjną kontrolę dzięki regule @keyframes .

Przykład wyjścia animacji (klatek kluczowych) pola, które przesuwa się od 0px (0% wyjścia animacji) do 500px (100% wyjścia animacji) od lewej do prawej
Przykład wyjścia animacji (klatki kluczowe) pola, które przesuwa się od 0px (0% wyjścia animacji) do 500px (100% wyjścia animacji) od lewej do prawej. (duży podgląd)

Czas trwania animacji określa czas przejścia animacji od pierwszej klatki kluczowej do ostatniej. Poniższy wykres przedstawia związek między klatkami kluczowymi animacji a czasem trwania.

Przykład wyjścia animacji pudełka, które przesuwa się od 0px (0% wyjścia animacji) do 500px (100% wyjścia animacji) z czasem trwania 1000ms. Oba punkty są połączone linią prostą.
Przykład wyjścia animacji pudełka, które przesuwa się od 0px (0% wyjścia animacji) do 500px (100% wyjścia animacji) z czasem trwania 1000ms. Oba punkty są połączone linią prostą. (duży podgląd)

Animacja może przebiegać między dwiema klatkami kluczowymi na wiele sposobów. Na przykład animacja może mieć stałą prędkość lub może poruszać się szybko na początku i zwalniać pod koniec, lub poruszać się powoli na początku, a następnie przyspieszać, aż do końca itp. Ta prędkość lub prędkość jest definiowana za pomocą funkcje luzu (funkcje czasowe) . Jeśli spojrzymy na poprzedni wykres, funkcja wygładzania jest reprezentowana przez kształt linii łączącej dwa punkty. W poprzednim przykładzie użyliśmy funkcji liniowej (linia prosta), ale możemy również użyć krzywej, aby połączyć klatki kluczowe.

Przykład wyjścia animacji pola, które przesuwa się od 0 pikseli (pierwsza klatka kluczowa) do 500 pikseli (ostatnia klatka kluczowa) z czasem trwania 1000 ms. Animacja przyspiesza w początkowej klatce kluczowej i zwalnia w pobliżu ostatniej klatki kluczowej.
Przykład wyjścia animacji pola, które przesuwa się od 0 pikseli (pierwsza klatka kluczowa) do 500 pikseli (ostatnia klatka kluczowa) z czasem trwania 1000 ms. Animacja przyspiesza w początkowej klatce kluczowej i zwalnia w pobliżu ostatniej klatki kluczowej. (duży podgląd)

Jak widać, istnieje wiele możliwych opcji i odmian funkcji wygładzania animacji, a my przyjrzymy się im dalej.

Rodzaje funkcji łagodzenia

Istnieją trzy główne typy funkcji wygładzania, których można używać w CSS:

  • Funkcje liniowe ( linear ),
  • Funkcje Cubic Beziera (zawiera ease , ease-in , ease-out i ease-in-out ),
  • Funkcje schodów ( steps ).

Funkcje liniowe

Omówiliśmy funkcje liniowe w jednym z poprzednich przykładów, więc zróbmy szybkie podsumowanie. Dzięki funkcji liniowego pomiaru czasu animacja przechodzi przez klatki kluczowe ze stałą prędkością. Jak już zapewne wiesz, funkcję pomiaru czasu liniowego można łatwo ustawić w CSS za pomocą słowa kluczowego linear .

Przykład wyjścia animacji pudełka, które przesuwa się od 0px (0% wyjścia animacji) do 500px (100% wyjścia animacji) z czasem trwania 1000ms.
Przykład wyjścia animacji pudełka, które przesuwa się od 0px (0% wyjścia animacji) do 500px (100% wyjścia animacji) z czasem trwania 1000ms. (duży podgląd)
Przykład wyjścia animacji pola, które przesuwa się od 0 pikseli (pierwsza klatka kluczowa) do 200 pikseli (druga klatka kluczowa), a następnie do 500 pikseli (końcowa klatka kluczowa) z czasem trwania 1000 ms.
Przykład wyjścia animacji pola, które przesuwa się od 0 pikseli (pierwsza klatka kluczowa) do 200 pikseli (druga klatka kluczowa), a następnie do 500 pikseli (końcowa klatka kluczowa) z czasem trwania 1000 ms. (duży podgląd)

Zobacz pióro [Animacja - linearna](https://codepen.io/smashingmag/pen/Bapbgxg) Adriana Bece.

Zobacz animację pióra - linearną autorstwa Adriana Bece.

Funkcje sześciennych Beziera

Chociaż liniowe funkcje czasowe mają swoje przypadki użycia, mogą sprawić, że animacje będą wyglądać nijako i nienaturalnie, jeśli są używane niepoprawnie lub zbyt często. Jak widzieliśmy w przykładzie In Pieces, użytkownicy lepiej reagują na naturalny ruch , tj. nieliniowe funkcje czasowe, które mogą przyspieszać i zwalniać.

Krzywe Beziera są powszechnie używane w grafice wektorowej, animacjach i robotyce do łatwego tworzenia gładkich krzywych i trajektorii. W CSS używamy krzywych Beziera zdefiniowanych przez cztery punkty, które są znane jako krzywe Cubic Beziera .

Powszechnie używane, wstępnie zdefiniowane funkcje luzu, takie jak ease , ease-in , ease-out , luz i luz ease-in-out należą do funkcji Cubic Beziera. Mogą być używane jako szybki sposób na ustawienie nieliniowej funkcji luzowania. Nawet funkcję liniową można zdefiniować za pomocą funkcji cubic-bezier .

Funkcja łagodzenia Wartość cubic-bezier Prędkość początkowa Średnia prędkość Prędkość końcowa
linear cubic-bezier(0.0, 0.0, 1.0, 1.0) stały stały stały
ease cubic-bezier(0.25, 0.1, 0.25, 1.0) szybkie przyspieszenie szybkie przyspieszenie powolne przyspieszenie
ease-in cubic-bezier(0.42, 0, 1.0, 1.0) powolne przyspieszenie szybkie przyspieszenie pełna prędkość
ease-out cubic-bezier(0, 0, 0.58, 1.0) pełna prędkość powolne przyspieszenie powolne przyspieszenie
ease-in-out cubic-bezier(0.42, 0, 0.58, 1.0) powolne przyspieszenie pełna prędkość szybkie przyspieszenie

Mimo że wstępnie zdefiniowane wartości działają dobrze w wielu przypadkach, wiedza o tym, jak tworzyć niestandardowe funkcje Cubic Beziera, zapewnia jeszcze większą kontrolę nad wyglądem animacji, co może sprawić, że animacja będzie wyglądać jeszcze bardziej imponująco i wywierając wpływ.

W poniższym przykładzie zmodyfikowałem animacje dla przykładu In Pieces, aby użyć innej funkcji Cubic Beziera z różnymi wartościami. Dzięki tej funkcji wygładzania możesz zobaczyć, jak bardzo różni się animacja.

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

Rzućmy okiem na funkcję cubic-bezier , która jest używana do definiowania krzywych Cubic Beziera w CSS. Funkcja Beziera sześciennego jest zdefiniowana przez cztery punkty (pary współrzędnych x i y), ale w funkcji cubic-bezier definiujemy tylko 2 punkty. Dlaczego?

Przykład krzywej sześciennej Beziera dla animacji CSS.
Przykład krzywej sześciennej Beziera dla animacji CSS. (Źródło obrazu: MDN Web docs) (duży podgląd)

Dzieje się tak, ponieważ pierwszy (P0) i ostatni punkt (P3) są ustalone na początku (początkowy stan animacji) i na końcu (końcowy stan animacji) krzywej, ponieważ animacja musi kończyć się w określonej klatce kluczowej i w określonym Trwanie. Dzięki dwóm pozostałym punktom (P1 i P2) możemy dostroić krzywą i łagodzenie funkcji, co skutkuje nieliniową szybkością animacji.

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

Współrzędne X ( x1 i x2 ) reprezentują stosunek czasu i są ograniczone do wartości od 0 do 1 (animacja nie może rozpocząć się wcześniej ani trwać dłużej niż określono), podczas gdy współrzędne Y ( y1 i y2 ) reprezentują wyjście animacji i ich wartości, które są zwykle ustawia się gdzieś między 0 a 1, ale nie ogranicza się do tego zakresu. Możemy użyć wartości y1 i y2 , które są poza zakresem 0 i 1, aby stworzyć efekty odbijania.

animacja z efektami odbijania
(duży podgląd)

Jeśli animacja składa się z kilku klatek kluczowych, zdefiniowanych we właściwości CSS @keyframes , funkcja wygładzania zostanie zastosowana do każdej krzywej między dwoma punktami. Jeśli ease-out funkcję zwalniania do animacji z 3 klatkami kluczowymi, animacja przyspieszy na początku pierwszej klatki kluczowej i zwolni w pobliżu drugiej klatki kluczowej, a ten sam ruch zostanie powtórzony dla następnej pary klatek kluczowych (druga klatka kluczowa i ostatnią klatkę kluczową).

Zobacz pióro [Cubic-bezier obsługuje 2 klatki kluczowe](https://codepen.io/smashingmag/pen/zYNbVME) autorstwa Adriana Bece.

Zobacz funkcje Pen Cubic-bezier 2 klatki kluczowe autorstwa Adriana Bece.

Zwróć uwagę, jak funkcja wygładzania jest powtarzana między każdą parą klatek kluczowych — pierwszą i drugą klatką kluczową (pierwsza para) oraz drugą klatką kluczową i ostatnią klatką kluczową (druga para). Czas trwania animacji jest taki sam zarówno dla poprzedniego, jak i poniższych przykładów.

Zobacz pióro [Cubic Bezier obsługuje 3 klatki kluczowe](https://codepen.io/smashingmag/pen/KKaEjbM) autorstwa Adriana Bece.

Zobacz funkcje Pen Cubic Bezier 3 klatki kluczowe autorstwa Adriana Bece.

Tworzenie tych funkcji może być złożonym zadaniem, więc prawdopodobnie nie będziesz dostosowywać współrzędnych przez zgadywanie parametrów cubic-bezier . Będziesz musiał użyć narzędzia, które pomoże ci wybić te magiczne liczby, aby stworzyć funkcję pomiaru czasu, która idealnie pasuje do twojej animacji. Na szczęście istnieje wiele narzędzi przeglądarkowych i internetowych, które mogą nam w tym pomóc. Porozmawiamy o nich w jednej z poniższych sekcji tego artykułu.

Funkcje schodów

Funkcje klatek schodowych umożliwiają animację przeskakiwania między określoną liczbą klatek w sposób nieciągły. Możesz myśleć o tym jako o „tykającej” animacji.

Na przykład, jeśli przyjrzymy się jednemu z poprzednich przykładów, w którym pole przesuwa się z 0px do 500px i ograniczymy animacje do 5 kroków, animacja przeskoczy między następującymi 5 klatkami kluczowymi — 0px, 100px, 200px, 300px i 400px stanowiska.

Możemy to łatwo osiągnąć dzięki funkcji steps w CSS.

 steps(number_of_frames)
 steps(5)

Ta funkcja ma dodatkową opcję kontrolowania, które klatki kluczowe są uwzględniane. Jak widzieliśmy w poprzednim przykładzie, animacja pola przesuwającego się od 0 do 500 pikseli w 5 krokach kończy się w pozycji 400 pikseli. Jeśli chcemy, aby animacja zaczynała się od 100px i kończyła na pozycji 500px, możemy użyć opcji skoku jako drugiego argumentu. Termin skoku wpływa na sposób wybierania klatek kluczowych z osi czasu animacji.

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

Następujące opcje terminów skoku mogą być użyte w funkcji steps CSS:

  • jump-start
    Animacja przeskakuje w prawo od punktu początkowego, a punkt początkowy nie jest widoczny. W naszym przykładzie klatki kluczowe będą miały rozmiar 100px, 200px, 300px, 400px, 500px.
  • jump-end
    Ostatni skok ma miejsce, gdy animacja się kończy i jest niewidoczna. W naszym przykładzie klatki kluczowe będą miały wymiary 0px, 100px, 200px, 300px, 400px.
  • jump-both
    Zarówno pierwszy, jak i ostatni skok nastąpi odpowiednio na początku i końcu animacji, więc nie będą widoczne. Wszystkie 5 skoków nastąpi między punktem początkowym i końcowym. W naszym przykładzie te klatki kluczowe będą miały 80px, 165px, 250px, 335px, 420px.
  • jump-none
    Widoczny będzie zarówno pierwszy, jak i ostatni skok. W naszym przykładzie te klatki kluczowe to 0px, 125px, 250px, 375px, 500px.
Oś czasu animacji kroku (5) z czasem trwania 1000 ms
Oś czasu animacji step (5) z czasem trwania 1000 ms. (duży podgląd)

Poniższy przykład pokazuje, jak różne warunki skoku wpływają na zachowanie animacji. Różne terminy skoku są stosowane do animacji 5-etapowej o tym samym czasie trwania.

Zobacz pióro [funkcja Step](https://codepen.io/smashingmag/pen/ZELPdPK) ​​autorstwa Adriana Bece.

Zobacz funkcję Pen Step autorstwa Adriana Bece.

Debugowanie animacji i przydatnych narzędzi

Jak widzieliśmy na przykładzie Cubic Beziera, potrzebujemy jakiegoś narzędzia, które pomoże nam dostroić parametry krzywej Cubic Beziera, dzięki czemu możemy uzyskać pożądany wygląd animacji.

W tej sekcji przyjrzymy się narzędziom przeglądarki, witrynom i stylom CSS, które powinny nam w tym pomóc.

Narzędzia przeglądarki

Narzędzia programistyczne przeglądarki zapewniają przydatne funkcje ułatwiające edycję funkcji po wyjęciu z pudełka. Należy pamiętać, że do edycji dostępne są tylko funkcje Cubic Beziera. Narzędzia te oferują szybki i prosty podgląd animacji, dzięki czemu programista może uzyskać natychmiastową informację zwrotną i dostroić funkcję wygładzania.

Chrome, Safari, Firefox.
Chrome, Safari, Firefox. (duży podgląd)

Chrome, Safari i Firefox oferują również dedykowaną kartę Animacje w narzędziach programistycznych, która oferuje bardziej szczegółowy przegląd, w tym właściwości animacji, czas trwania, oś czasu, klatki kluczowe, opóźnienie itp.

Chrome, Safari, Firefox.
Chrome, Safari, Firefox. (duży podgląd)

Przydatne narzędzia i strony internetowe

Istnieje wiele przydatnych zasobów online i ustawień wygładzania, które mogą znacznie bardziej urozmaicić funkcje wygładzania.

Do bardziej popularnych zasobów internetowych należą: Ściągawka z funkcji Easing Functions autorstwa Andreya Sitnika i Ivana Soloveva oraz narzędzie CSS Easing Animation Tool autorstwa Matthew Leina. Narzędzia te oferują szeroką gamę ustawień wstępnych, których można użyć jako podstawy funkcji wygładzania, a następnie dostroić krzywą, aby dopasować ją do osi czasu animacji.

Ściągawka z funkcji łagodzenia zawiera 30 przydatnych wstępnych ustawień funkcji Cubic Bezier
Ściągawka z funkcji ułatwiających zawiera 30 przydatnych ustawień wstępnych funkcji. (duży podgląd)

Animacje i ułatwienia dostępu

Podczas ogólnej pracy z funkcjami upraszczania i animacjami należy uwzględnić wymagania dotyczące ułatwień dostępu. Niektórzy wolą przeglądać sieć ze zredukowanym ruchem, więc powinniśmy zapewnić odpowiednią rezerwę. Można to łatwo zrobić za pomocą szeroko obsługiwanych zapytań o media o ograniczonej częstotliwości poruszania się. To zapytanie o media pozwala nam albo usunąć animację, albo przypisać inną animację na podstawie preferencji użytkownika.

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

Zmodyfikowałem przykład zegara analogowego autorstwa Alvaro Montoro, aby zawierał alternatywną animację dla użytkowników z ustawioną flagą prefers-reduced-motion .

Zobacz pióro [CSS Analog Clock z preferowanymi zredukowanymi ruchami](https://codepen.io/smashingmag/pen/QWdoXPN) autorstwa Adriana Bece.

Zobacz zegar analogowy Pen CSS z preferencjami zredukowanego ruchu autorstwa Adriana Bece'a.

W domyślnej animacji wskazówka sekundowa zegara stale się porusza, co może powodować trudności dla niektórych użytkowników. Możemy łatwo uczynić animację bardziej dostępną, zmieniając funkcję czasu animacji na steps . W poniższym przykładzie użytkownicy z ustawioną flagą prefers-reduced-motion będą wyświetlali animację, w której ramię sekundowe tyka co pięć sekund.

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

Wniosek

Funkcje wygładzania lub funkcje czasowe zmieniają wygląd i działanie animacji, wpływając na szybkość animacji (szybkość). Funkcje łagodzenia pozwalają nam tworzyć animacje przypominające naturalny ruch, co może skutkować lepszym, przyjemniejszym UX i lepszym wrażeniem na użytkownikach. Widzieliśmy, jak możemy użyć wstępnie zdefiniowanych wartości, takich jak linear , ease-out , ease itp., aby szybko dodać funkcję czasu i jak tworzyć niestandardowe funkcje wygładzania z funkcją cubic-bezier , aby uzyskać bardziej imponujące i efektowne animacje. Omówiliśmy również funkcje schodów, które można wykorzystać do tworzenia animacji „tykania” i które są rzadko używane. Tworząc animacje, należy pamiętać o ułatwieniach dostępu i zapewnić alternatywne, mniej rozpraszające animacje z mniejszą ilością ruchu dla użytkowników z ustawioną flagą prefers-reduced-motion .

Istnieje wiele narzędzi przeglądarkowych i internetowych, które mogą uprościć i usprawnić tworzenie niestandardowych funkcji wygładzania, więc tworzenie animacji z pięknym przepływem jest łatwiejsze niż kiedykolwiek. Jeśli jeszcze tego nie zrobiłeś, polecam poeksperymentować z różnymi funkcjami wygładzania i stworzyć własną bibliotekę funkcji wygładzania.

Bibliografia

  • <easing-function> , MDN Web Docs
  • „Praca z animacjami” MDN Web Docs
  • „Animacje internetowe w Safari 13.1” Antoine Quint, WebKit
  • „Podstawy łagodzenia”, Paul Lewis, Web Fundamentals, Google Developers
  • „Sprawdź animacje”, Kayce Basques, Chrome DevTools, Chrome Developers