Vai al contenuto
animorio
EN
Tutti i componenti

Il barattolo delle biglie

Contatori, Fisica, SVGGSAP, CanvasImpegnativaPeso compresso: Demo 19 KBGSAP 28 KBGratisScarica lo zip

Un contatore di kudos: un barattolo di vetro con le biglie occhio di gatto e un cartellino di carta legato al collo con lo spago, che porta il numero. Give kudos lascia cadere una biglia da sopra il bordo: entra, rimbalza sul vetro e sulle altre, rotola girando le sue alette e si posa, e quando tocca il numero sul cartellino scorre in su. Tenuto premuto versa una biglia dopo l’altra finché il barattolo è pieno; il meno pizzica la biglia in cima e la porta fuori. Il barattolo si trascina di lato e le biglie sbattono contro il vetro.

Il codice

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 marble jar</title>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/bricolage-grotesque@5.3.0/index.css">
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <main class="stage">
    <!-- the marble jar: a kudos counter, a glass jar of cat's eye marbles with a paper tag tied round its neck. Give
         kudos drops a marble in from above: it falls into the jar, bounces off the glass and the other marbles, rolls
         and settles, and the number on the tag rolls on. Held, the button pours a stream until the jar is full; the
         minus button lifts the top marble out. The jar can be dragged sideways to rattle them. The glass is drawn by
         the script in two layers, behind and in front of the marbles, which are a canvas -->
    <div class="kj" data-kj>
      <div class="kj__scene" role="button" tabindex="0"
           aria-label="The kudos jar. Drag it sideways, or press Enter, to rattle the marbles" data-scene>
        <div class="kj__move" data-move>
          <svg class="kj__layer" viewBox="-170 -380 340 396" aria-hidden="true" data-art="back"></svg>
        </div>
        <canvas class="kj__layer kj__marbles" aria-hidden="true" data-canvas></canvas>
        <div class="kj__move" data-move>
          <span class="kj__edge" data-edge></span>
          <span class="kj__edge" data-edge></span>
          <svg class="kj__layer" viewBox="-170 -380 340 396" aria-hidden="true" data-art="front"></svg>
          <div class="kj__tag" aria-hidden="true" data-tag>
            <svg class="kj__string" viewBox="0 0 64 26" aria-hidden="true">
              <path class="kj__string-back" d="M32 0C30.5 8 29.4 16 30 25.5"/>
              <path class="kj__string-front" d="M32 0C33.6 8 34.8 16 34 25.5"/>
            </svg>
            <div class="kj__card">
              <span class="kj__hole"></span>
              <span class="kj__kicker">Kudos</span>
              <span class="kj__count" data-count></span>
              <span class="kj__for" data-for>for Marta</span>
            </div>
          </div>
        </div>
      </div>

      <div class="kj__actions">
        <button class="kj__btn kj__btn--less" type="button" aria-label="Take a kudos back" data-less>
          <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M6.5 12h11"/></svg>
        </button>
        <button class="kj__btn kj__btn--more" type="button" aria-describedby="kj-hint" data-more data-autoclic>
          <span class="kj__word" data-word>Give kudos</span>
          <svg class="kj__plus" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 6.5v11M6.5 12h11"/></svg>
        </button>
      </div>
      <p class="sr" id="kj-hint">Hold to pour.</p>
      <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>

Playground

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.

47 valori da cambiare

Oppure chiedila a Claude Code

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 barattolo delle biglie» da Animorio e adattala al mio sito

Cosa fa

Su un fondo bianco un barattolo di vetro chiaro, appena verde, con l’orlo arrotolato e il fondo spesso, posato sulla sua ombra morbida; dentro dodici biglie occhio di gatto, vetro trasparente con dentro le alette colorate (pomodoro, cobalto, giada, calendula, viola, rosa), un riflesso in alto a sinistra, il bordo più scuro e una luce colorata sotto di sé. Intorno al collo due giri di spago con un nodo, e appeso al nodo un cartellino di carta da pacchi col foro rinforzato: KUDOS, il numero grande e for Marta. Sotto, un meno tondo e una pillola scura Give kudos +, alte 58 pixel. Un clic su Give kudos fa entrare una biglia dall’alto: scende nella bocca del barattolo passando dietro l’orlo, urta le biglie che ci sono, rimbalza, rotola facendo girare le alette mentre il riflesso resta fermo, e si posa; nell’istante in cui tocca, il numero sul cartellino scorre in su, la cifra vecchia esce in alto e la nuova entra da sotto. Tenendo premuto il pulsante (o Invio) le biglie arrivano una ogni 120 millisecondi finché il barattolo è pieno, e allora il pulsante si spegne e dice Jar’s full. Il meno prende la biglia più in alto: un piccolo strappo, poi sale dritta fuori dalla bocca e svanisce, e le altre si riassestano. Il barattolo si prende col mouse o col dito e si trascina di lato: il vetro scivola, le pareti spingono le biglie che sbattono e si rimescolano, il cartellino oscilla sullo spago, e lasciato andare torna al suo posto con un piccolo rimbalzo; un tocco senza trascinare è un colpetto sul vetro. Da tastiera il barattolo si scuote con Invio o Spazio e con le frecce.

