
Il pulsante di vetro liquido
Pulsanti, WebGL, Hover, Fisica
NuovaGratis
Il pulsante Upgrade to Pro di una pagina dei prezzi, su fondo nero: dentro la pillola un piccolo prisma di vetro apre un raggio di luce bianca nel suo spettro, che attraversa la pillola e colora la scritta. È ottica vera, calcolata per sedici lunghezze d’onda con la legge di Snell, l’indice di Cauchy e i riflessi di Fresnel, e disegnata da uno shader WebGL che somma le fasce di colore. Il puntatore gira il prisma su una molla e lo spettro si sposta, si apre e si stringe; premuto, il prisma gira, lo spettro spazza la pillola come un faro e la scritta diventa Welcome to Pro.
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 prism button</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/inter-tight@5.3.0/index.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="stage">
<!-- the prism button: the Upgrade to Pro button of a pricing page. Inside the pill a small glass prism splits a ray
of white light into its spectrum, worked out with Snell's law for sixteen wavelengths, and the colours light the
words. The pointer turns the prism; pressed, it spins and the spectrum sweeps the whole pill -->
<div class="pro" data-pro>
<span class="pro__halo" aria-hidden="true" data-halo></span>
<div class="pro__pill" data-pill>
<canvas class="pro__canvas" aria-hidden="true" data-canvas></canvas>
<button class="pro__btn" type="button" data-btn data-autoclic>
<span class="pro__face" data-face="rest">Upgrade to Pro</span>
<span class="pro__face" data-face="busy" aria-hidden="true">Upgrading</span>
<span class="pro__face" data-face="done" aria-hidden="true">Welcome to Pro</span>
</button>
</div>
<p class="pro__note" data-rise><span data-note>$12 a month, billed yearly · cancel anytime</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.
20 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 prisma» da Animorio e adattala al mio sitoOgni fotogramma in cui il prisma si muove, lo script segue sedici raggi, dal viola a 409 nanometri al rosso a 691. Per ognuno trova la prima faccia che il raggio incontra, ne prende la normale e piega il raggio con la legge di Snell in forma vettoriale; dentro il vetro trova la faccia d’uscita e lo piega di nuovo. L’indice cambia col colore secondo la formula di Cauchy, n = INDEX + SPREAD / λ², più alto per il blu: per questo il blu si piega di più e i colori si separano. Se un raggio arriva su una faccia più radente dell’angolo limite, la faccia fa da specchio (riflessione totale) e il raggio esce da un’altra.
A ogni faccia una parte della luce si riflette, con le equazioni di Fresnel per la luce non polarizzata (la media delle due polarizzazioni): quello che passa è la luce rimasta per il raggio, e quello che si riflette sulla prima faccia diventa un raggio bianco che torna indietro, più forte quando la luce arriva radente. Per ogni colore lo shader riceve il punto d’entrata, quello di un eventuale rimbalzo, il punto d’uscita e la direzione, con la luce rimasta scritta nella lunghezza della direzione (due vec4 a raggio: poche uniform, che bastano anche ai telefoni).
Il colore di ogni raggio viene dalle funzioni colorimetriche CIE 1931 scritte come somme di gaussiane asimmetriche (Wyman, Sloan e Shirley), poi da XYZ a sRGB lineare, tagliando le parti negative che lo schermo non sa mostrare. I sedici colori sono scalati perché tutti insieme facciano il bianco: dove le fasce si sovrappongono, vicino al prisma, la luce torna bianca, e più in là si apre l’arcobaleno, come in un prisma vero.
Per ogni pixel lo shader sommma la luce di ogni raggio: una fascia con un nucleo netto e un bagliore largo, che si allarga lungo il cammino e si fa più tenue in proporzione, così l’energia resta la stessa. Le lettere sono una texture disegnata una volta (le tre scritte nei tre canali rosso, verde e blu) e prendono la luce più del fondo, come la carta stampata sotto un raggio. Il prisma ha una tinta leggera e spigoli lucidi, più chiari sulle facce girate verso l’alto; alla fine una curva morbida, che non arriva mai al bianco piatto, e la correzione gamma.
All’avvio lo script cerca la rotazione di deviazione minima, la posizione classica in cui lo spettro è più ordinato, e l’angolo d’entrata del raggio bianco che manda il verde nel mezzo della scritta. Il puntatore aggiunge fino a TURN radianti su una molla (STIFF e DAMP); premendo, il prisma gira a SPIN giri al secondo per WAIT secondi e poi la molla lo ferma sul terzo di giro successivo, dove un triangolo è uguale a prima. Lo shader si ridisegna solo quando qualcosa cambia.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
INDEX | script.js | 1.48 | L’indice di rifrazione del vetro (la A di Cauchy): di più, la luce si piega di più. |
SPREAD | script.js | 0.032 | Quanto l’indice cambia col colore (la B di Cauchy, in micrometri quadrati): di più, un arcobaleno più largo. Un vetro vero sta sotto 0,01: qui è esagerato perché si veda. |
TURN | script.js | 0.3 | Di quanto il puntatore può girare il prisma, in radianti da ogni parte. |
STIFF | script.js | 70 | Quanto forte la molla gira il prisma dove lo vuole il puntatore. |
DAMP | script.js | 9 | Quanto presto il prisma smette di dondolare. |
SPIN | script.js | 1.4 | I giri al secondo del prisma mentre l’upgrade va avanti. |
WAIT | script.js | 1.6 | I secondi dell’upgrade finto. |
DONE | script.js | 3.4 | I secondi in cui il pulsante dice Welcome to Pro prima di tornare da solo. |
GAIN | script.js | 1 | Quanto è forte la luce. |
Per il pulsante che conta di una pagina dei prezzi su fondo scuro: Upgrade, Go Pro, Start free trial, Get early access. Sta bene da solo, nella colonna del piano consigliato, o nell’intestazione di un’app di creativi e sviluppatori; il prisma dice luce e qualità senza bisogno di icone. Va usato una volta per pagina: è un effetto che attira lo sguardo.
La pillola si stringe alla larghezza dello schermo (al massimo 360 pixel) e il prisma, la scritta e lo spettro si ricalcolano per la sua misura. Senza mouse il dito gira il prisma mentre tocca e lo spettro lo segue; il tocco preme il pulsante. Il canvas lavora al massimo a due volte la densità dello schermo.
Il prisma sta fermo nella sua posizione di riposo: niente molla, niente rotazione verso il puntatore e niente giro alla pressione. Lo spettro resta dov’è; premendo, le scritte cambiano in dissolvenza, la luce si fa più forte, lo spettro si apre senza muoversi e l’alone compare.
GSAP 3.15.0, Inter Tight (font variabile) 5.3.0.
Compressi con gzip, i tre file della demo pesano 11 KB; le librerie: GSAP 28 KB.
Provata il 5 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.