
Il pulsante a strati
Pulsanti, Hover, Fisica
Gratis
Il variatore di una lampada da lettura, illuminato dalla lampada che regola: una manopola di metallo tornito che ha un peso, scatta di tacca in tacca, lanciata scorre finché una tacca la ferma e spegne con uno scatto più duro. Girandola la luce cala e si scalda come un filamento, dal bianco caldo all'ambra di una candela, e con lei cambiano i riflessi del metallo, la placca, le scritte e l'ombra; spenta, resta il chiaro freddo di una finestra.
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 lamp dimmer</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/jost@5.3.0/index.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="stage">
<!-- the dimmer of a reading lamp: a fluted metal knob on a dark wall plate, and everything on the plate is seen
by the light of the lamp it dims. The knob clicks from notch to notch, coasts when flung and turns the lamp
off with a firmer click; the light warms as it dims. The plate and the knob are drawn by the script -->
<div class="dimmer" data-dimmer data-autoclic>
<canvas class="dimmer__plate" aria-hidden="true" data-canvas></canvas>
<div class="dimmer__knob" role="slider" tabindex="0" aria-labelledby="dimmer-name" aria-valuemin="0" aria-valuemax="100" data-knob></div>
<div class="dimmer__read">
<p class="dimmer__name" id="dimmer-name" data-name>Reading lamp</p>
<p class="dimmer__warmth" aria-hidden="true" data-kelvin></p>
<p class="dimmer__level" aria-hidden="true" data-level><span data-value></span><span class="dimmer__pct" data-pct>%</span></p>
</div>
<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.
17 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 «La manopola della lampada» da Animorio e adattala al mio sitoLa manopola ha un angolo e una velocità, e su di lei agisce una forza che dipende dall'angolo: −DETENT·sin(2π·(a − a1)/passo), che spinge verso la tacca più vicina e ha una gobba fra due tacche. La tacca di Off è più larga e quasi due volte più profonda; oltre Off e oltre il massimo i fermi sono molle rigide che cedono di un grado o due. Il conto si fa sul ticker di GSAP, in passi di 2 millesimi e col fotogramma limitato a 1/30 di secondo, perché i fermi rigidi su un fotogramma lento esploderebbero.
La mano non mette l'angolo: tira la manopola con una molla (HAND_K) e la frena sulla differenza fra la sua velocità e quella della manopola. Siccome le tacche sono più rigide della mano, la manopola resta indietro di qualche grado e poi scatta nella tacca dopo: lo scatto si vede. Lasciata, la manopola tiene la sua velocità, FRICTION la rallenta e quando non ha più la forza di superare una gobba una tacca la ferma, con un piccolo rimbalzo. Lanciata con forza verso il basso si ferma al 5%: lo scatto di Off è più duro, e la lampada non si spegne per sbaglio.
Preso dal bordo (oltre metà del raggio) l'angolo della mano si legge con atan2 attorno al centro e si somma la differenza fra due letture ridotta fra −180 e 180; proprio sopra il centro l'angolo non vuol dire niente e si legge senza usarlo. Preso dal mezzo, ogni pixel in su o in giù gira di SWEEP/230 gradi. La rotella somma i suoi spostamenti e ogni 40 pixel chiede una tacca (un trackpad ne manda tanti piccoli); frecce, Pagina su e giù, Inizio e Fine mettono la mano sulla tacca giusta e la lasciano quando la manopola ci è arrivata.
La luce della lampada segue la tacca con un ritardo: FILAMENT[0] secondi per accendersi, FILAMENT[1] per calare. La sua temperatura va da WARMTH[0] a WARMTH[1] kelvin con la radice del livello, come le lampadine che si scaldano abbassandole; il colore viene dal corpo nero (l'approssimazione di Tanner Helland) in luce lineare, diviso per il bianco di una lampadina a 4000 K, che è il bianco dell'occhio. Tutti i colori si sommano in luce lineare e diventano pixel con una spalla morbida (1 − e^(−x)) e la gamma; al buio l'occhio si apre un poco.
La manopola è disegnata su un canvas a ogni fotogramma in cui qualcosa si muove. Ognuna delle 48 scanalature è una conca divisa in sei strisce, ognuna con la sua normale: il colore è quello che il riflesso vede, le due luci (Phong) e la stanza. Lo smusso è un gradiente conico di 96 colori calcolati allo stesso modo. Sulla faccia tornita i solchi sono cerchi, e la luce si calcola lungo il solco (Kajiya-Kay): ogni luce disegna una striscia attraverso il centro che non dipende dall'angolo della manopola, quindi resta ferma mentre i segni della tornitura, una texture sopra, girano. Delle due pareti della tacca prende luce quella rivolta verso una luce.
La vernice è opaca: la luce di una lampada vicina cala col coseno e col quadrato della distanza, e diventa un gradiente radiale con dieci colori calcolati; in più una lucentezza satinata verso la lampada. Le ombre sono la manopola proiettata dalle due luci (due cerchi e la fascia fra loro), sfumate con shadowBlur e scure quanto la parte di luce che tolgono. La scala stampata e le scritte prendono la luce del punto in cui stanno, e la cifra del livello passa da un peso 300 a 560 con la lampada.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
LEVEL | script.js | 70 | La luce quando si apre la pagina, in percentuale. |
STEP | script.js | 5 | La percentuale fra due scatti della manopola. |
SWEEP | script.js | 290 | Di quanti gradi gira la manopola da Off al massimo. |
WARMTH | script.js | [1800, 2700] | Il colore della luce in kelvin, quasi spenta e al massimo: abbassandola si scalda. |
DETENT | script.js | 6000 | Con quanta forza ogni tacca tira dentro la manopola (0 = niente scatti). |
FRICTION | script.js | 14 | Quanto in fretta rallenta la manopola lanciata. |
FILAMENT | script.js | [0.09, 0.34] | I secondi che la lampadina impiega ad accendersi e a calare. |
Per l'app di una casa connessa o di un albergo, il configuratore di una lampada, il pannello delle luci di una sala o di un palco, e in generale per un valore che si regola girando e che cambia la luce.
La placca è larga 300 pixel (meno, su uno schermo più stretto) e la manopola 176. Col dito si gira dal bordo in cerchio o dal mezzo in su e in giù, senza far scorrere la pagina: touch-action none sta solo sulla manopola, fuori la pagina scorre. I riflessi che seguono il mouse sul telefono non ci sono.
La manopola va subito alla tacca, senza molla, senza rimbalzo e senza lancio; i riflessi non seguono il mouse e non c'è entrata. La luce cambia solo con una dissolvenza, quella del filamento.
GSAP 3.15.0, Jost (font variabile) 5.3.0.
Compressi con gzip, i tre file della demo pesano 12 KB; le librerie: GSAP 28 KB.
Provata il 6 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.