Questa animazione sembra molto più complicata di quanto sia: una gallery CMS dove ogni immagine cresce dal centro dello schermo in sequenza a stagger, poi si disperde in una griglia pienamente responsive. L’intero scatter è guidato da una sola variabile animata più un po’ di matematica CSS custom — e una volta che vedi come si incastrano i pezzi, diventa un sistema flessibile e riutilizzabile.
La vera lezione qui è come variabili, CSS custom e GSAP smettano di essere strumenti separati e inizino a lavorare come uno solo. È anche un ottimo esempio di CSS che legge silenziosamente i tuoi dati CMS.
Come funziona
Il layout. Una grid CSS (pictures_list) con colonne esplicite e altezze di riga di 100% ÷ righe (es. 50% per due righe) — le percentuali esplicite la tengono stabile dove auto diventa imprevedibile. La spaziatura viene dal padding su ogni item, non dal grid gap: un gap aggiunto a righe che già sommano al 100% farebbe traboccare la grid. Ogni item della collezione porta data-animate-item e ogni immagine data-animate-image, ordinati per un campo intero CMS order.
Il CSS legge il CMS. Il nucleo ingegnoso è un embed dentro l’item della collezione, così ogni item renderizza la propria copia di un piccolo blocco CSS. Quel blocco usa nth-child (legato all’order del CMS) e la funzione sibling-index() così ogni item conosce la propria posizione, poi calcola le sue coordinate nella griglia (colonna/riga) e uno shift X / shift Y — quanto deve muoversi per stare al centro della griglia. Entrambi gli shift sono moltiplicati per una variabile move-factor, e un translate li applica. A move-factor: 1 tutto è tirato al centro; a 0, ogni shift è 0 e gli item riposano nelle loro celle reali.
Tre variabili descrivono il sistema. move-factor (il motore dell’animazione, parte da 1), columns e rows. Dato che la matematica di centratura è scritta in termini di columns e rows, è indipendente dalla griglia — cambia la griglia e aggiorni solo quei numeri.
L’interazione GSAP è due action. Al page load: una action animate che scala le immagini da 0 alla loro scala nel designer con uno stagger (offset time 0.2s) per il grow-in; poi una action animate variable che porta move-factor da 1 a 0 per lo scatter. Lo start dello scatter è pura aritmetica — deve iniziare esattamente quando l’ultima immagine finisce di scalare: (numeroItem − 1) × stagger + durata. Con 12 immagini: 11 × 0.2 + 0.8 = 3s. GSAP interpola la variabile in modo fluido e il CSS fa il resto.
La responsività è gratis. Breakpoint diversi vogliono spesso griglie diverse. Dato che columns e rows sono variabili, aggiungi variable modes (tablet, landscape, portrait) con valori diversi (es. tablet 4×3, portrait 3×4). La matematica di centratura li rilegge per breakpoint, così la stessa animazione funziona ovunque — nessuna ricostruzione per breakpoint.
Come si usa
-
CMS + grid. Una collezione
picturescon un campoimagee un campo interoorder(ordina la collection list per esso). Costruisci una grid con le tue colonne e imposta le altezze di riga a 100% ÷ righe in grid edit mode. Aggiungi padding apictures_itemper la spaziatura. Marca gli itemdata-animate-iteme le immaginidata-animate-image. -
Variabili. Crea variabili numeriche
move-factor(1),columnserowsimpostate sulla tua griglia. -
CSS di centratura. Aggiungi un embed dentro l’item della collezione con il CSS che colpisce
data-animate-itemvianth-child(order), calcolashift X/shift Ydasibling-index(),columnserows, li moltiplica entrambi permove-factore applica untranslate. (Incollalo dal cloneable — vedi la nota sotto.) -
Interazione. Interazione GSAP al page load. Action 1: animate
scalefrom 0 sudata-animate-image, 0.8s, power2-out, stagger offset-time 0.2s. Action 2: animate variablemove-factorto 0, 0.8s, power2-out, start =(count − 1) × 0.2 + 0.8. -
Responsive. Aggiungi variable modes per i breakpoint dove vuoi una griglia diversa, aggiornando
columns/rows(e la grid + altezze di riga) di conseguenza.
Il CSS custom di centratura (il blocco con
nth-child/sibling-index()) si incolla dal cloneable — prendilo lì e verifica che i nomi di variabili e attributi corrispondano al tuo progetto.