Come funziona

Cerchi con la gravità

Ogni biglia è un cerchio con posizione, velocità, angolo e velocità di rotazione, in unità del disegno (poco più di un pixel). Il mondo avanza sul ticker di GSAP a passi fissi di 1/480 di secondo (un fotogramma lento conta al massimo per 1/30): la gravità (GRAVITY) dà velocità, poi si trovano i contatti fra le biglie e con l’interno del barattolo, una scatola con gli angoli in basso arrotondati e aperta in alto.

Gli urti come impulsi

Ogni contatto si risolve con un impulso lungo la linea che unisce i centri: non può tirare, toglie la velocità con cui due biglie si avvicinano e ne restituisce BOUNCE (BOUNCE_GLASS col vetro), ma solo nell’urto, cioè quando il contatto è nuovo e le biglie si vengono incontro a più di 45 unità al secondo: un contatto che c’era già al passo prima è un appoggio e non rimbalza mai, così le biglie si posano invece di saltellare. Di traverso c’è l’attrito, limitato da FRICTION volte la spinta: agisce sul punto di contatto e fa girare le biglie, che così rotolano invece di scivolare. Le pareti e il fondo si muovono col barattolo, e la loro velocità entra nel conto: è così che le biglie sentono il barattolo scosso.

Un mucchio che sta fermo

Le spinte di ogni contatto si ricordano da un passo all’altro e si riusano come prima stima (warm starting): un mucchio di quaranta biglie si regge senza tremare. Dopo le spinte, quello che resta sovrapposto si separa spostando le biglie, senza toccare le velocità. Quando ogni biglia è stata quasi ferma per un terzo di secondo il mondo si addormenta: niente si ridisegna finché non arriva una biglia, se ne toglie una o si scuote il barattolo.

Le biglie dipinte una volta

Ogni tipo di biglia è tre immagini disegnate una volta sola per la densità dello schermo: il vetro tinto, le alette (pale a punta attorcigliate, scure al centro e chiare in punta, con qualche bollicina) e sopra il bordo scuro, la luce raccolta in basso a destra e il riflesso in alto a sinistra. A ogni fotogramma si posano con drawImage, e solo le alette girano con la biglia. Prima, sul fondo, l’ombra di ognuna e una luce del suo colore.

Il vetro davanti e dietro

Il barattolo è SVG in due strati: dietro la tela l’ombra sul foglio, il vetro di fondo, la metà lontana dell’orlo e il pavimento; davanti il fondo spesso, i fianchi visti di taglio, i riflessi, la metà vicina dell’orlo e lo spago, con le torsioni disegnate a trattini obliqui. Una biglia che cade attraversa la bocca passando davanti all’orlo lontano e dietro a quello vicino. Il barattolo trascinato segue la mano su una molla, e il cartellino è un pendolo che ne sente l’accelerazione.

Il numero quando la biglia arriva

Il conteggio vero cambia subito al clic (il pulsante, il limite, la frase letta), ma il cartellino conta le biglie arrivate: al primo contatto di una biglia nuova la cifra che cambia scorre, la vecchia esce in alto e la nuova entra con back.out. Il numero di biglie che il barattolo tiene si ricava dalla loro misura, così nemmeno nel Playground il mucchio passa mai l’orlo.

Valori da cambiare

NomeFileDi partenzaCosa cambia
NAMEscript.js'Marta'Chi riceve i kudos: si legge sul cartellino e nella frase detta a voce.
STARTscript.js12Le biglie già nel barattolo quando si apre la pagina, posate al loro posto.
MAXscript.js40Quante biglie tiene il barattolo; con biglie più grosse ne tiene meno, e non trabocca mai.
HOLDscript.js[0.32, 0.12]Tenendo premuto il pulsante: dopo quanto comincia a versare, e ogni quanto arriva una biglia, in secondi.
GRAVITYscript.js2600La gravità, in unità del disegno al secondo quadrato: più alta, le biglie cadono e si posano più in fretta.
BOUNCEscript.js0.42Quanto rimbalza una biglia su un’altra (0 = niente, 1 = tutto).
BOUNCE_GLASSscript.js0.33Quanto rimbalza una biglia sul vetro del barattolo.
FRICTIONscript.js0.3L’attrito fra vetro e vetro: è quello che fa rotolare le biglie invece di farle scivolare.
ROLLINGscript.js1.4Quanto in fretta una biglia che rotola perde il suo giro, al secondo.
SIZEscript.js[16, 18.4]Il raggio delle biglie, la più piccola e la più grande, in unità del disegno (da 10 a 21).
SHAKEscript.js32Fin dove si può trascinare il barattolo da ciascun lato.

Provali nel Playground

Quando usarla

