
Il pulsante da far scorrere
Pulsanti, Fisica, Transizioni
NuovaGratis
Il caricamento di sei file fatto come un becher di vetro graduato sotto un contagocce: ogni pezzo di dati è una goccia che si gonfia sulla punta, si allunga, si stacca e cade, rompe la superficie e solleva un’onda che corre fino al vetro e torna. Ogni file ha il suo colore, così i file si posano a strati, e il livello sulle tacche è la percentuale. Se un pezzo non passa la goccia diventa torbida e resta appesa finché Retry non la riassorbe; alla fine il contagocce si alza, il liquido si calma e un riflesso attraversa il vetro: Upload complete.
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, viewport-fit=cover">
<title>The drop beaker upload</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/instrument-sans@5.3.0/standard.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="stage">
<!-- the drop beaker: an upload of six files shown as a graduated glass beaker under a dropper. Every chunk of data
is a drop that swells at the tip, stretches, pinches off and falls; it sinks into the liquid and lifts a wave.
Every file has its own colour, so the files settle in layers, and the level is the progress, read on the
beaker's marks. The beaker, the dropper and the drops are painted by script.js on the canvas -->
<section class="becher" aria-label="File upload" data-becher>
<div class="becher__scene" role="progressbar" aria-label="Upload progress" aria-valuemin="0" aria-valuemax="100"
aria-valuenow="0" aria-valuetext="Ready to upload" data-scene>
<canvas class="becher__paint" aria-hidden="true" data-paint></canvas>
</div>
<div class="becher__info" aria-hidden="true">
<p class="becher__title">
<svg class="becher__tick" viewBox="0 0 24 24" data-tick><path d="M5.5 12.6l4.2 4.2 8.8-9.4" pathLength="1"/></svg>
<span class="becher__swap" data-title>6 files · 84 MB</span>
</p>
<p class="becher__pct" data-pct>0%</p>
<p class="becher__meta"><span class="becher__swap" data-meta>Ready to upload</span></p>
</div>
<div class="becher__buttons">
<button class="pill" type="button" data-go data-autoclic><span class="pill__label" data-label>Upload files</span></button>
</div>
<p class="sr" role="status" aria-live="polite" data-live></p>
</section>
</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.
50 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 becher delle gocce» da Animorio e adattala al mio sitoLa goccia sulla punta, il collo, la goccia che cade, gli spruzzi e la superficie del liquido sono campi che si sommano: ogni palla vale (1 − t²)² fino a 1,848 volte il suo raggio, così la somma passa la soglia 0,5 proprio sul raggio. Lo script calcola il campo pixel per pixel, ma solo nel rettangolo che le palle raggiungono, e lo scrive in un’ImageData che poi copia sul canvas. Il bordo è antialiasato dividendo la distanza dalla soglia per la pendenza del campo, e la stessa pendenza dà la normale: la luce viene da in alto a sinistra con un riflesso stretto, e dal fondo della goccia passa un po’ di luce, come in una lente.
Mentre il pezzo viaggia la goccia cresce con la radice quadrata del tempo, appesa a un collo che è un campo a capsula (la distanza da un segmento). Quando il pezzo è arrivato, in 0,13 secondi la goccia scende di 10 unità e il collo si assottiglia fino a zero: il campo nel mezzo scende sotto la soglia prima che altrove e la goccia si strozza da sola, senza nessun disegno a mano del momento in cui si stacca. Cadendo si allunga con la velocità (fino al 40%) restando dello stesso volume.
39 punti, ognuno legato ai vicini e alla quota di riposo: a = c²/dx² · (h₋₁ + h₊₁ − 2h) − 14h − d·v, a passi di un 240° di secondo, con le pareti che riflettono. Dopo ogni passo si toglie la media, così l’acqua non si perde: il cratere della goccia spinge su il resto. Una goccia che entra dà ai punti vicini una spinta proporzionale alla sua velocità, lancia uno spruzzo che salta su dopo 90 millesimi (quando il cratere risale) e qualche gocciolina di lato, che ricadendo fa la sua piccola onda. Anche la superficie è un campo, appena sotto la soglia sulla sua linea: una goccia che si avvicina si attacca al liquido con un ponte, come succede davvero.
Ogni goccia porta i suoi megabyte: quando tocca il liquido si aggiungono al suo file e il livello li insegue con una molla esponenziale, così sale a piccoli scalini morbidi. Il liquido è un solo poligono, la superficie in alto, riempito con un gradiente verticale che ha una fascia per ogni file, alta come i suoi megabyte, con una cucitura morbida di 3 unità fra due file. Sopra ci sono le nuvole delle gocce appena entrate (gradienti radiali che scendono e si allargano), l’ombra delle pareti tonde e la luce sotto la superficie; il becher di vetro si disegna dopo, con le tacche che il liquido ha superato più chiare.
Il pezzo che va storto si ferma al 72% della goccia: il colore va verso il torbido in mezzo secondo, una grana fissata alla goccia la rende opaca e la goccia trema con un seno che si spegne. Retry la fa rimpicciolire fino a zero dentro la punta e il pezzo riparte da capo. Alla fine lo smorzamento della superficie sale di 7, il contagocce si alza con un back.in e un riflesso diagonale, un gradiente lineare ritagliato sul vetro, lo attraversa in 1,1 secondi. Il ciclo di disegno gira solo finché qualcosa si muove: gocce, onde, livello o tween.
Il becher è un role=progressbar con aria-valuenow e aria-valuetext aggiornati al massimo ogni mezzo secondo, aria-busy mentre lavora e una riga aria-live per l’inizio, l’errore, la fine e l’annullamento. Il pulsante resta lo stesso elemento in tutti gli stati, quindi lo stato attivo da tastiera non si perde. I clic da script (detail 0, quelli dell’anteprima della libreria) non annullano mai e ripartono solo dopo 2,4 secondi di Upload complete, così la miniatura gira da sola mostrando anche l’errore.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
SECONDS | script.js | 7 | Quanto dura il caricamento della demo, in secondi (uno vero segue i byte che arrivano). |
FILES | script.js | [['brand-guide.pdf', 18.2], ['hero-render.png', 24.6], …] | I file da caricare, ognuno col suo nome e i suoi megabyte; il colore di ognuno sta in style.css (--drop-1 … --drop-6, poi si ricomincia). |
CHUNK | script.js | 6 | I megabyte di una goccia: un file si divide in gocce di circa questa misura (almeno una per file). |
FAIL_EVERY | script.js | 2 | Nella demo, un caricamento ogni quanti va storto; 0 mai. |
FAIL_AT | script.js | 0.5 | Fin dove arriva il caricamento che va storto, da 0 a 1. |
DROP | script.js | 5.6 | Il raggio di una goccia di CHUNK megabyte, in unità del disegno (il becher è largo 152); le gocce più piccole sono un po’ più piccole. |
GRAVITY | script.js | 1500 | La gravità sulle gocce e sugli spruzzi, in unità al secondo quadrato: più forte, le gocce entrano più veloci e fanno onde più alte. |
WAVE | script.js | [210, 1.8] | La superficie: quanto corre un’onda (unità al secondo) e quanto in fretta si spegne. |
SPLASH | script.js | 3 | Le goccioline che saltano su quando una goccia entra: la prima è lo spruzzo dritto, le altre volano di lato. |
WORDS | script.js | { busy: 'Uploading', error: 'Upload paused', done: 'Upload complete' } | Le scritte sotto il becher mentre carica (seguita dal numero di file), quando si ferma e alla fine; quella a riposo si cambia in index.html. |
LABELS | script.js | { busy: 'Cancel', error: 'Retry', done: 'Upload again' } | Le scritte del pulsante mentre carica, quando si ferma e alla fine; quella a riposo, Upload files, si cambia in index.html. |
Per un caricamento di qualche secondo con più file, in un prodotto che può permettersi un tocco di gioco: uno strumento creativo, un laboratorio o un’app di scienza, un servizio di consegna di file, la pagina dei campioni di un laboratorio. Gli strati dicono quali file sono già arrivati senza un elenco, e le gocce danno un ritmo all’attesa. Per un caricamento di un file solo, o di centinaia di file piccoli (sarebbero centinaia di gocce), è meglio una barra semplice.
Il componente è largo 380 pixel e sul telefono prende la larghezza dello schermo meno 16 pixel per lato (358 a 390): il disegno si scala con la larghezza e il canvas dipinge alla densità vera dello schermo, fino a due volte, quindi le gocce restano nitide. Il campo delle metaball si calcola solo intorno alle gocce, così anche su un telefono lento resta leggero. La pillola è alta 44: col dito si schiaccia e rimbalza; la goccia che si gonfia sulla punta, la pillola che si gonfia e la scritta che si allarga ci sono solo col mouse (la goccia anche con la tastiera).
Niente gocce che cadono, onde, spruzzi, nuvole né riflesso finale, e il contagocce non si sposta: il liquido sale lo stesso a strati, insieme alla percentuale, perché è lui a dire a che punto si è, e il colore nel contagocce cambia di colpo a ogni file. Alla fine il contagocce sparisce con una dissolvenza; le parole cambiano con una dissolvenza e la spunta compare senza disegnarsi.
GSAP 3.15.0, Instrument Sans (font variabile) 5.3.0.
Compressi con gzip, i tre file della demo pesano 17 KB; le librerie: GSAP 28 KB.
Provata il 8 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.