
Il rullo delle ore
Selettori, 3D, Fisica
NuovaGratis
Il Pay $120.00 di un negozio con i soldi veri nella pillola: nella punta di sinistra una mazzetta di sei banconote da 20 nella sua fascetta di carta, dentro un vassoio di feltro. Al clic la fascetta si strappa e le banconote si contano da una pila all'altra come fa un cassiere: ognuna si solleva dal bordo lontano, si gira curvandosi come carta vera, viene incontro all'occhio in prospettiva e ricade sulla pila contata mostrando il retro, sempre più in fretta, mentre accanto la cifra sale. Poi la pila si pareggia, arriva Paid con la spunta e una mazzetta nuova cade nel vassoio.
Una cartella che funziona da sola: index.html, style.css, script.js e le librerie da CDN. Nelle schede React e Vue la stessa demo è già un componente, che spegne le sue animazioni quando esce dalla pagina.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>The banknote button</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/mona-sans@5.3.0/wdth.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/fraunces@5.3.0/index.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="stage">
<!-- the banknote button: the Pay of a shop with the money itself in the pill. In the round left end a bundle of
notes sits in a felt counting tray, held by its paper band. A click snaps the band, and the notes are counted
from one pile to the other: each one peels up from its far edge, turns over on a curve of paper that bends with
the speed of the turn, and flops onto the counted pile, faster and faster, while the amount counts up beside
them. Then the pill says Paid, and a new bundle drops into the tray -->
<div class="notes" data-notes>
<button class="notes__btn" type="button" data-btn data-autoclic>
<span class="notes__fill" aria-hidden="true">
<svg class="notes__guilloche" data-guilloche preserveAspectRatio="none"></svg>
<span class="notes__sheen" data-sheen></span>
</span>
<span class="notes__tray" aria-hidden="true"></span>
<!-- the notes, the band and their shadows: drawn by script.js -->
<canvas class="notes__canvas" aria-hidden="true" data-canvas></canvas>
<span class="notes__faces" data-faces>
<span class="notes__face" data-face="rest">
<span class="notes__word" data-rest-text>Pay $120.00</span>
</span>
<span class="notes__face" data-face="busy" aria-hidden="true">
<span class="notes__quiet" data-busy-text>Counting</span>
<span class="notes__count" data-count>
<span class="notes__roll" data-roll>$0.00</span>
<span class="notes__roll" data-roll>$0.00</span>
</span>
</span>
<span class="notes__face" data-face="done" aria-hidden="true">
<svg class="notes__tick" viewBox="0 0 20 20" aria-hidden="true">
<path d="M4.2 10.6 8.2 14.4 15.8 5.8" data-tick />
</svg>
<span class="notes__paid" data-paid-text>Paid</span>
</span>
</span>
</button>
<p class="sr" aria-live="polite" data-live></p>
</div>
</main>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.15.0/dist/gsap.min.js"></script>
<script src="script.js"></script>
</body>
</html>Cambia valori, colori e testi con le manopole e guarda l’animazione rispondere dal vivo. Oppure scrivi tu nel codice. Poi scarica la cartella con le tue modifiche.
27 valori da cambiare
Col connettore di Animorio, Claude Code la prende da qui con tutta la sua guida e la adatta al tuo progetto. Incolla questa richiesta:
Prendi «Il pulsante delle banconote» da Animorio e adattala al mio sitoFronte e retro di una banconota si disegnano una sola volta in due canvas nascosti, quattro volte più grandi di come si vedono (216 per 104 pixel): la carta con un gradiente radiale, la cornice doppia, un'onda sinusoidale lungo i bordi, la rosetta (un'ipotrocoide, la stessa curva dei guilloche veri, tracciata per 7 giri a mezzo grado per passo), l'ovale della filigrana pieno di ellissi concentriche e il valore in Fraunces negli angoli. Quando Fraunces è arrivato (document.fonts.load) le banconote si incidono di nuovo. I colori vengono dalle variabili di :root, lette con getComputedStyle.
La banconota che si gira è una catena di 28 striscioline lungo la sua lunghezza. A ogni fotogramma la si stende partendo dalla cerniera fra le due pile: ogni strisciolina ha l'angolo θ(s) = π · p + k · s^1,5, dove p va da 0 (sulla pila di sinistra) a 1 (su quella di destra) e k è la piega, e la sua posizione è la somma delle precedenti. Il foglio non può passare sotto la pila su cui si posa: dove scenderebbe sotto, resta sopra, e così il bordo che arriva per ultimo si stende sulla pila invece di attraversarla.
La piega k segue una molla smorzata (ω = 2π · 4,2, ζ = 0,32) tirata verso un obiettivo che decide il giro stesso: CURL · 0,7 · sin(2πp) · la velocità del giro. Nella prima metà l'obiettivo è positivo e il bordo lontano va avanti, come quando il pollice solleva la banconota; nella seconda è negativo e il bordo resta indietro, trattenuto dall'aria. Quando il giro finisce l'obiettivo torna a zero, la molla passa oltre e il foglio sbatte sulla pila. Solo quando la molla si è fermata la banconota diventa una della pila.
Ogni punto si proietta con σ = F / (F − z): più è alto, più si allontana dal punto sotto l'occhio, messo a destra della cerniera e un poco in avanti, così una banconota in piedi mostra la faccia e non lo spigolo. Ogni strisciolina si disegna con drawImage dalla sua fetta della banconota, con un setTransform che porta il rettangolo della fetta sul trapezio proiettato, allargata di mezzo texel per non lasciare righe fra una e l'altra; le striscioline più alte si disegnano per ultime. La faccia visibile è quella la cui normale guarda verso l'occhio: il fronte, poi il retro. Poi la si scurisce o schiarisce secondo l'angolo con la luce, e sotto la banconota c'è un'ombra sfocata (un rettangolo disegnato lontano, di cui resta solo lo shadowBlur) che si allarga e si schiarisce mentre sale.
Una timeline GSAP stringe la fascetta, la strappa in due metà che saltano via, poi lancia le banconote: ogni intervallo è l'86% del precedente (fino a metà di PACE) e ogni giro il 93% del precedente, quindi il conteggio accelera. Ogni banconota che atterra fa salire la cifra, due righe che si danno il cambio in una finestrella con overflow: hidden. Le banconote si portano dietro il piccolo spostamento e l'inclinazione che avevano sulla pila e passano a quelli che avranno sull'altra, così non saltano né partendo né atterrando. Il pulsante è un button vero con aria-disabled durante il conteggio e una zona aria-live che dice Counting $120.00…, poi Paid, $120.00. e Ready to pay. Il ciclo di disegno sta in gsap.ticker e dorme quando niente si muove.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
LABEL | script.js | Pay | La scritta a riposo, prima della cifra. |
NOTE | script.js | 20 | Il valore di una banconota: è stampato sulle banconote, negli angoli del fronte e in grande sul retro. |
NOTES | script.js | 6 | Quante banconote ci sono nella mazzetta, da 2 a 12: la cifra da pagare è NOTE per NOTES. |
CURRENCY | script.js | $ | Il segno davanti alle cifre. |
BUSY | script.js | Counting | La parola mentre le banconote si contano; la dice anche la zona aria-live. |
PAID | script.js | Paid | La parola accanto alla spunta quando sono contate tutte. |
FLIP | script.js | 0.5 | I secondi che ci mette la prima banconota a girarsi; le altre vanno un po' più in fretta. |
PACE | script.js | 0.26 | I secondi fra la prima banconota e la seconda: poi il conteggio accelera, fino a metà di questo intervallo. |
CURL | script.js | 1 | Quanto si piega una banconota mentre si gira: 0 è un cartoncino rigido, 1,6 una banconota vecchia e morbida che sbatte sulla pila. |
HOLD | script.js | 1.6 | I secondi in cui resta Paid prima che una mazzetta nuova cada nel vassoio. |
Per il pulsante che chiude un acquisto: il Pay o il Checkout di un negozio online, il pagamento di una fattura, una mancia, il saldo di un'app per dividere le spese, la cassa di un mercatino, un'app di banca o di risparmio che vuole far sentire i soldi veri. Va collegato a un pagamento vero: qui il pagamento è simulato, e in un sito vero il conteggio parte quando il server accetta il pagamento e Paid arriva quando lo conferma.
La pillola è larga circa 320 pixel: a 390 ci sta con margine, e si stringe se lo schermo è più stretto. Il dito che preme apre la mazzetta a ventaglio e schiaccia il fondo; lasciando, si paga. Il canvas si disegna alla densità dello schermo (fino a 3), e le banconote, incise quattro volte più grandi, restano nitide anche quando vengono incontro all'occhio.
Niente si gira e niente salta: la fascetta sparisce in dissolvenza, la mazzetta svanisce dalla pila di sinistra e compare in dissolvenza su quella di destra, già contata, e la cifra va subito a $120.00. Le scritte cambiano in dissolvenza e la spunta è già disegnata; la mazzetta nuova ricompare in dissolvenza al suo posto. Niente ventaglio sotto il puntatore, niente rimbalzo del fondo.
GSAP 3.15.0, Mona Sans (font variabile) 5.3.0, Fraunces (font variabile) 5.3.0.
Compressi con gzip, i tre file della demo pesano 13 KB; le librerie: GSAP 28 KB.
Provata il 13 ottobre 2026
Puoi usarla nei tuoi progetti e in quelli dei tuoi clienti. Non puoi rivenderla né ridistribuirla così com’è. GSAP resta sotto la sua licenza Standard. Licenza completa.
Con l’email e la password del tuo account.
oppure con l’email
Hai fatto l’accesso come .
Con l’account scarichi lo zip di ogni animazione e di ogni pacchetto, gratis.