17.7. Właściwość animation-fill-mode
Do czego służy animation-fill-mode
?
Właściwość animation-fill-mode
określa, **jakie style są stosowane do elementu, gdy animacja nie jest aktywna**, czyli przed jej rozpoczęciem (podczas opóźnienia animation-delay
) oraz po jej zakończeniu (jeśli nie jest zapętlona).
Domyślnie element zachowuje swoje normalne style poza czasem trwania animacji. animation-fill-mode
pozwala to zmienić, np. utrzymać style z ostatniej klatki kluczowej po zakończeniu animacji.
Składnia i wartości
Właściwość animation-fill-mode
przyjmuje jedną lub więcej wartości, oddzielonych przecinkami, odpowiadających kolejnym animacjom zdefiniowanym w animation-name
.
animation-fill-mode: none | forwards | backwards | both [, ...];
none
(wartość domyślna): Animacja nie stosuje żadnych stylów do elementu, gdy nie jest aktywna. Element ma swoje normalne style przed startem i wraca do nich po zakończeniu.forwards
: Po zakończeniu ostatniego cyklu animacji element **zachowuje style zdefiniowane w ostatniej klatce kluczowej** (100%
lubto
, lub ostatniej klatce osiągniętej, jeśli animacja zakończyła się wcześniej). Kierunek (animation-direction
) wpływa na to, która klatka jest uznawana za ostatnią (np. przyreverse
będzie to0%
).backwards
: Podczas opóźnienia (animation-delay
) element **przyjmuje style zdefiniowane w pierwszej klatce kluczowej** (0%
lubfrom
, lub pierwszej relevantnej klatki w zależności odanimation-direction
). Po zakończeniu animacji element wraca do swoich normalnych stylów (chyba że użyto równieżforwards
).both
: Łączy efektyforwards
ibackwards
. Element przyjmuje style z pierwszej klatki podczas opóźnienia i zachowuje style z ostatniej klatki po zakończeniu animacji.
Wartość domyślna: none
.
Przykład:
@keyframes zmiana {
from { opacity: 0; background-color: blue; }
to { opacity: 1; background-color: red; }
}
.element {
opacity: 0.5; /* Normalny styl */
background-color: green; /* Normalny styl */
animation-name: zmiana;
animation-duration: 2s;
animation-delay: 1s;
}
.element-none { /* Domyślnie */
/* Przed 1s: opacity: 0.5, green */
/* Od 1s do 3s: animacja od blue do red */
/* Po 3s: opacity: 0.5, green */
animation-fill-mode: none;
}
.element-forwards {
/* Przed 1s: opacity: 0.5, green */
/* Od 1s do 3s: animacja od blue do red */
/* Po 3s: opacity: 1, red (styl z 'to') */
animation-fill-mode: forwards;
}
.element-backwards {
/* Przed 1s: opacity: 0, blue (styl z 'from') */
/* Od 1s do 3s: animacja od blue do red */
/* Po 3s: opacity: 0.5, green (wraca do normalnego) */
animation-fill-mode: backwards;
}
.element-both {
/* Przed 1s: opacity: 0, blue (styl z 'from') */
/* Od 1s do 3s: animacja od blue do red */
/* Po 3s: opacity: 1, red (styl z 'to') */
animation-fill-mode: both;
}
Jeśli lista trybów wypełnienia jest krótsza niż lista nazw animacji, wartości są powtarzane.
Praktyczne zastosowania
forwards
: Najczęściej używana wartość. Idealna, gdy chcemy, aby element pozostał w stanie końcowym po zakończeniu animacji (np. animacja pojawienia się elementu, który ma pozostać widoczny). Bezforwards
element "wróciłby" do stanu sprzed animacji.backwards
: Przydatne, gdy chcemy, aby element od razu przyjął stan początkowy animacji, nawet jeśli jest ona opóźniona. Zapobiega to "mignięciu" normalnego stylu elementu tuż przed startem opóźnionej animacji.both
: Łączy zalety obu powyższych, zapewniając płynny start (bez mignięcia) i utrzymanie stanu końcowego.none
: Używane, gdy animacja ma być tylko chwilowym efektem, a element ma zawsze wracać do swojego domyślnego stanu.
FAQ - Najczęściej zadawane pytania
Czy animation-fill-mode
działa z animacjami ustawionymi na infinite
?
animation-fill-mode
ma znaczenie głównie dla animacji, które się kończą (mają skończoną liczbę powtórzeń). Dla animacji infinite
, stan końcowy nigdy nie jest osiągany w sensie zatrzymania animacji, więc forwards
i both
nie mają widocznego efektu *po* animacji. Jednak backwards
i both
nadal będą stosować style z pierwszej klatki podczas opóźnienia.
Jak animation-direction
wpływa na animation-fill-mode
?
Kierunek animacji decyduje, która klatka jest uznawana za "pierwszą" i "ostatnią" dla backwards
i forwards
. Np. przy animation-direction: reverse;
, "pierwszą" klatką dla backwards
będzie 100%
(lub to
), a "ostatnią" dla forwards
będzie 0%
(lub from
).
Czy style z animation-fill-mode: forwards;
nadpisują inne style?
Tak, style zastosowane przez forwards
po zakończeniu animacji mają wyższy priorytet niż normalne style elementu. Aby je nadpisać, trzeba by np. usunąć animację lub zastosować nowe style z wyższą specyficznością lub !important
.
Czy backwards
działa, jeśli nie ma opóźnienia (animation-delay: 0s;
)?
Technicznie tak, ale efekt jest niezauważalny, ponieważ nie ma okresu opóźnienia, podczas którego style z pierwszej klatki mogłyby być widoczne przed startem animacji. backwards
jest najbardziej użyteczne przy niezerowym, dodatnim opóźnieniu.