17.1. Wprowadzenie do Animacji CSS (@keyframes
)
@keyframes
)
Czym są Animacje CSS?
Animacje CSS pozwalają na tworzenie bardziej złożonych i kontrolowanych sekwencji zmian stylów niż przejścia (transitions). Podczas gdy przejścia animują zmianę właściwości między dwoma stanami (początkowym i końcowym), animacje pozwalają zdefiniować **wiele stanów pośrednich**, zwanych **klatkami kluczowymi (keyframes)**, przez które element ma przejść w trakcie animacji.
Animacje definiuje się za pomocą reguły @keyframes
oraz stosuje do elementów za pomocą właściwości z rodziny animation-*
.
Podstawowa koncepcja: @keyframes
i animation
Tworzenie animacji CSS składa się z dwóch głównych kroków:
- Definicja animacji (
@keyframes
): Tworzymy regułę@keyframes
, nadajemy jej unikalną nazwę i definiujemy w niej style dla poszczególnych klatek kluczowych (etapów) animacji. Klatki kluczowe określa się za pomocą procentów (od0%
do100%
) lub słów kluczowychfrom
(odpowiednik0%
) ito
(odpowiednik100%
). - Zastosowanie animacji (właściwości
animation-*
): Do elementu, który ma być animowany, dodajemy właściwości z rodzinyanimation
, aby powiązać go z definicją@keyframes
i określić parametry animacji, takie jak czas trwania, liczba powtórzeń, kierunek, opóźnienie itp.
Przykład prostej animacji zmiany koloru:
/* 1. Definicja animacji o nazwie 'zmianaKoloru' */
@keyframes zmianaKoloru {
from { /* Stan początkowy (0%) */
background-color: blue;
}
to { /* Stan końcowy (100%) */
background-color: red;
}
}
/* 2. Zastosowanie animacji do elementu */
.element {
width: 100px;
height: 100px;
/* Powiązanie z @keyframes 'zmianaKoloru' */
animation-name: zmianaKoloru;
/* Czas trwania jednego cyklu animacji */
animation-duration: 2s;
/* Można dodać inne właściwości animation-*, np. liczbę powtórzeń */
animation-iteration-count: infinite; /* Powtarzaj w nieskończoność */
animation-direction: alternate; /* Zmieniaj kierunek w każdym cyklu */
}
W tym przykładzie tło elementu .element
będzie płynnie zmieniać się z niebieskiego na czerwony przez 2 sekundy, a następnie z czerwonego na niebieski (dzięki alternate
) i tak w nieskończoność (dzięki infinite
).
Animacje vs. Przejścia (Transitions)
Chociaż oba mechanizmy służą do animowania zmian stylów, istnieją kluczowe różnice:
Cecha | Przejścia (Transitions) | Animacje (@keyframes) |
---|---|---|
Definicja | Właściwości transition-* na elemencie |
Reguła @keyframes + właściwości animation-* na elemencie |
Stany | Animują zmianę między dwoma stanami (początkowy i końcowy) | Mogą definiować wiele stanów pośrednich (klatek kluczowych) |
Wyzwalanie | Automatycznie przy zmianie wartości animowanej właściwości (np. przez :hover , JS) |
Automatycznie po zastosowaniu właściwości animation (mogą startować od razu po załadowaniu strony) |
Kontrola powtórzeń | Brak wbudowanej kontroli (animacja trwa tylko podczas zmiany stanu) | Możliwość ustawienia liczby powtórzeń (animation-iteration-count ), w tym nieskończonej |
Kontrola kierunku | Brak wbudowanej kontroli (zawsze od stanu A do B i z B do A) | Możliwość zmiany kierunku (animation-direction : normal, reverse, alternate, alternate-reverse) |
Stan wstrzymania | Brak wbudowanej kontroli | Możliwość wstrzymania i wznowienia animacji (animation-play-state ) |
Generalnie, **przejścia** są idealne do prostych animacji interakcji (np. efekty hover), podczas gdy **animacje** dają większą kontrolę i nadają się do tworzenia bardziej złożonych, powtarzalnych lub niezależnych od interakcji sekwencji.
FAQ - Najczęściej zadawane pytania
Czy nazwa @keyframes
musi być unikalna?
Tak, nazwa zdefiniowana w @keyframes nazwaAnimacji { ... }
służy jako identyfikator. Musi być unikalna w obrębie całego arkusza stylów lub importowanych arkuszy. Tej samej nazwy używa się potem we właściwości animation-name
.
Czy mogę używać from
/to
i procentów w tej samej regule @keyframes
?
Tak, można mieszać te zapisy. from
jest równoważne 0%
, a to
jest równoważne 100%
. Można zdefiniować np. 0%
, 50%
i to
w jednej regule.
Co jeśli nie zdefiniuję stylu dla 0%
(from
) lub 100%
(to
)?
Jeśli brakuje definicji dla 0%
lub 100%
, przeglądarka użyje obliczonych stylów elementu dla tych klatek. Animacja będzie przebiegać od/do normalnego stanu elementu.
Czy animacje CSS są wydajne?
Podobnie jak w przypadku przejść, animowanie właściwości transform
i opacity
jest zazwyczaj bardzo wydajne i często akcelerowane sprzętowo. Animowanie właściwości wpływających na layout (np. width
, height
, top
, left
) może być bardziej kosztowne dla przeglądarki.