
Il pulsante da far scorrere
Pulsanti, Fisica, Transizioni
NuovaGratis
Il pulsante per iscriversi a un’uscita in bici, Join the ride, fatto come una bandierina di stoffa rossa a coda di rondine su un’asta corta. La stoffa è simulata davvero, punto per punto, e la scritta è stampata sopra: a riposo una brezza la fa ondeggiare piano, col mouse sopra il vento rinforza dove sta il puntatore, premuta si raccoglie in pieghe verso l’asta. Al clic una grinza corre lungo la bandiera fino alla punta, e dietro di lei la bandiera si è girata: l’altro lato è verde e dice You’re in con una spunta. Poi si rigira.
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 flag button</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/saira@5.3.0/wght-italic.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="stage">
<!-- the flag button: the sign-up of a club ride, made as a swallowtail pennant of cloth on a short pole. The cloth
is simulated (a grid of points in 3D, held by links, pushed by a breeze) and drawn on a canvas with the words
printed on it and the light on its folds. The pointer brings the wind up, a press gathers the cloth to the
pole, and the click sends a big wave down it that turns the flag over to You're in -->
<div class="flag" data-flag>
<div class="flag__spot" data-spot>
<canvas class="flag__shadow" aria-hidden="true" data-shadow></canvas>
<canvas class="flag__cloth" aria-hidden="true" data-cloth></canvas>
<button class="flag__btn" type="button" data-btn data-autoclic><span class="sr" data-name>Join the ride</span></button>
</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.
19 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 pulsante a bandiera» da Animorio e adattala al mio sitoLa bandiera è una griglia di 33 per 7 punti nello spazio: la colonna sull’asta è cucita e non si muove, gli altri si spostano a ogni passo della loro velocità (la distanza da dove erano prima, smorzata dall’aria) più le forze. Poi, sei volte per passo, i legami riportano ogni coppia alla sua distanza: lungo e giù (la stoffa non si allunga), le due diagonali (non si deforma di sbieco) e, più morbidi, un punto sì e uno no (le pieghe restano tonde). Il passo è fisso, 1/120 di secondo, e il tempo di un fotogramma non conta mai più di 1/30. Le forze: una gravità leggera, il vento che spinge via dall’asta e due treni di raffiche, sin(2π(1,25u − 0,82t)) e uno più corto e veloce, che spingono dentro e fuori dalla pagina, più forti verso la punta: così le onde corrono dall’asta alla coda.
I due lati della bandiera si dipingono una volta sola su due canvas fuori schermo, a due o tre volte la risoluzione: il colore, la trama (fili sottili nei due versi e un po’ di grana), gli orli più scuri con l’impuntura tratteggiata, la bici o la spunta e le lettere una per una, con la loro crenatura. A ogni fotogramma la stoffa si disegna triangolo per triangolo: per ogni triangolo si ricava dai suoi tre punti l’affine che porta il triangolo piatto della figura dov’è ora, si ritaglia il triangolo (un pelo più grande, così fra i vicini non resta una fessura) e si copia solo il pezzo di figura che gli serve. I triangoli più lontani vanno per primi, e tutta la stoffa è ritagliata una volta sul suo bordo.
La normale di ogni punto è il prodotto vettoriale fra i due vicini lungo e i due vicini giù. Confrontata con una lampada in alto a sinistra dà quanto quel punto è più scuro o più chiaro che se la stoffa fosse piatta, più un riflesso satinato dove la piega guarda fra la lampada e l’occhio. I valori vanno in due immagini di 33 per 7 pixel, uno per punto, che si stirano morbide su tutta la figura con source-atop prima di consegnarla ai triangoli: la luce viaggia con la stoffa e le pieghe hanno il loro lato chiaro e quello scuro. L’ombra sulla pagina è il contorno della bandiera su un secondo canvas, spostato in proporzione all’altezza di ogni punto e sfumato dal CSS.
Col puntatore sopra il vento cresce di GUST, le raffiche si fanno più fitte in una campana intorno al puntatore e la stoffa viene spinta via dal suo lato. Premendo, ogni punto è tirato verso un’asta più vicina di GATHER e ogni quarta colonna è spinta fuori dalla pagina e le altre dentro: la stoffa si raccoglie in pieghe regolari, e uno smorzamento in più la tiene ferma. Al clic una folata la riapre e parte la grinza: i punti vicini a lei sono tirati con una molla rigida verso un dorso a campana alto 19 pixel che corre dall’asta alla punta in SNAP secondi, dietro di lei la stoffa è stirata piatta. I due lati si scambiano sul fianco lontano del dorso, dove la stoffa scende verso la pagina, in ombra e quasi di taglio, lungo una linea un po’ inclinata con un filo di luce e la sua ombra.
Dopo i legami, lungo ogni fila ogni punto resta almeno un quinto di maglia più a destra del precedente, e lungo ogni colonna un terzo di maglia più in basso: la stoffa può piegarsi dentro e fuori dalla pagina quanto vuole, ma non ripiegarsi su sé stessa davanti agli occhi, e la coda non cade mai sopra la scritta. Invio, Spazio, un lettore di schermo e l’anteprima della libreria fanno lo stesso giro: senza una mano la stoffa si raccoglie a metà da sola e poi parte la grinza. Quando la brezza è a zero e niente si muove più, la bandiera non si ridisegna; fuori dallo schermo si ferma.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
BREEZE | script.js | 1 | La brezza a riposo: 0 la bandiera sta quasi ferma, 2 un vento fresco. |
GUST | script.js | 2.6 | Quanto rinforza il vento col puntatore sopra la bandiera (1 = niente). |
RIPPLE | script.js | 1 | Quanto sono grandi le onde che corrono lungo la stoffa. |
GATHER | script.js | 0.45 | Quanto si raccoglie la stoffa verso l’asta mentre è premuta, come parte della sua lunghezza. |
SNAP | script.js | 0.75 | I secondi che la grinza del clic impiega a correre dall’asta alla punta. |
HOLD | script.js | 1.6 | I secondi in cui la bandiera dice You’re in prima di rigirarsi. |
NOTCH | script.js | 0.12 | Quanto è profondo il taglio a coda di rondine in fondo alla bandiera, come parte della sua lunghezza (0 = bandiera rettangolare). |
DONE_LABEL | script.js | You’re in | Le parole stampate sull’altro lato della bandiera. |
Per iscriversi a qualcosa che si fa all’aperto e insieme: l’uscita del sabato di un club di ciclisti, una gran fondo, una corsa podistica, una regata, una gita. Sta bene anche per chi organizza eventi o per un negozio di bici. I colori dei due lati e le parole si cambiano nel CSS e nello script.
La bandiera è larga 284 pixel, o lo schermo meno 48, e alta 60; la stoffa e la scritta si rifanno sulla misura vera. Il dito che la tocca è insieme il vento e la mano: la stoffa ondeggia e si raccoglie, e lasciandola parte la grinza. Su e giù la pagina scorre ancora (touch-action pan-y); il menu del tocco lungo è spento.
La stoffa sta ferma in una piega calma, con la sua luce, e non si ridisegna. Niente vento né raccolta: premendo la bandiera si scurisce appena. Al clic il lato rosso si spegne nell’ombra della stoffa e da lì viene su il lato verde, senza che niente si muova, e lo stesso al ritorno.
GSAP 3.15.0, Saira (font variabile) 5.3.0.
Compressi con gzip, i tre file della demo pesano 15 KB; le librerie: GSAP 28 KB.
Provata il 12 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.