
L’indicatore a lancetta
Contatori, Fisica, SVG
NuovaGratis
Gli inchiostri di un piccolo produttore, ognuno nella sua boccetta di vetro, su una mensola che si scorre: quando la mensola parte l’inchiostro resta indietro e sale sul vetro, quando frena corre dall’altra parte, e quando si ferma dondola finché non torna piatto. Dove è passata l’onda il vetro resta macchiato e la macchia cola giù a righe. Ogni boccetta dondola col suo ritmo: le larghe piano, le strette in fretta.
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 sloshing inks</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/alegreya@5.3.0/index.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/instrument-sans@5.3.0/index.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="stage">
<!-- the inks of a small ink maker, each in its glass bottle on a shelf that moves. The ink feels the shelf: it
is left behind when the shelf sets off, runs up the glass when it brakes, rocks when it stops, and the glass
stays stained where the wave went until the film drains back down. The bottles are drawn by the script -->
<section class="shelf" role="region" aria-roledescription="carousel" aria-labelledby="shelf-title" data-shelf>
<header class="shelf__head">
<h2 class="shelf__title" id="shelf-title">Fountain pen inks</h2>
<div class="shelf__arrows">
<button class="arrow" type="button" aria-label="Previous inks" aria-controls="shelf-track" data-prev>
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M14 6.5 8.5 12l5.5 5.5"/></svg>
</button>
<button class="arrow" type="button" aria-label="Next inks" aria-controls="shelf-track" data-next data-autoclic>
<svg viewBox="0 0 24 24" aria-hidden="true">
<path class="arrow__step" d="M10 6.5 15.5 12 10 17.5"/>
<path class="arrow__back" d="M18.5 12H9M13 7.5 8.5 12l4.5 4.5M5.5 6.5v11"/>
</svg>
</button>
</div>
</header>
<div class="shelf__view" tabindex="0" aria-describedby="shelf-help" data-view>
<div class="shelf__track" id="shelf-track" data-track></div>
</div>
<p class="sr" id="shelf-help">Arrow keys to move along the inks, Home and End for the first and the last.</p>
<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.
53 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 «Gli inchiostri che sciabordano» da Animorio e adattala al mio sitoLa mensola è un numero solo, x, i pixel che ha fatto. Una molla la porta alla fermata scelta, a = ω²·(meta − x) − 2ζω·v, con ω e ζ da GLIDE; la rigidità si divide per la radice della distanza in schede, così la corsa lunga che torna all’inizio parte con la stessa spinta di un passo solo. Le fermate sono le schede allineate al titolo, l’ultima con l’ultima scheda contro il bordo destro. Quella a, che la molla calcola a ogni passo, è l’accelerazione delle boccette (al contrario), già liscia: niente differenze fra due fotogrammi.
La superficie dell’inchiostro è la somma dei primi tre modi che una spinta di lato può accendere in una vaschetta larga W: z(u) = Σ ηₙ·cos(nπu) per n = 1, 3, 5, con u da 0 a 1 fra le due pareti. Ogni ηₙ è una molla con la pulsazione vera di un liquido profondo h, ωₙ² = g·k·tanh(k·h) con k = nπ/W, e la spinta la sposta verso la quota che avrebbe sotto una spinta costante, (a/g)·4W/(n²π²): sommati, sono la superficie inclinata di a/g. La g è scelta perché una boccetta larga 100 e profonda 60 dondoli WAVE[0] volte al secondo; ζ cresce con la radice di n, così le increspature si spengono prima dell’onda grande.
La spinta è tenuta morbidamente sotto due g con una tangente iperbolica, perché un lancio della mano darebbe quattro o cinque g e l’inchiostro salirebbe dritto al tappo. Un’onda grande si affila come al secondo ordine di un’onda stazionaria, KAPPA·η₁²/W·cos(2πu), più alta in cima e piatta in fondo; e non sale oltre la spalla della boccetta: la quota si schiaccia con tanh vicino al soffitto e al fondo.
Ogni boccetta è un SVG col suo contorno e il suo interno. L’inchiostro è un tracciato rifatto a ogni fotogramma: tutto quello che sta sotto il bordo lontano della superficie, tagliato dall’interno con un clipPath. La superficie vista un poco dall’alto è la fascia fra il bordo lontano e quello vicino, un’ellisse nelle boccette tonde e una fascia costante in quelle quadrate, con un filo di luce sul bordo vicino. Lo stesso tracciato, tagliato dal contorno esterno e più chiaro, colora il vetro spesso delle pareti; i riflessi bianchi restano fermi sopra, come una lampada.
Per ognuno dei 33 punti della superficie lo script ricorda il punto più alto a cui è arrivato il bordo lontano: lì il vetro è bagnato. La linea bagnata scende a 26/FILM unità al secondo, ogni punto col suo passo un po’ diverso (due seni lenti), così la macchia cola a righe morbide; il bordo si disegna smussato su cinque punti, col colore dell’inchiostro al 20 per cento. Quando la superficie risale la linea si rialza con lei.
Col mouse o col dito la mensola insegue il puntatore su una molla rigida, così anche lì la spinta è liscia, e oltre i capi su un elastico; lasciata prende la velocità degli ultimi 90 millisecondi, guarda dove arriverebbe in THROW secondi e si aggancia alla fermata più vicina. La rotella orizzontale fa lo stesso. Un tocco su una boccetta intera le dà una spinta su una molla del ripiano, e la sua accelerazione si somma a quella della mensola. Sul telefono la mensola arriva ai bordi dello schermo con la prima scheda allineata al titolo. Quando tutto è fermo il ciclo si spegne.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
SLOSH | script.js | 0.3 | Quanto l’inchiostro sente la mensola che si muove: 0 per niente. |
WAVE | script.js | [1.5, 0.15] | L’inchiostro in una boccetta larga circa 110 pixel: quante volte al secondo dondola e quanto è frenato. Le boccette più larghe dondolano più piano, le più strette più in fretta. |
FILM | script.js | 0.9 | I secondi che la macchia d’inchiostro lasciata sul vetro impiega a colare giù. |
GLIDE | script.js | [7, 0.85] | La molla della mensola: quanto in fretta arriva a una scheda e quanto è frenata. |
THROW | script.js | 0.24 | I secondi che una mensola lanciata corre ancora prima di essere presa (quanto va lontano un lancio). |
INKS | script.js | [['Kingfisher', 'Teal blue', '50 ml', '€16', '#0f7f8a', 'pot'], …] | Gli inchiostri: nome, colore, misura, prezzo, il colore dell’inchiostro e la boccetta (pot, square, flask, cone, tall, classic). |
--card | style.css | 280px | La larghezza di una scheda (264 sul telefono). |
--gap | style.css | 16px | Lo spazio fra due schede (12 sul telefono). |
Per i prodotti di un negozio che vende cose liquide in vetro: inchiostri, profumi, oli, sciroppi, salse, cosmetici, la carta dei cocktail di un bar. Dove il prodotto si guarda prima di comprarlo e un po’ di vita nella fila fa venire voglia di scorrerla.
Le schede scendono a 264 pixel e la mensola arriva ai bordi dello schermo: la prima scheda si allinea al titolo, a 16 pixel dal bordo, e della seconda si vedono circa 90 pixel. Il dito trascina e lancia la mensola (su e giù scorre la pagina), l’inchiostro sciaborda come col mouse, i pulsanti sono di 44 pixel e un tocco su una scheda tagliata la porta dentro.
La mensola non corre: si dissolve e ricompare già alla fermata nuova, e l’inchiostro resta piatto, senza onde né macchie; un tocco su una boccetta non la sposta. Trascinando, la mensola segue la mano, e lasciata si dissolve sulla fermata più vicina. Il componente entra solo in dissolvenza.
GSAP 3.15.0, Alegreya (font variabile) 5.3.0, Instrument Sans (font variabile) 5.3.0.
Compressi con gzip, i tre file della demo pesano 13 KB; le librerie: GSAP 28 KB.
Provata il 7 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.