
Il rullo delle ore
Selettori, 3D, Fisica
NuovaGratis
Il pulsante Buy · €2.50 dipinto come la vetrina di un distributore automatico: nella punta della pillola rossa laccata una finestrella illuminata, e dietro il vetro una fila vista di fronte, in 3D vero, con la spirale d'acciaio che corre indietro nella macchina e le barrette di cioccolato incartate in piedi fra le spire. Al clic la spirale fa un giro, le spire passano davanti e dietro le barrette e tutte avanzano; quella davanti supera il bordo del ripiano, si inclina, cade girando e rimbalza nel vano prima di sparire. La pillola dice Enjoy · Change €0.50. Un altro clic carica la barretta successiva.
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 vending machine button</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/mona-sans@5.3.0/wdth.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="stage">
<!-- the vending machine button: a Buy button painted like the front of a vending machine. In the round right end of
the pill there is a small lit window with a row inside: a steel spiral, drawn in true 3D with its turns in
front of the bars and behind them, holding wrapped chocolate bars on end. A click turns the spiral once: the
front bar comes forward, tips over the edge of the shelf, falls and bounces into the tray, and the pill says
Enjoy with the change; another click loads the next bar -->
<div class="vend" data-vend>
<button class="vend__btn" type="button" data-btn data-autoclic>
<span class="vend__fill" aria-hidden="true"></span>
<span class="vend__faces">
<span class="vend__face" data-face="rest">
<span class="vend__word" data-wide="Buy · €2.50" data-rest-text>Buy · €2.50</span>
</span>
<span class="vend__face vend__face--busy" data-face="busy" aria-hidden="true">
<span class="vend__shine" data-busy-text>Vending…</span>
</span>
<span class="vend__face vend__face--done" data-face="done" aria-hidden="true">
<span class="vend__line">
<span class="vend__enjoy" data-done-text>Enjoy</span>
<span class="vend__sep" aria-hidden="true">·</span>
<span class="vend__change" data-change-text>Change €0.50</span>
</span>
</span>
</span>
<span class="vend__window" aria-hidden="true">
<canvas class="vend__scene" data-scene></canvas>
</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.
25 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 del distributore automatico» da Animorio e adattala al mio sitoLa finestra è un canvas di 86 per 48 pixel, alla densità dello schermo fino a 3. Il mondo ha X a destra, Y in su e Z verso di noi; l'asse della fila corre lungo Z dal bordo del ripiano indietro. Un punto si proietta con s = F / (F − Z): x = cx + X · s, y = orizzonte + (altezza dell'occhio − Y) · s. Con l'occhio 22 pixel sopra l'asse le cose in fondo sono più piccole e più alte, e si vede la profondità della fila. Lo sfondo, la luce, il ripiano e i piatti dei motori si dipingono una volta su un canvas a parte.
La spirale è un'elica di raggio 11,5 e passo 13: il filo all'angolo a sta a Z = −(a − φ) / 2π · passo, quindi girandola di φ ogni spira viene avanti. Ogni spira è fatta di 28 segmenti, e ogni segmento è un elemento con la sua profondità, ordinato insieme alle barrette e al bordo del ripiano dal più lontano al più vicino: così le spire passano davanti alle barrette e dietro di loro come in una vera. Il colore del filo dipende dal seno dell'angolo (chiaro sopra, dove riflette la striscia di luce, scuro sotto), con un filo di luce sottile spostato in su, e sbiadisce un poco in fondo.
Ogni barretta è una scatola di 13 per 17 per 4,5 pixel, col suo centro e un'inclinazione ψ intorno all'asse X. Le otto punte si girano e si proiettano; delle sei facce si disegnano quelle che guardano la camera (prodotto scalare fra la normale girata e la direzione verso l'occhio). La faccia davanti porta l'incarto, dipinto una volta su un canvas otto volte più fitto e steso sui due triangoli della faccia con la trasformazione affine; le estremità sono stagnola, chiara se guarda in su, e i fianchi carta piegata. Quando si inclina, la faccia davanti si accorcia e quella di sopra si allarga, perché è proprio una scatola che gira.
Un tween di GSAP porta la spirale a un giro intero in power1.inOut, e ogni barretta della fila avanza di un passo per giro. Quando il centro di quella davanti supera il bordo, la barretta è per conto suo: gira intorno allo spigolo come un pendolo rovesciato, ψ'' = 0,75 · g / r · sin ψ, sempre più svelta; a 0,62 radianti lascia lo spigolo con la velocità che aveva (ω per il raggio) e diventa un corpo libero, con la gravità, un poco di freno e la sua rotazione. A ogni passo di 1/240 di secondo si cerca la punta più bassa: quando passa il fondo del vano la barretta torna su, la velocità verticale si rovescia e si riduce a BOUNCE e la rotazione si dimezza. Al terzo colpo, o quando rimbalza poco, si posa di piatto e scivola giù sotto il telaio sparendo.
Sopra tutto si disegnano la striscia di luce in cima, con il suo alone che scende, e i riflessi del vetro: tre bande oblique con un gradiente che sale e scende, in modalità screen, e un filo chiaro sul bordo alto. Sotto il puntatore, o col fuoco della tastiera, una quarta banda più forte attraversa il vetro e l'alone cresce; la spirale dà un piccolo giro indietro e torna con elastic.out. Quando niente si muove (nessun tween e nessuna barretta in volo), il ciclo smette di disegnare.
Tre facce sovrapposte: Buy · €2.50, con una copia larga invisibile che tiene il posto della scritta che si allarga; Vending… con un riflesso che la attraversa; ed Enjoy · Change €0.50 su una sola linea di base, con le tre parti che arrivano una dopo l'altra. Il pulsante è un button vero: aria-disabled mentre vende, una zona aria-live dice Vending…, Enjoy. Change €0.50. e Next bar loaded., e l'aria-label dice cosa farà il prossimo clic. La caduta finisce prima dei 2,8 secondi fra due clic dell'anteprima, che così fa vedere il giro intero: compra, ricarica, compra.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
LABEL | script.js | Buy · €2.50 | La scritta a riposo, col prezzo. |
BUSY | script.js | Vending… | La scritta mentre la spirale gira; la dice anche la zona aria-live. |
DONE | script.js | Enjoy | La parola grande quando la barretta è nel vano. |
CHANGE | script.js | Change €0.50 | Il resto, più piccolo dopo la parola. In un sito vero qui va quello che il tuo server risponde (lo sconto, il credito che resta, il numero dell'ordine). |
TURN | script.js | 1.15 | I secondi del giro della spirale. |
COILS | script.js | 5 | Le spire della spirale, da 3 a 7: le barrette in fila sono una di meno. |
GRAVITY | script.js | 1300 | Quanto in fretta cade la barretta, in pixel al secondo al quadrato: più basso, una caduta lenta, come sulla luna. |
BOUNCE | script.js | 0.34 | Quanta velocità tiene la barretta quando tocca il vano: 0 si ferma subito, 0,7 rimbalza alto. |
Per il pulsante che compra subito una cosa piccola: uno snack, un caffè, un biglietto, un gettone, un pacchetto di crediti di un gioco, una donazione, l'acquisto rapido di un negozio di dolci o di una macchinetta vera collegata a un'app. Sta bene nei siti un poco giocosi e nei negozi notturni. Va collegato al tuo pagamento vero: qui l'acquisto è simulato.
La pillola è larga 300 pixel: a 390 pixel ci sta con margine, e la finestra resta di 86 per 48. Il tocco compra (con lo schiacciamento elastico del fondo) e un altro tocco ricarica; il riflesso sul vetro, che col mouse arriva in hover, al telefono passa al momento della ricarica.
La spirale non gira e non dà il suo piccolo giro, niente riflesso che passa, la pillola non si gonfia e la scritta non si allarga (sotto il mouse il fondo si schiarisce appena). Al clic la barretta davanti svanisce in dissolvenza e le altre sono già al loro posto, ed Enjoy · Change €0.50 arriva in dissolvenza; un altro clic fa comparire la barretta nuova in fondo, in dissolvenza.
GSAP 3.15.0, Mona Sans (font variabile) 5.3.0.
Compressi con gzip, i tre file della demo pesano 13 KB; le librerie: GSAP 28 KB.
Provata il 12 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.