
Il pulsante che copia
Pulsanti, Testo, SVG, Fisica
NuovaGratis
Nello stile minimal: la manopola del peso del carattere nel pannello di un'app di grafica, un cerchio di tacche sottili e un indice vermiglio. Girandola, la parola sopra cambia peso dal vivo da 100 a 900 e il numero accanto, in cifre tabellari, non balla mai; a ogni centinaio la manopola si ferma un attimo e scatta, e lanciata continua per inerzia fino a posarsi su una tacca. Le tacche sono spesse quanto le aste del carattere a quel peso, misurate sul carattere stesso.
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 weight knob</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/fraunces@5.3.0/opsz.css">
<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 weight knob of a design app's type panel: a ring of hairline ticks and an index. Turned round, flung, with
the wheel or with the keys, it sets the weight of the word above it live from 100 to 900, and clicks at every
hundred. The ticks of the ring are as thick as the font's own stems at their weight. The knob is drawn by the
script -->
<section class="weight" aria-label="Font weight" data-weight data-autoclic>
<div class="specimen" aria-hidden="true" data-specimen>
<span class="guide" data-guide="x"></span>
<span class="guide" data-guide="base"></span>
<p class="specimen__line" data-line><span class="specimen__word" data-word>Handgloves</span><span class="specimen__probe" data-probe></span></p>
</div>
<div class="control">
<div class="knob" role="slider" tabindex="0" aria-labelledby="weight-label" aria-valuemin="100" aria-valuemax="900" aria-valuenow="400" aria-valuetext="400, Regular" data-knob>
<svg class="knob__svg" viewBox="-100 -100 200 200" aria-hidden="true" data-svg></svg>
</div>
<div class="read" aria-hidden="true">
<p class="read__label" id="weight-label">Weight</p>
<p class="read__value" data-value>400</p>
<p class="read__name"><span class="read__roll" data-name>Regular</span></p>
</div>
</div>
<p class="sr" 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.
21 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 del peso» da Animorio e adattala al mio sitoAppena Fraunces è arrivato, lo script disegna la lettera l a 200 pixel su una tela nascosta, a ogni centinaio da 100 a 900, e legge una riga di pixel a metà dell'asta: sommando la copertura di ogni pixel, anche quelli coperti a metà, trova lo spessore dell'asta in em. Da quelle nove misure, interpolate in linea, nasce lo spessore di ogni tacca della scala e quello dell'indice, che cambia dal vivo col peso. Se il carattere non disegna (le misure non crescono col peso) resta una stima.
Sotto il dito si misura l'angolo con atan2 attorno al centro e si somma la differenza ridotta fra −180 e 180; ogni grado vale 800 / SWEEP unità di peso. La manopola non segue la mano direttamente: è tirata da una molla rigida, smorzata sulla velocità della mano, e ogni centinaio è un pozzo largo 16 unità con una forza −DETENT · s · (1 − (s/16)²)². Arrivando la manopola viene risucchiata, il numero si ferma sul 500, e riparte solo quando la mano è abbastanza avanti: lo scatto vero, senza nessuna animazione scritta a mano. Il calcolo va a passi di 2 millesimi sul ticker di GSAP, col passo limitato a 1/30 di secondo.
Lasciata più veloce di 250 unità al secondo, si calcola subito dove l'attrito FRICTION la fermerebbe (v + w / FRICTION) e il centinaio più vicino diventa il traguardo. La corsa è un'esponenziale v(t) = T + (v₀ − T)·e^(−kt) con k = w / (T − v₀): parte esattamente alla velocità della mano e finisce esattamente sulla tacca. Negli ultimi 12 unità la prende una molla un po' elastica (SETTLE), che la porta un pixel oltre e indietro. Lasciata piano, la molla la posa sulla tacca più vicina, ogni STEP unità.
A ogni fotogramma si guarda quali centinaia la manopola ha attraversato fra la posizione di prima e quella di adesso (anche cinque in un fotogramma durante un lancio), e ognuno scatta una volta sola finché la manopola non se ne allontana di 8 unità. Lo scatto allunga la tacca di 6 unità e la lascia tornare con elastic.out, la accende di vermiglio e la fa sfumare, e dà un colpetto all'indice. Il nome del peso è quello più vicino, con un margine di 4 unità oltre la metà (così sul 650 non trema), rotola nel verso della rotazione ed è chiaro solo quando la manopola sta proprio sul centinaio.
La parola prende font-weight col decimale a ogni fotogramma, e la sua dimensione è scelta perché ci stia anche a 900, misurandola a 900 e riportandola; la linea di base si legge dal fondo di una scatola vuota allineata alla base, l'altezza della x da measureText sulla tela. Tutto si ricalcola al resize. Un clic da script (l'anteprima della libreria) fa partire un giro intero in una timeline GSAP: un giro lento oltre il 500 e il 600, un lancio fino a Black, una lunga rotazione fino a Light, e il ritorno a Regular.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
WORD | script.js | 'Handgloves' | La parola scritta nel peso che si sceglie (al massimo 18 lettere). |
START | script.js | 400 | Il peso all'apertura della pagina, da 100 a 900. |
STEP | script.js | 25 | Ogni quante unità di peso c'è una tacca su cui la manopola lasciata si posa. |
SWEEP | script.js | 300 | Di quanti gradi gira la manopola da 100 a 900. |
DETENT | script.js | 3000 | Quanto forte ogni centinaio trattiene la manopola mentre la si gira oltre: a 0 niente scatti. |
FRICTION | script.js | 4.5 | Quanto presto rallenta una manopola lanciata: più basso, più lontano arriva. |
SETTLE | script.js | [700, 0.55] | La molla che posa la manopola sulla sua tacca: quanto è rigida e quanto è frenata (sotto 0,5 oltrepassa di più). |
Per il pannello dei caratteri di un'app di grafica, il sito di una fonderia di caratteri che fa provare i suoi caratteri variabili, un configuratore, l'editor di un sito o di una newsletter, e in generale per ogni valore da 100 a 900 con dei punti fermi: si cambiano WORD, i nomi e i limiti, e diventa la manopola di qualunque asse.
Sotto i 560 pixel la manopola è larga 150 e la parola si rimpicciolisce da sola perché ci stia anche a 900 (circa 50 pixel a 390). Il dito la gira senza far scorrere la pagina (touch-action none sulla manopola), con gli stessi scatti e lo stesso lancio; il tocco al posto dell'hover è la pressione, che stringe appena il disco e ne schiarisce il bordo.
Niente molle né lanci: la manopola segue il dito senza scatti e lasciata va subito sulla tacca, i tasti e la rotella la portano direttamente al valore, il nome cambia senza rotolare e la tacca del centinaio si accende e sfuma senza allungarsi. L'entrata è una dissolvenza, già a Regular.
GSAP 3.15.0, Fraunces (font variabile, coi pesi da 100 a 900 e la dimensione ottica) 5.3.0, Inter Tight (font variabile) 5.3.0.
Compressi con gzip, i tre file della demo pesano 10 KB; le librerie: GSAP 28 KB.
Provata il 16 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.