
L’indicatore a lancetta
Contatori, Fisica, SVG
NuovaGratis
Nello stile minimal: le persone entrate in una piccola sala, contate due volte, con un numero grande e sottile e con le tacche di una volta su una riga sottilissima. Col più la penna traccia una tacca dall’alto, che preme un pixel di troppo e torna su; ogni cinque il tratto di traverso, l’unico colore, passa sulle quattro, che oscillano una dopo l’altra e si stringono in un mazzetto. La riga finisce contro un muretto: a sala piena, un più di troppo spinge tutta la fila contro il muro, che si piega e torna.
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 tally counter</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/roboto-flex@5.3.0/wdth.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="stage">
<!-- the door count of a small room: how many people are in, a minus and a plus, and the same count kept the old
way, as tally marks on a hairline. Every fifth mark is the stroke across the four; the hairline ends at a
thin wall, the size of the room. The marks, the line and the wall are drawn by the script -->
<div class="tally" data-tally>
<div class="tally__head">
<p class="tally__label" id="tally-label">Checked in</p>
<p class="tally__note" id="tally-note" data-note></p>
</div>
<div class="tally__row">
<div class="tally__value" role="spinbutton" tabindex="0" aria-labelledby="tally-label" aria-describedby="tally-note" aria-valuemin="0" aria-valuemax="25" aria-valuenow="7" aria-valuetext="7 people" data-value>
<span class="tally__num" aria-hidden="true" data-num></span>
</div>
<div class="tally__keys">
<button class="tally__btn" type="button" aria-label="One person out" data-less>
<span class="tally__btn-in" aria-hidden="true">
<svg viewBox="0 0 48 48">
<circle class="tally__ring" cx="24" cy="24" r="23.25"/>
<path class="tally__icon" d="M17.5 24h13"/>
</svg>
</span>
</button>
<button class="tally__btn" type="button" aria-label="One person in" data-more data-autoclic>
<span class="tally__btn-in" aria-hidden="true">
<svg viewBox="0 0 48 48">
<circle class="tally__ring" cx="24" cy="24" r="23.25"/>
<path class="tally__icon" d="M17.5 24h13M24 17.5v13"/>
</svg>
</span>
</button>
</div>
</div>
<svg class="tally__field" aria-hidden="true" data-field>
<path class="tally__base" d="" data-base/>
<path class="tally__wall" d="" data-wall/>
<g data-marks></g>
</svg>
<p class="sr" aria-live="polite" data-said></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.
26 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 contatore a tacche» da Animorio e adattala al mio sitoOgni tacca è una line SVG ridisegnata a ogni fotogramma, con un piede fermo sulla riga e una cima: la cima sta alla lunghezza della tacca (poco diversa da una all’altra, con un seno, così sembrano scritte a mano ma ordinate) e all’angolo di oscillazione. Il tratto è disegnato per la frazione p: una tacca nuova va da p 0 a 1 in DRAW secondi con power2.in, dall’alto in basso, come una penna che accelera; il meno la riporta a 0 e la tacca risale. Il tappo tondo di un tratto appena cominciato sarebbe un puntino, quindi la tacca sfuma dentro nel primo 14% del tratto.
La quinta tacca non ha posto suo: i suoi due capi si calcolano dai piedi della prima e della quarta del mazzetto, sei pixel più in fuori, dal 20% all’80% dell’altezza. Mentre si disegna (power3.inOut, SLASH secondi) a ogni fotogramma si guarda dov’è la punta: quando passa il piede di una tacca, quella riceve una spinta sul suo angolo, così le quattro oscillano una dopo l’altra al ritmo del tratto. Tornando indietro col meno la punta ripassa le tacche al contrario e dà una spinta più piccola nell’altro verso.
Ogni tacca ha tre molle smorzate: l’angolo sul piede (SPRING, 320 e 0,3), la pressione dall’alto (900 e 0,34: atterrando la tacca riceve una velocità che la accorcia di circa un pixel e torna) e lo spostamento di lato che stringe il mazzetto chiuso del 16% intorno al suo centro. Il ciclo fa passi di 1/240 di secondo al massimo, un fotogramma lento conta 1/30, e si toglie dal ticker di GSAP quando tutto è fermo.
Il numero è in Roboto Flex, che ha la larghezza da 25 a 151. Ogni cifra sta in una cella larga quanto uno zero, misurato all’avvio e a ogni cambio di misura; cambiando, la cifra vecchia va a wdth 25 e sfuma, la nuova parte da 25 e arriva a 100 con back.out, che la porta un filo oltre e la riposa. Le unità cambiano per prime, le decine 50 millesimi dopo. Con due cifre la cella delle decine nasce larga zero e si apre, spingendo le unità; quando il conto cambia più in fretta di 0,24 secondi (tenendo premuto) lo scambio dura meno della metà, così una cifra si legge sempre. Il colpo di peso alla chiusura di un mazzetto è una variabile CSS, --wg, che GSAP porta da WEIGHT[0] a WEIGHT[1] e indietro con un elastico.
Al massimo il più non cambia niente: una molla di spinta sposta la fila verso il muretto, di più a sinistra e di niente vicino al muro, quindi i mazzetti si avvicinano; ogni tacca riceve la sua spinta con un ritardo pari alla sua distanza diviso 900 pixel al secondo, e quando l’onda arriva il muretto, una curva quadratica, si piega e si colora per mezzo secondo. Un pulsante conta alla pressione (pointerdown) e ripete tenendolo; Invio e Spazio contano nel clic. Il clic da script dell’anteprima della libreria fa un giro intero in una timeline GSAP: su fino alla sala piena, un più di troppo, e giù fino a dove era.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
MAX | script.js | 25 | Quante persone tiene la sala: il numero più alto e le tacche che entrano fino al muretto (da 5 a 40). |
START | script.js | 7 | Quante persone sono dentro quando si apre la pagina. |
DRAW | script.js | 0.16 | Quanto ci mette la penna a tracciare una tacca, in secondi. |
SLASH | script.js | 0.26 | Quanto ci mette il tratto di traverso su cinque, in secondi. |
ROCK | script.js | 1 | Quanto oscillano le tacche quando il tratto le attraversa o la fila va contro il muro (0 = per niente). |
SPRING | script.js | [320, 0.3] | La molla delle tacche: quanto è rigida e quanto è frenata (1 = non oscilla). |
WEIGHT | script.js | [280, 560] | Il peso del numero a riposo e nel colpo quando si chiude un mazzetto da cinque (da 100 a 1000). |
HOLD | script.js | [0.42, 0.18, 0.07] | Tenendo premuto un pulsante: dopo quanto comincia a ripetere, il primo intervallo e il più corto, in secondi. |
WORD | script.js | ['person', 'people'] | La parola per uno e per più di uno, letta da chi usa un lettore di schermo. |
NOTE | script.js | ['Room holds {max}', 'Full house', 'No one is in yet'] | La nota in alto a destra: di solito, a sala piena e premendo il meno a zero; {max} diventa il numero più alto. |
Per contare a mano qualcosa che cresce uno alla volta e ha un tetto: gli ingressi alla porta di un evento o di un laboratorio, i coperti di una sera, i posti di una visita guidata, le ripetizioni di un esercizio in un’app. Le tacche dicono a colpo d’occhio quanto manca al muro, anche senza leggere il numero.
Il numero si rimpicciolisce con lo schermo (al massimo un quarto della sua larghezza) e i mazzetti si distribuiscono sulla larghezza che c’è, fino al muretto: a 390 pixel cinque mazzetti stanno in fila senza sforare, e con tanti mazzetti si stringono un po’. Il dito fa come il mouse: un tocco su un pulsante conta uno e lo fa cedere, tenuto premuto ripete sempre più in fretta. Il tocco lungo non apre menu e due tocchi veloci non ingrandiscono la pagina.
Niente penna, oscillazioni, spinte o muri che si piegano: la tacca nuova compare in dissolvenza già intera, quella tolta si dissolve, il mazzetto è già stretto, le cifre cambiano in dissolvenza senza stringersi e la nota cambia con una dissolvenza. Pulsanti e tasti funzionano come sempre.
GSAP 3.15.0, Roboto Flex (font variabile) 5.3.0.
Compressi con gzip, i tre file della demo pesano 12 KB; le librerie: GSAP 28 KB.
Provata il 18 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.