Questa lezione conclusiva affronta un problema che non è ovvio finché non ci sbatti contro: staggerare le card riga per riga mentre entrano allo scroll, mantenendo lo stagger corretto quando la griglia si riflow tra i breakpoint. È un finale azzeccato per il corso, perché si appoggia a quasi tutto ciò che abbiamo costruito — un trigger di scroll, il pattern “GSAP fa il toggle di una classe, il CSS anima”, variabili e variable modes di Webflow — più una funzione CSS moderna che tiene insieme il tutto.
La parte elegante è quanto poco codice serva: una set action, una classe utility, un po’ di CSS e una sola variabile.
Come funziona
Perché lo stagger di GSAP non va bene. Ti aspetteresti una action animate con move-Y, opacity e stagger attivo. Ma non c’è un buon target. Punta la action sul trigger element e ogni card anima isolata — un singolo elemento non ha fratelli con cui staggerare. Puntala sull’attributo condiviso data-animate-item e, la prima volta che parte, GSAP staggera l’intera collezione in una volta, incluse le card molto sotto la piega. Nessuno produce uno stagger per riga legato a ciò che entra davvero nel viewport.
La strategia: classe + delay CSS. Quindi GSAP fa il minimo — una action set che aggiunge una classe in-view a ogni card mentre scorre dentro (interazione scroll, trigger actions, enter → play, soglia quando il top dell’item tocca ~90% dell’altezza del viewport). L’animazione vive nel CSS: lo stato iniziale della card è opacity: 0 e translateY(20%); la classe in-view è lo stato finale (opacity: 1, translateY(0)) più due transizioni (transform + opacity, 800ms, expo). Lo stagger è poi solo un transition-delay per card.
Delay responsive via sibling-index() + una variabile. Il delay deve dipendere dalla posizione di una card nella sua riga, e le righe cambiano dimensione tra i breakpoint. Salva il numero di colonne in una variabile Webflow (number-of-columns) con un variable mode per breakpoint (3 desktop / 3 tablet / 2 landscape / 1 portrait). In CSS custom, usa la moderna funzione sibling-index() insieme a quella variabile per calcolare l’indice di ogni card nella riga, poi convertilo in un transition-delay. Dato che la formula legge la variabile, la stessa regola ricalcola i delay corretti ogni volta che la griglia si riflow — pienamente responsive, senza ricostruire. Il CSS espone alcune manopole comode: animation-mode (0 = lineare, 1 = esponenziale, in mezzo = un mix), uno step/max-delay e un expo-base per la curva; la sezione “matematica” sotto può restare intatta. Ecco quel CSS — --_cards---number-of-columns è il nome generato da Webflow per la variabile number-of-columns, e il blocco di config in alto è l’unica parte che toccherai davvero:
<!-- Embed sulla pagina (o nell'head del sito) -->
<style>
[data-animate-item].in-view {
/* ==========================================
STAGGERED ANIMATION CONFIGURATION
========================================== */
/*
--animation-mode: Switches between linear and exponential pacing.
- Effect: Blends the linear progression with the exponential deceleration.
- Range: 0 to 1.
* 0 = Pure Linear (equal time gaps between every single card).
* 1 = Pure Exponential (gaps decrease over time; index 0 is always 0s).
* 0.5 = A smooth hybrid (soft dampening towards the end of the row).
*/
--animation-mode: 1;
/*
--step-or-max-delay: Dual-purpose time multiplier.
- Effect: Defines the overall pacing and speed of the stagger.
- Range: 0.05s to 0.5s for Linear step; 0.2s to 1.5s for Expo max ceiling.
* Linear mode: Acts as the fixed step between cards (e.g., 0.2s -> 0s, 0.2s, 0.4s...).
* Expo mode: Acts as the theoretical maximum delay ceiling for the last column.
*/
--step-or-max-delay: 0.5s;
/*
--expo-base: Controls the deceleration curvature (only active when --animation-mode is > 0).
- Effect: A lower value makes subsequent items animate much closer together (faster deceleration).
- Range: 0.1 to 0.9. (Recommended: 0.3 to 0.6).
* 0.1 = abrupt deceleration; the last items trigger almost instantly after the second.
* 0.9 = very subtle deceleration; behaves almost like a straight linear progression.
*/
--expo-base: 0.5;
/* ==========================================
MATHEMATICAL CALCULATION
========================================== */
/* 0-based column index per row */
--index: mod(sibling-index() - 1, var(--_cards---number-of-columns));
/* 1. Linear pacing component */
--linear-part: var(--index);
/* 2. Exponential pacing component */
--expo-part: calc(1 - pow(var(--expo-base), var(--index)));
/* 3. The Interpolation Formula (Linear Interpolation / Lerp) */
--final-curve: calc((var(--linear-part) * (1 - var(--animation-mode))) + (var(--expo-part) * var(--animation-mode)));
/* Final computed transition delay */
transition-delay: calc(var(--final-curve) * var(--step-or-max-delay));
}
</style>
Restare modificabili nel Designer. Dato che lo stato iniziale nasconde le card, sparirebbero mentre costruisci. Una regola di override le mostra ogni volta che la classe JS runtime di Webflow non è sull’elemento html — condizione vera solo dentro il Designer — così l’editing resta normale e l’animazione live non è toccata. (Come sempre, tieni la classe in-view registrata in uno style guide così Webflow non la elimina.)
Come si usa
-
Layout + trigger. Una griglia CMS (o statica) dove ogni item ha
data-animate-item. Sull’item card imposta lo stato iniziale:opacity: 0,translateY(20%). -
Interazione scroll. Target
data-animate-item, trigger actions,enter → play, soglia di start ~90% dell’altezza del viewport. Una action set che aggiunge la classein-viewal trigger element. -
Lo stato in-view. Definisci una classe
in-viewconopacity: 1, tutti i move transform a0e transizioni su transform + opacity (800ms, ease-out-expo). Registrala nello style guide. -
Variabile colonne responsive. Crea una variabile numerica
number-of-columnse un variable mode per breakpoint con i valori giusti (es. 3/3/2/1). -
Il motore dello stagger (CSS). Aggiungi un embed con il CSS che colpisce
[data-animate-item].in-view, calcola l’indice di riga di ogni card dasibling-index()enumber-of-columns, e imposta da esso untransition-delay. Regolaanimation-mode, lo step/max-delay eexpo-basea piacere. Aggiungi l’override di visibilità per il Designer. Pubblica e prova tra i breakpoint.
Il CSS qui sopra è il blocco esatto del cloneable — regola le tre variabili di config in alto (
--animation-mode,--step-or-max-delay,--expo-base) e lascia intatta la sezione matematica.