Menu

CSS transition: właściwość, czas, easing i opóźnienie

Przejście CSS animuje właściwość od starej wartości do nowej, gdy ta się zmienia, na przykład po najechaniu kursorem. Poznaj skrócony zapis transition, wszystkie funkcje czasu obok siebie, to, co można, a czego nie można animować, obejście dla height: auto i ograniczony ruch.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Przejście w jednym przykładzie

Przejście mówi przeglądarce: gdy ta właściwość się zmieni, animuj ją przez tyle czasu, zamiast przełączać od razu. Umieść je w zwykłej regule elementu, a nie tylko w :hover:

Najedź na pierwszy przycisk: jego kolor płynnie zmienia się na zielony i podnosi się on o 4px w ciągu 0.4 sekundy, a odsunięcie kursora odtwarza to samo przejście w drugą stronę. Drugi przycisk ma transition: none i przełącza się natychmiast. Osoby korzystające z klawiatury dostają ten sam efekt przez :focus-visible.

Skrócony zapis transition

transition: background-color 0.3s ease-in-out 0.1s;
/*          property         duration timing    delay */
Właściwość składowaCo ustawiaDomyślnie
transition-propertyktóre właściwości się animują (all albo lista)all
transition-durationjak długo, w s lub ms0s
transition-timing-functionkrzywa prędkościease
transition-delayczekanie przed startem (może być ujemne)0s

Domyślny czas trwania to 0s, dlatego nic się nie animuje, dopóki go nie ustawisz. W skrócie pierwsza wartość czasu to zawsze czas trwania, a druga to opóźnienie. Dla różnych ustawień każdej właściwości oddziel je przecinkami:

.card {
  transition: transform 0.2s ease-out, box-shadow 0.4s ease-out;
}

Funkcje czasu obok siebie

Funkcja czasu decyduje, jak zmienia się prędkość w trakcie przejścia. Naciśnij Play, a wszystkie siedem pasków przebędzie tę samą odległość w tych samych 1.5 sekundy:

Funkcja czasuOdczucie
linearstała prędkość, mechaniczna
ease (domyślna)szybki start, łagodne zatrzymanie
ease-inwolny start, szybki koniec: dobra dla elementów, które znikają
ease-outszybki start, wolny koniec: dobra dla elementów, które się pojawiają
ease-in-outwolno na obu końcach
cubic-bezier(x1, y1, x2, y2)własna krzywa; y powyżej 1 przestrzeliwuje i wraca
steps(n)skacze w n równych krokach, bez klatek pośrednich

Przy efektach hover i menu ease-out z czasem od 150ms do 300ms daje wrażenie szybkiej reakcji.

Co można animować przejściem

Przejściem można animować właściwości, które mają wartości pośrednie: kolory, długości (width, padding, margin), opacity, transform, box-shadow, border-radius, filter, background-color. Właściwości, które przeskakują między słowami kluczowymi, takie jak display czy font-family, przełączają się od razu.

height: auto to pułapka, na którą ludzie trafiają najczęściej: panel otwierany z height: 0 do height: auto domyślnie się nie animuje, bo przeglądarka nie oblicza wartości między 0 a "auto". Niezawodne obejście to opakowanie grid, którego jedyny wiersz zmienia się z 0fr na 1fr:

aria-expanded informuje osoby korzystające z czytników ekranu, czy panel jest otwarty, czego sama animacja nie robi.

Uruchamianie kodu po zakończeniu przejścia

Zdarzenie transitionend jest wywoływane po zakończeniu przejścia, raz dla każdej właściwości. Użyj go, żeby zrobić coś po ruchu, na przykład przenieść fokus albo usunąć element:

Szanuj ograniczony ruch

Niektórzy włączają w ustawieniach systemu "ogranicz ruch", bo ruch na ekranie przyprawia ich o zawroty głowy albo rozprasza. Zachowaj płynne zmiany koloru i przezroczystości, a duże ruchy wyłącz za pomocą media query:

@media (prefers-reduced-motion: reduce) {
  .btn { transition: background-color 0.2s ease; } /* no movement, only the color */
}

Zadbaj o płynność przejść

transform i opacity to najtańsze właściwości do animowania: przeglądarka może przesunąć i wygasić element bez przeliczania układu. Animowanie przejściem width, height, top lub margin zmusza przeglądarkę do ponownego układania strony w każdej klatce, co na wolnych telefonach może się zacinać. Żeby coś przesunąć, wybieraj transform: translate() zamiast left albo margin. Strona o transform omawia te funkcje.

Częste błędy

  • transition tylko w regule :hover. Efekt animuje się przy najechaniu, ale wraca skokowo, gdy hover się kończy. Umieść transition w regule bazowej.
  • Czas trwania bez jednostki. transition: opacity 300 jest nieprawidłowe. Napisz 300ms albo 0.3s.
  • transition: all. Animuje każdą zmieniającą się właściwość, także te, które miały zostać bez animacji, i może spowalniać zmiany układu. Wypisz właściwości.
  • Oczekiwanie, że display: none się wygasi. display przełącza się od razu. Zamiast tego wygaszaj opacity (i ustaw visibility: hidden po zakończeniu wygaszania).
  • Przejście do height: auto. Przeskakuje. Użyj techniki z grid-template-rows opisanej wyżej.
  • Długie czasy przy drobnych interakcjach. Wszystko powyżej około 400ms na przycisku czy menu wydaje się wolne.

Najczęściej zadawane pytania

Jak działają przejścia CSS?

Deklarujesz na elemencie, które właściwości mają się animować i jak długo, na przykład transition: background-color 0.3s ease;. Gdy wartość tej właściwości się zmienia (przez :hover, klasę albo JavaScript), przeglądarka animuje ją od starej wartości do nowej, zamiast przełączyć od razu.

W jakiej kolejności są wartości w skrócie transition?

transition: property duration timing-function delay;, na przykład transition: opacity 0.3s ease-in 0.1s;. Jedyna ścisła zasada: pierwsza wartość czasu to czas trwania, a druga to opóźnienie. Kilka przejść oddzielaj przecinkami.

Dlaczego moje przejście CSS nie działa?

Typowe przyczyny: transition jest tylko w regule :hover (więc animacja działa przy najechaniu i wraca skokowo), właściwości nie da się animować (display albo height do auto), czas trwania nie ma jednostki (0.3 zamiast 0.3s) albo wartość zmienia się w tej samej chwili, w której element jest dodawany do strony.

Czy można animować przejściem height: auto?

Nie zwykłym przejściem height w każdej przeglądarce: interpolacja do auto wymaga nowszej właściwości interpolate-size, która nie jest jeszcze wszędzie obsługiwana. Typowe obejścia to animowanie grid-template-rows od 0fr do 1fr na opakowaniu grid albo animowanie max-height do wartości większej niż treść.

Czym różni się transition od animation w CSS?

Przejście uruchamia się raz, między dwiema wartościami, gdy właściwość się zmienia. Animacja używa @keyframes, może mieć wiele kroków, startuje sama po załadowaniu strony i może się powtarzać lub zapętlać.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