
Il pulsante di vetro liquido
Pulsanti, WebGL, Hover, Fisica
NuovaGratis
Un pulsante pieno di metallo liquido, disegnato da uno shader WebGL con i riflessi cromati di uno studio fotografico: il mercurio si allunga verso il puntatore e lo insegue con una lingua quando va veloce; al clic si spezza in gocce che schizzano, ricadono e si riuniscono, una perla corre lungo il bordo finché la richiesta aspetta, e alla fine si versa di nuovo nel pulsante. La scritta resta nitida sopra, in HTML.
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 mercury button</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/geist@5.3.0/index.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="stage">
<!-- the mercury button: a pill of liquid metal drawn in WebGL under a real button. The mercury reaches for the
pointer, breaks into drops when pressed, runs round the rim while the request waits, and pours back together
when it is done. The words stay in HTML, sharp, over the metal -->
<div class="mercury" data-mercury>
<div class="mercury__pool" data-pool>
<canvas class="mercury__canvas" data-canvas aria-hidden="true"></canvas>
<button class="mercury__btn" type="button" data-btn data-autoclic>
<span class="mercury__face" data-face="rest">
<span>Join the waitlist</span>
<svg class="mercury__icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h13M13 6.5l5.5 5.5-5.5 5.5"/></svg>
</span>
<span class="mercury__face" data-face="busy" aria-hidden="true">Saving your spot</span>
<span class="mercury__face" data-face="done" aria-hidden="true">
<svg class="mercury__icon mercury__icon--check" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12.6l4.3 4.3L19 7.2" pathLength="1" data-check/></svg>
<span>You’re on the list</span>
</span>
</button>
</div>
<p class="mercury__hint" data-rise><span data-hint>2,480 people ahead of you</span></p>
<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.
22 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 di mercurio» da Animorio e adattala al mio sitoIl metallo è un solo triangolo che copre un canvas più grande del pulsante, e uno shader che per ogni pixel calcola la distanza dal bordo del metallo: due pillole (le due metà del pulsante) e DROPS cerchi, fusi con un minimo morbido (smooth minimum) che li unisce quando sono più vicini di GOO pixel. Le due metà sono unite col minimo duro: a riposo sono una pillola sola, e solo quando si separano fra loro si forma un collo di liquido.
La distanza diventa un’altezza: un quarto di cerchio dal bordo, profondo quanto il raggio della forma che sta lì (mezza altezza nel corpo, il raggio della goccia dentro una goccia, una media pesata in mezzo), così ogni goccia esce tonda come una perla. La pendenza si legge dal campo in tre punti a 2,5 pixel di distanza, abbastanza lontani perché in mezzo a una goccia o in un collo la normale giri piano invece di fare una piega. Con la normale si riflette uno studio fatto di numeri: una parete chiara alle spalle, un orizzonte netto, un pavimento scuro, due lampade a strisce e una luce piccola che segue il puntatore.
Ogni goccia ha il suo posto dentro il pulsante e una molla (STIFF, DAMP, con un po’ di rigidità diversa per ognuna) che la riporta lì, sul ticker di GSAP col passo limitato a 1/30 di secondo. Il puntatore sposta il bersaglio: le gocce più vicine vanno verso di lui per GATHER della distanza, e la velocità del puntatore, misurata e smorzata, le tira indietro lungo la corsa, così un mouse veloce si porta dietro una lingua di metallo.
Al clic le due metà si separano di colpo nel mezzo (il collo si allunga e si spezza) e ogni goccia riceve una spinta di circa SPLASH pixel al secondo, lontano dal punto premuto e un po’ in alto. Per un secondo le molle sono quasi slegate e una gravità tira le gocce giù; poi la presa torna con power1.in e le gocce si riuniscono da sole. In volo sono un po’ più piccole: sembra uno spruzzo.
Mentre la richiesta finta aspetta (WAIT secondi) quattro gocce, le più vicine al punto di partenza, si disegnano su punti che corrono lungo il perimetro del pulsante (due tratti dritti e due mezzi cerchi), un giro ogni LAP secondi: la prima più grande, le altre sempre più piccole dietro, così il campo le fonde in una cometa che scivola sul bordo. Alla fine tornano al loro posto e il pulsante sobbalza su una molla.
Il pulsante vero è un button trasparente sopra il canvas, con tre facce di testo una sopra l’altra (riposo, attesa, fatto) che cambiano con una sfocatura; il testo ha un’ombra chiara di un pixel sotto, come inciso nel metallo. Invio e Spazio lo premono dal centro, aria-live dice lo stato, aria-disabled lo segna mentre aspetta. Senza WebGL resta una pillola cromata disegnata col CSS.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
REACH | script.js | 130 | Da quanti pixel lontano dal pulsante il mercurio sente il puntatore. |
GATHER | script.js | 0.6 | Quanta strada fa il mercurio verso il puntatore, come parte della distanza. |
STIFF | script.js | 150 | Quanto tira la molla che riporta ogni goccia al suo posto: la tensione del metallo. |
DAMP | script.js | 10 | Quanto in fretta il metallo smette di tremare. |
SPLASH | script.js | 520 | Quanto veloci schizzano via le gocce al clic, in pixel al secondo. |
GOO | script.js | 14 | A quanti pixel due gocce cominciano a fondersi in una. |
DROPS | script.js | 14 | Di quante gocce è fatto il mercurio. |
LAP | script.js | 1.3 | I secondi di un giro della perla lungo il bordo mentre la richiesta aspetta. |
WAIT | script.js | 2.4 | I secondi della richiesta finta. |
DONE | script.js | 3.2 | I secondi in cui il pulsante dice che è fatto, prima di tornare da solo. |
Per l’azione principale di una pagina di lancio, una lista d’attesa, un prodotto con un’estetica metallica o futuristica (audio, orologi, tecnologia, moda): un pulsante solo, su un fondo scuro e calmo, con spazio intorno per gli schizzi. Non per una pagina con molti pulsanti uguali.
Il canvas si stringe alla larghezza dello schermo e a 390 pixel non sfora. Senza un mouse che si avvicina, il dito che preme fa da puntatore: il metallo si ammacca dove tocca e lo segue finché il dito resta giù; poi lo schizzo e la perla come al computer. La densità dei pixel è limitata a 2.
Il metallo resta fermo e lucido: non respira, non insegue il puntatore, non si schizza e non corre lungo il bordo. Le scritte cambiano con una dissolvenza, durante l’attesa la scritta pulsa piano, e la spunta compare già disegnata.
GSAP 3.15.0, Geist (font variabile) 5.3.0.
Compressi con gzip, i tre file della demo pesano 11 KB; le librerie: GSAP 28 KB.
Provata il 4 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.