Per contare qualcosa che si accumula e fa piacere vedere crescere: i kudos o i ringraziamenti in un team, le stelle date a un progetto, i punti di una raccolta, le mance, i giorni di fila di un’abitudine, i voti di una piccola classifica. Sta bene nella scheda di una persona, in una bacheca interna, in un’app per le squadre o per la scuola, dovunque un numero che sale debba sembrare un premio e non una statistica.

Sul telefono

A 390 pixel il barattolo prende tutta la larghezza e i pulsanti restano alti 58; niente sfora di lato e la tela usa la densità dello schermo, quindi le biglie restano nitide. Il dito fa come il mouse: un tocco dà una biglia, tenuto premuto versa, il barattolo si trascina di lato col dito (lo scorrimento in verticale della pagina resta libero) e un tocco sul vetro è un colpetto. Il tocco lungo non apre menu e due tocchi veloci non ingrandiscono la pagina.

Con il movimento ridotto

Niente cadute, rimbalzi, rotolamenti o scosse: la biglia nuova compare già posata dove sarebbe arrivata (il mondo fa i suoi passi tutti insieme, senza disegnarli) e sfuma dentro; quella tolta sfuma dove stava e le altre sono già al loro posto. Il numero cambia con una dissolvenza invece di scorrere, il cartellino non oscilla e il barattolo non si trascina.

Trappole

  • Il mucchio pieno non si addormentava mai: le biglie in fondo avevano velocità fra 50 e 110 unità al secondo pur restando ferme, e si ridisegnava per sempre. Le spinte riusate dal passo prima (warm starting) si applicavano mentre i contatti venivano ancora creati, e i contatti creati dopo misuravano il rimbalzo su velocità già cambiate da quelle spinte: biglie ferme in fondo al mucchio rimbalzavano. Ora prima si creano tutti i contatti e si decide chi rimbalza, poi si applicano le spinte: il barattolo pieno si ferma mezzo secondo dopo l’ultima biglia.
  • Scuotendo forte il barattolo le biglie volavano sopra l’orlo: dentro le pareti le tengono in fila anche più su (salgono all’infinito), ma sopra il barattolo sembravano galleggiare fuori. La velocità verso l’alto di una biglia ha un tetto, quella che le basta per arrivare appena sotto l’orlo.
  • A quaranta biglie il mucchio superava l’orlo: un mucchio di cerchi buttati alla rinfusa riempie circa sette decimi dello spazio, non i nove di quelli ordinati. Il barattolo è più alto, le biglie appena più piccole, e il numero massimo si ricava dalla misura delle biglie, così nel Playground le biglie grandi non traboccano.
  • Nel Playground, con rimbalzo e gravità al massimo insieme, il mucchio non si fermava più: in fondo a una pila alta il risolutore lascia velocità di avvicinamento che crescono con la gravità, e sopra la soglia diventavano rimbalzi che ridavano energia. Ora rimbalza solo un contatto nuovo; uno che c’era già al passo prima è un appoggio.
  • Senza attrito e senza perdita di giro, una biglia che girava girava per sempre (il giro non era legato a niente) e il mondo non si addormentava: il giro perde sempre un poco, nell’aria, e la soglia sotto cui una biglia è ferma cresce con la gravità.
  • Con biglie più grandi degli angoli arrotondati del fondo il raggio dell’angolo veniva negativo e le biglie uscivano dal vetro: l’angolo ha un raggio minimo e le biglie un raggio massimo di 21.
  • Una biglia che compariva in cima alla tela, sul bianco, nasceva dal nulla: la parte alta della tela sfuma con una maschera, e le biglie ci entrano da fuori.
  • Il cartellino girava al clic, mentre la biglia era ancora in aria: ora conta le biglie arrivate, al primo contatto. Il pulsante pieno, il meno e la frase letta seguono invece il conteggio vero, subito.
  • Un clic dopo la pressione contava due biglie (pointerdown versa, poi arriva click): la pressione segna che il clic è già stato contato e il segno si cancella al fotogramma dopo; il clic dell’anteprima automatica e dei lettori di schermo, che arriva senza pressione, dà una biglia.
  • L’anello di focus del barattolo non si vedeva: un’ombra interna si disegna sotto i figli, e gli strati del vetro la coprivano. È uno pseudo-elemento sopra tutto.
  • Le due metà dell’orlo, con sfumature diverse, si incontravano ai lati in due cunei bianchi: dove si toccano hanno lo stesso vetro, e i capi sono due mezzi tondi.

Librerie

GSAP 3.15.0, Bricolage Grotesque (font variabile) 5.3.0.

Compressi con gzip, i tre file della demo pesano 19 KB; le librerie: GSAP 28 KB.

Collaudo

Provata il 7 ottobre 2026

  • Computer: Fatto
  • Telefono: Fatto
  • Movimento ridotto: Fatto
  • Safari su iPhone: Da fare

Licenza d’uso

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.

Tutti i componenti