*Funkcja easingu* w CSS określa, jak animacja przyspiesza i zwalnia w trakcie trwania. Słowa kluczowe ease, ease-in, ease-out i ease-in-out to skróty do czterech konkretnych krzywych. Do wszystkiego poza nimi CSS daje ci cubic-bezier(): funkcję, która przyjmuje cztery liczby i rysuje własną krzywą.
Te cztery liczby to współrzędne dwóch punktów kontrolnych (x1, y1, x2, y2). Trudno je pisać ręcznie, bo drobne zmiany dają duży efekt wizualny, a małe przestrzelenia tworzą ruch *z odbiciem*, którego nie widać w samych liczbach. Edytor wizualny pozwala przeciągać uchwyty i patrzeć, jak reaguje krzywa. To dużo szybsze niż poprawianie ułamków.
Edytor Coddy rysuje krzywą na bieżąco, animuje kulkę podglądu twoim easingiem i ma presety typowych wzorców: słowa kluczowe CSS, krzywą *standard* z Material Design, wyjście z odbiciem i *anticipate* z przestrzeleniem. Skopiuj gotowy ciąg cubic-bezier() i wklej go do CSS. Wszystko działa w twojej przeglądarce.
Co warto wiedzieć o easingu cubic-bezier
Krzywa pokazuje *postęp* w funkcji *czasu*. Czas biegnie od lewej do prawej (0 → 1), postęp od dołu do góry (0 → 1). Prosta przekątna to linear: równy postęp w każdej jednostce czasu.
Współrzędne X obu punktów kontrolnych są ograniczone do 0..1. Współrzędne Y mogą zejść poniżej 0 lub przekroczyć 1. Tak powstają easingi z odbiciem, antycypacją i przestrzeleniem (animacja na chwilę mija cel albo rusza w złą stronę).
Krzywe *ease-out* (większość postępu na początku) są responsywne i żwawe, dobre dla wejść i reakcji przycisków. Krzywe *ease-in* (postęp pod koniec) wydają się ociężałe: w UI zwykle się nie sprawdzają, przydają się przy wyjściach.
Zalecany w Material Design easing *standard* to cubic-bezier(0.4, 0, 0.2, 1): szybki start, wolny koniec. iOS używa czegoś zbliżonego do cubic-bezier(0.42, 0, 0.58, 1) (ease-in-out).
W krótkich animacjach (≤200ms) większość easingów wygląda podobnie, bo czas trwania liczy się bardziej niż krzywa. W dłuższych (300ms+) to easing decyduje, czy ruch wydaje się dopracowany, czy niechlujny.
Jak zaprojektować easing cubic-bezier
1
Zacznij od presetu
Kliknij preset najbliższy efektowi, który chcesz uzyskać. *Material standard* i *Bouncy out* to dobre punkty wyjścia dla ruchu w UI, a *ease-out* to bezpieczny wybór dla animacji wejścia.
2
Przeciągnij dwa uchwyty
Turkusowe uchwyty to dwa punkty kontrolne. Pierwszym ustawiasz, jak animacja *zaczyna się*, drugim, jak się *kończy*. Wyciągnięcie uchwytu ponad górną krawędź daje przestrzelenie.
3
Wybierz czas trwania i odtwórz
Ustaw realistyczny czas trwania swojej animacji. Przejścia w UI trwają zwykle 150-300ms, ruchy akcentujące 400-600ms. Kliknij *Odtwórz ponownie*, aby uruchomić podgląd z nowym czasem.
4
Dopracuj liczbami
Aby wpisać dokładne wartości, użyj pól X1/Y1/X2/Y2 pod krzywą. Y może zejść poniżej 0 lub przekroczyć 1, X zawsze mieści się w 0..1.
5
Skopiuj CSS
Kliknij *Kopiuj*, aby dostać całą regułę transition. Wklej ją do arkusza stylów i zamień transform na właściwość, którą animujesz.
Ściąga cubic-bezier
Popularne easingi i stojące za nimi wartości cubic-bezier. Wszystkie cztery słowa kluczowe poniżej to aliasy konkretnych krzywych cubic-bezier.
Easing
Wartości cubic-bezier
Kiedy używać
ease
(0.25, 0.1, 0.25, 1)
Domyślny dla transition: łagodny, ale bez charakteru
linear
(0, 0, 1, 1)
Stała prędkość: zwykle zła dla UI, dobra dla spinnerów
ease-in
(0.42, 0, 1, 1)
Wolny start, szybki koniec: najlepszy do wyjść
ease-out
(0, 0, 0.58, 1)
Szybki start, wolny koniec: najlepszy do wejść i reakcji
ease-in-out
(0.42, 0, 0.58, 1)
Symetryczny: najlepszy do przełączania tam i z powrotem
Wartość Y2 równa 1.28 sprawia, że krzywa mija cel, a potem wraca. Używaj z umiarem: ruch z odbiciem szybko męczy, jeśli wszystko porusza się w ten sposób.
Ujemne Y1 oznacza, że animacja na chwilę rusza w *przeciwną* stronę, zanim dotrze do celu. To zapożyczenie z klasycznej animacji: drobna antycypacja sprawia, że główny ruch wygląda na zamierzony.
Częste błędy z easingiem
Używanie ease-in w animacjach wejścia. Zaczyna wolno i kończy szybko, czyli odwrotnie niż ruch, który wydaje się responsywny. Użyj ease-out.
Wybieranie linear dla ruchu w UI, bo wydaje się neutralny. Ruch ze stałą prędkością wygląda mechanicznie: pasuje do pasków postępu i spinnerów, ale rzadko do czegokolwiek innego.
Przesadzanie z przestrzeleniem w każdym przejściu. Easingi z odbiciem to akcent, a nie domyślny wybór. Użyte wszędzie wyglądają jak chaos.
Poprawianie zbyt wolnego ruchu zmianą easingu zamiast czasu trwania. Jeśli ease-out przez 600ms wydaje się ociężały, najpierw spróbuj 300ms.
Zapominanie, że współrzędne X obu uchwytów są ograniczone do 0..1. Przeciąganie uchwytu poza lewą lub prawą krawędź nic nie daje: tylko Y może wyjść poza pole.
Cubic-bezier: FAQ
Co oznaczają cztery liczby w cubic-bezier()?
To współrzędne x i y dwóch punktów kontrolnych: cubic-bezier(x1, y1, x2, y2). Pierwszy punkt kształtuje *początek* animacji, drugi jej *koniec*. X zawsze mieści się między 0 a 1 (czas), a Y może wyjść poza 0..1, aby uzyskać przestrzelenie lub antycypację (postęp).
Jakiego easingu używać w animacjach UI?
Do wejść (coś się pojawia) i reakcji (najechanie na przycisk, fokus) użyj *ease-out* albo krzywej standard z Material Design cubic-bezier(0.4, 0, 0.2, 1). Do wyjść pasuje *ease-in*. Unikaj *linear*, chyba że animujesz postęp.
Czym różni się ease od ease-out?
Oba kończą się wolno, ale ease także łagodnie startuje. ease-out rusza z pełną prędkością i zwalnia. Właśnie ten *natychmiastowy* ruch sprawia, że wydaje się bardziej responsywny niż ease.
Jak zrobić animację z odbiciem w CSS?
Przeciągnij drugi uchwyt ponad górną krawędź pola (Y2 > 1). Na przykład cubic-bezier(0.18, 0.89, 0.32, 1.28) przestrzela o około 28%, zanim się ustabilizuje. Do wielokrotnych odbić potrzebujesz @keyframes albo biblioteki z fizyką sprężyn, bo cubic-bezier może przestrzelić tylko raz.
Czy mogę używać cubic-bezier w animacjach @keyframes?
Tak. Użyj go jako animation-timing-function, w skrócie animation albo dla pojedynczej klatki kluczowej. W złożonym, wieloetapowym ruchu możesz ustawić inny easing między każdą parą klatek kluczowych.