
Il pulsante a strati
Pulsanti, Hover, Fisica
Gratis
Il pulsante Use my location di un'app di consegne, con una vera bussola a liquido nella punta tonda della pillola, al posto dell'icona: la ghiera d'ottone zigrinata, la rosa stampata con le tacche e la N rossa, un ago bicolore che galleggia nel liquido, la cupola di vetro e una bollicina d'aria. L'ago è un pendolo di torsione vero: il puntatore vicino al pulsante è una calamita, l'ago gli si gira incontro, va un poco oltre e si assesta, e quando il puntatore se ne va torna a nord oscillando. Al clic l'ago cerca come disturbato e la rosa gira un poco; poi si blocca sul nord con un ultimo rimbalzo, un riflesso passa sull'ottone e la pillola si allarga su Delivering to Brera, Milan.
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 compass 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 compass button: the Use my location button of a delivery app, with a real liquid compass in the round left
end of the pill, where an icon would be. The needle is a torsion pendulum floating in the liquid: the pointer
near the button is a magnet, so the needle turns to it, goes a little past and settles, and swings back to
north when it leaves. A click looks for you (simulated, no real geolocation): the needle hunts, the card
turns, then it locks on north and the pill opens on the place found -->
<div class="locate" data-locate>
<button class="locate__btn" type="button" data-btn data-autoclic>
<span class="locate__fill" aria-hidden="true"></span>
<canvas class="locate__compass" aria-hidden="true" data-compass></canvas>
<span class="locate__faces">
<span class="locate__face" data-face="rest">
<span class="locate__word" data-wide="Use my location" data-rest-text>Use my location</span>
</span>
<span class="locate__face locate__face--busy" data-face="busy" aria-hidden="true">
<span class="locate__shine" data-busy-text>Locating…</span>
</span>
<span class="locate__face locate__face--found" data-face="found" aria-hidden="true">
<span class="locate__place">
<span class="locate__lead" data-lead-text>Delivering to</span>
<span class="locate__spot">
<svg class="locate__pin" viewBox="0 0 16 16" aria-hidden="true" data-pin>
<path d="M8 14.6c-.3 0-.6-.2-.8-.4C5.3 12 3.3 9.4 3.3 6.8a4.7 4.7 0 0 1 9.4 0c0 2.6-2 5.2-3.9 7.4-.2.2-.5.4-.8.4z"/>
<circle cx="8" cy="6.8" r="1.7"/>
</svg>
<span class="locate__name" data-place-text>Brera, Milan</span>
</span>
</span>
<span class="locate__change" data-change-text>Change</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.
28 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 della bussola» da Animorio e adattala al mio sitoIl canvas copre la punta tonda della pillola (60 pixel, alla densità dello schermo fino a 3). Quello che non si muove si dipinge una volta su due canvas fuori dallo schermo: sotto, l'ombra della cassa sulla pillola, la ghiera d'ottone (un gradiente conico con due lobi chiari uno di fronte all'altro, quello verso la lampada più chiaro), la zigrinatura, la scanalatura, lo smusso col gradiente girato di mezzo giro perché guarda in dentro, e il fondo color crema; sopra, l'ombra interna del bordo (un anello fuori dal ritaglio che getta la sua ombra dentro), il liquido più fondo verso il bordo e i riflessi del vetro. A ogni fotogramma si disegnano solo la rosa girata, l'ago, la bolla e il riflesso dell'aggancio, fra i due livelli fermi.
L'ago è una losanga coi lati appena concavi, divisa dalla cresta in quattro facce. La luce di una faccia è il prodotto scalare fra la sua normale sullo schermo (la destra dell'ago, cos θ e sin θ, o la sinistra) e la direzione della lampada in alto a sinistra: girando, la faccia chiara passa dall'altra parte, e l'ago sembra di metallo. L'ombra sul cartoncino usa shadowOffset, che il canvas misura in pixel dello schermo e non gira con la trasformazione: cade sempre in basso a destra, a qualunque angolo. Il cappellotto del perno si disegna dopo, non girato, così la sua luce resta ferma.
L'angolo θ dell'ago segue θ'' = ω0² · |B| · sin(β − θ) − c · θ', con ω0 = 2π · SWING. Il campo B è la somma di quello della terra, verso l'alto della pagina, e di quello del puntatore: verso di lui, forte MAGNET · 1 / (1 + (d / REACH)³), che cala col cubo della distanza come quello di una calamita e si spegne entro 16 pixel dal perno, dove tirerebbe in giù attraverso l'ago. Lo smorzamento viscoso è c = 2 · DAMPING · ω0 · √|B|: più il campo è forte più l'ago è veloce, e il liquido lo frena in proporzione, così fa sempre un sorpasso di circa un terzo e uno piccolo. Passi di 1/240 di secondo, fotogramma limitato a 1/30; quando l'ago non ha più velocità né coppia, la bolla è ferma e niente si muove, il ciclo smette di calcolare e di disegnare finché il puntatore o un'animazione non lo svegliano.
La bolla segue su una molla morbida (1,3 oscillazioni al secondo, smorzamento 0,55) il suo posto in basso a destra. Il liquido la trascina: la velocità del liquido nel suo punto è 0,24 · θ' girata di un quarto, quindi gira un poco intorno al perno quando l'ago oscilla. La cassa la spinge: la posizione della bussola sullo schermo si legge a ogni fotogramma, e la sua accelerazione (differenze finite, filtrate e limitate) la sposta come una bolla in un bicchiere che si muove, per esempio quando la pillola si allarga e la bussola scivola a sinistra. Una pressione inclina la bussola lontano dal dito e il posto della bolla si sposta verso il lato alto, di PRESS · 7 pixel. Il bordo la trattiene: la riporta dentro e le toglie la velocità verso fuori, con un piccolo rimbalzo.
Cercando, la terra si indebolisce e arriva un campo che vaga: il suo angolo è rumore a gradiente su due ottave (2,7 · n(0,8 t) + 1,3 · n(2,2 t)), forte 1,6, con un tremito di rumore veloce sulla coppia. La rosa, su una molla sua, segue una mano che la gira fino a 0,42 radianti col rumore. È tutto simulato con i tempi di GSAP: il browser non chiede mai la posizione. Dopo LOCATE secondi il disturbo cessa, la terra diventa 2,6 volte più forte e lo smorzamento una volta e mezza: l'ago scatta sul nord con un rimbalzo di una decina di gradi e uno piccolo. Un riflesso a bande passa su tutta la cassa in modalità screen, e la pillola si allarga alla larghezza misurata del posto trovato con back.out.
Tre facce sovrapposte, larghe quanto le parole (width: max-content), misurate al pixel frazionario e arrotondate per eccesso: la pillola a riposo tiene già il posto della scritta larga (una copia invisibile a font-stretch 116%), quella trovata è larga quanto Delivering to, il posto e Change, e su uno schermo stretto il nome finisce coi puntini. Il pulsante è un button vero: aria-disabled mentre cerca e si apre, una zona aria-live dice Locating… e Delivering to Brera, Milan, e da trovato l'aria-label dice anche Change location. La ricerca e l'apertura durano circa 3,3 secondi, più dei 2,8 fra un clic e l'altro dell'anteprima: il secondo clic cade nell'attesa e la pillola aperta resta in vista un giro intero.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
LABEL | script.js | Use my location | La scritta a riposo. Se è troppo lunga per lo spazio, il carattere si rimpicciolisce. |
BUSY | script.js | Locating… | La scritta mentre cerca; è anche quello che dice la zona aria-live. |
LEAD | script.js | Delivering to | La riga piccola sopra il posto trovato. |
PLACE | script.js | Brera, Milan | Il posto trovato. La ricerca è simulata: in un sito vero qui va l'indirizzo o il negozio che il tuo server trova. |
CHANGE | script.js | Change | La piccola pillola a destra del posto trovato: un clic riporta il pulsante a riposo. |
LOCATE | script.js | 2 | I secondi della ricerca, mentre l'ago cerca e la rosa gira. |
SWING | script.js | 1 | Le oscillazioni al secondo dell'ago nel solo campo della terra: più alto, un ago leggero e svelto; più basso, pesante e lento. |
DAMPING | script.js | 0.3 | Quanto il liquido frena l'ago: 0,05 oscilla a lungo, 0,3 va un terzo oltre e si assesta, 1 arriva piano al suo posto senza passarlo. |
MAGNET | script.js | 10 | Quanto è forte il puntatore come calamita da vicino, in campi della terra: 0 l'ago non lo sente; più è alto, più l'ago punta proprio verso di lui. |
REACH | script.js | 200 | Fin dove arriva la calamita, in pixel: a questa distanza tira con metà della sua forza, al doppio con un nono. |
PRESS | script.js | 1 | Quanto una pressione inclina la bussola: la bollicina scivola lontano dal dito. 0 resta ferma. |
Per il pulsante che trova dove sei: l'indirizzo di consegna di un'app di cibo o di spesa, il negozio più vicino di una catena, il meteo del posto, un modulo di indirizzo, la ricerca di un ristorante o di un noleggio. La bussola sta bene nei siti di viaggio, di escursioni, di nautica e di cose fatte bene. Va collegato a una ricerca vera (la Geolocation API o l'indirizzo che l'utente ha salvato): qui è tutto simulato e il browser non chiede niente.
La pillola a riposo è larga circa 225 pixel e quella aperta circa 275: a 390 pixel ci stanno con margine, e se il posto è più lungo dello schermo il nome finisce coi puntini. Il dito appoggiato sulla pagina vicino al pulsante è la calamita e l'ago gli si gira incontro; il tocco sul pulsante schiaccia il fondo, fa scivolare la bollicina e cerca. La bussola resta di 46 pixel.
L'ago sta fermo sul nord e non segue il puntatore; niente oscillazione all'arrivo, la pillola non si gonfia e la scritta non si allarga (sotto il mouse il fondo si schiarisce appena). Cercando l'ago svanisce a un terzo e Locating… arriva in dissolvenza; trovato, l'ago torna pieno, la pillola prende la sua nuova larghezza mentre le parole sono sparite e Delivering to Brera, Milan arriva in dissolvenza, senza spillo che cade né riflesso. Un altro clic torna a riposo nello stesso modo.
GSAP 3.15.0, Mona Sans (font variabile) 5.3.0.
Compressi con gzip, i tre file della demo pesano 16 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.