Animacje kaskadowe dają ciekawy efekt, w którym wiele uporządkowanych elementów jest animowanych sekwencyjnie z niewielkim opóźnieniem między nimi, a nie wszystkie naraz. Ta technika jest często używana na listach, w galeriach lub menu nawigacyjnym, aby przyciągnąć wzrok użytkownika i nadać interakcjom dopracowany, rytmiczny charakter.
Kaskadowe animacje z sibling-index()
Użyj właściwości sibling-index() we właściwości animation-delay, aby animacja każdego elementu była przesunięta o liczbę proporcjonalną do jego pozycji w elemencie nadrzędnym. Funkcja sibling-index() zwraca liczbę całkowitą, więc należy ją pomnożyć przez jednostkę czasu, aby przekonwertować ją na czas.
#stagger-list > .item {
--stagger-time: 0.1s;
/* Define the animation first */
animation: fade-in 0.4s;
/* Set the `animation-delay` to a time multiplied by the `sibling-index()` */
animation-delay: calc(sibling-index() * var(--stagger-time))
}
OBOWIĄZKOWO: szanuj preferencje użytkowników, wyłączając animację dla użytkowników, którzy wolą ograniczyć ruch.
@media (prefers-reduced-motion: reduce){
/* Disable animation for users who prefer reduced motion. */
#stagger-list > .item {
animation: none;
}
}
Strategie zastępcze
Sprawdź obsługę sibling-index() za pomocą CSS z @supports (animation-delay: calc(sibling-index() * 0.1s)){} lub JavaScriptu z !CSS.supports('animation-delay: calc(sibling-index() * 0.1s)').
Aby obsługiwać animacje kaskadowe w starszych przeglądarkach, użyj JavaScriptu, aby dodać właściwość niestandardową --sibling-index do każdego elementu nadrzędnego. OBOWIĄZKOWO: umieść to w teście CSS.supports('animation-delay: calc(sibling-index() * 0.1s)'), aby uniknąć uruchamiania niepotrzebnego kodu JavaScript.
if(!CSS.supports('animation-delay: calc(sibling-index() * 0.1s)')){
const staggerList = document.getElementById('stagger-list');
[...staggerList.children].forEach((el, index)=>el.style.setProperty('--sibling-index', index + 1));
}
Dodaj deklarację animation-delay, która używa właściwości niestandardowej --sibling-index. Musi znajdować się przed deklaracją animation-delay, która używa funkcji sibling-index(). Nie trzeba tego umieszczać w @supports – starsze przeglądarki nie będą analizować drugiej deklaracji i użyją pierwszej.
#stagger-list > .item {
animation-delay: calc(var(--sibling-index) * var(--stagger-time));
animation-delay: calc(sibling-index() * var(--stagger-time));
}