
Il pulsante da far scorrere
Pulsanti, Fisica, Transizioni
NuovaGratis
L’installazione di un’app come un veliero dentro una bottiglia di vetro distesa: lo scafo è già dentro, con gli alberi abbattuti sul ponte, e mentre i file vengono copiati un filo che esce dal collo li tira su uno dopo l’altro, ognuno su una cerniera a molla. Poi le vele si srotolano e si gonfiano di vento, le bandierine salgono in cima, il filo viene tagliato e il tappo di sughero entra nel collo con un colpo: installata. Se va storta, l’albero che si stava alzando ricade sul ponte; Retry lo rialza.
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, viewport-fit=cover">
<title>The ship in a bottle installer</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/archivo@5.3.0/wdth.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="stage">
<!-- the ship in a bottle: the install of an app shown as a schooner inside a glass bottle lying on a wooden stand.
The hull is already in, sitting in a sea of blue resin, with its three masts laid flat on the deck. As the files
are copied a thread that runs out of the bottle's neck to a little winch pulls the masts up one after another,
each on a sprung hinge; then the sails unroll and fill with wind and the pennants stream out. At the end the
thread is cut and the cork hops into the neck. Everything is painted by script.js on the canvas -->
<section class="ship" aria-label="App installer" data-veliero>
<div class="ship__scene" role="progressbar" aria-label="Install progress" aria-valuemin="0" aria-valuemax="100"
aria-valuenow="0" aria-valuetext="Ready to install" data-scene>
<canvas class="ship__paint" aria-hidden="true" data-paint></canvas>
</div>
<div class="ship__foot">
<div class="ship__words" aria-hidden="true">
<p class="ship__title"><span class="ship__swap" data-title>Harbor 3.0</span></p>
<p class="ship__meta"><span class="ship__swap" data-meta>Ready to install · 84.2 MB</span></p>
</div>
<div class="ship__buttons">
<button class="pill is-quiet" type="button" hidden data-again><span class="pill__label">Reinstall</span></button>
<button class="pill" type="button" data-go data-autoclic><span class="pill__label" data-label>Install</span></button>
</div>
</div>
<p class="sr" role="status" 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.
47 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 veliero nella bottiglia» da Animorio e adattala al mio sitoArrivano pezzi di file di ogni grandezza, a volte dopo una pausa, e una molla con lo smorzamento critico porta la parte mostrata verso quella arrivata senza mai tornare indietro. Da quel numero viene tutto: ogni albero ha il suo tratto (il trinchetto fra il 3 e il 23%, il maestro fra il 19 e il 39, la mezzana fra il 35 e il 55), ogni vela il suo per srotolarsi e uno per gonfiarsi, le bandierine l’ultimo. Così Cancel e Reinstall non hanno un’animazione loro: riportano il numero a zero e la nave si rimette a riposo da sola, vele arrotolate e alberi giù.
Ogni albero è un angolo con la sua velocità: il filo lo tira verso l’angolo del suo tratto con una molla poco smorzata (rigidezza 95, smorzamento da SPRING), e quando il tratto finisce la cerniera scatta con un colpetto di velocità, così l’albero arriva dritto e oscilla qualche volta. Il bomo e il picco sono legati all’albero e si aprono con la salita: ripiegati lungo l’albero finché è basso, a squadra quando è su. Quando il filo scivola l’albero non ha più molla: cade sotto il suo peso (un’accelerazione proporzionale al seno dell’angolo) e rimbalza sul ponte perdendo due terzi della velocità. L’argano gira di quanto sono alti gli alberi, quindi torna indietro da solo quando uno cade.
Ogni vela è una griglia di 9 per 7 punti in tre dimensioni, uniti da bastoncini lungo i lati e in diagonale, integrata con Verlet a passi di 1/120 di secondo e otto giri di vincoli. Sono fermi i punti lungo l’albero, lungo il picco e lungo il bordo arrotolato, che scende verso il bomo man mano che la vela si srotola. Il vento spinge la tela fuori dal suo piano, a raffiche che corrono lungo la vela, e i bastoncini orizzontali sono più lunghi della vela piatta fino al 10%: così la tela non può che fare la pancia, e la balumina libera trema. Il fiocco è la stessa cosa, un triangolo che si srotola dal suo strallo verso l’angolo di scotta.
La vela si disegna quadrilatero per quadrilatero, in una proiezione appena obliqua che sposta i punti col loro rilievo. Per ogni punto la normale viene dai vicini a destra e a sinistra, sopra e sotto; la luce di un quadrilatero è la media dei suoi quattro angoli, così la tela sembra una superficie sola e non un mosaico. Il colore va dall’ombra della tela al bianco caldo della vela, poi sopra si tirano le cuciture dei teli e la ralinga lungo il bordo.
Tutto quello che c’è dentro la bottiglia si dipinge su un secondo canvas e si copia nella bottiglia una riga di pixel alla volta: la riga a distanza u dall’asse prende la riga u + (arcsen(0,93 u) ÷ arcsen 0,93 − u) × 0,85, la legge di un cilindro di vetro. Il veliero è ingrandito al centro e schiacciato verso il vetro, come nelle bottiglie vere. Sopra, il vetro a strati: il suo spessore verde (fra il contorno e quello interno, con evenodd), il fondo spesso, il riflesso lungo della finestra, la spalla, il collo e la bocca, e sulla tavola l’ombra con la luce che la bottiglia raccoglie in una striscia.
Alla fine il filo si taglia, il tappo segue una curva di Bézier dalla tavola alla bocca facendo un giro intero, entra con power3.in e si schiaccia con elastic.out; nello stesso istante la bottiglia ha un sussulto, ogni albero riceve un colpo di velocità e un riflesso attraversa il vetro. La scena è un role=progressbar con aria-valuenow e una aria-valuetext che dice la fase, il componente ha aria-busy mentre lavora e una riga aria-live dice quando parte, si ferma, finisce. Un clic da script, quello dell’anteprima della libreria, non annulla e non apre: dopo il risultato reinstalla.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
SECONDS | script.js | 7 | Quanto dura l’installazione della demo, in secondi (una vera segue i suoi file). |
SIZE | script.js | 84.2 | I megabyte dell’app da installare. |
FAIL_EVERY | script.js | 2 | Nella demo, un’installazione su quante va storta (0 mai). |
FAIL_AT | script.js | 0.5 | Fin dove arriva l’installazione che va storta, da 0 a 1: l’albero che si stava alzando ricade. |
SPRING | script.js | 1 | Quanto oscilla un albero sulla sua cerniera quando arriva dritto: 0 niente, 1 molto. |
WIND | script.js | 1 | Quanto vento gonfia le vele: 0 niente, 1 una brezza tesa. |
WAVE | script.js | 1 | L’onda del mare di resina: 0 piatta, 1 mossa. |
REFRACTION | script.js | 1 | Quanto il vetro curvo ingrandisce il veliero al centro e lo schiaccia verso i bordi: 0 niente. |
LABELS | script.js | { busy: 'Cancel', retry: 'Retry', done: 'Open', opening: 'Opening…' } | Le scritte del pulsante mentre installa, dopo un errore e alla fine (a riposo è quella in index.html). |
WORDS | script.js | { copy: 'Copying files', config: 'Configuring', finish: 'Finishing up', done: 'installed', fail: 'Installation failed', why: 'Couldn’t write to disk', canceled: 'Installation canceled' } | Le parole sotto la bottiglia: le tre fasi, la fine, l’errore e il suo motivo, l’annullamento (a riposo sono quelle in index.html). |
Per un’attesa di qualche secondo che finisce con qualcosa di pronto: l’installazione di un’app o di un’estensione, un aggiornamento, la preparazione di un progetto, un’esportazione che si «imbottiglia» in un pacchetto. La nave che si arma pezzo per pezzo fa vedere a che punto si è senza leggere la percentuale, e il tappo che entra è un «fatto» che si sente. Per un caricamento di un secondo o per una lista di file è troppo: meglio una barra semplice.
Il disegno è largo 380 unità e alto 200 e si adatta alla larghezza: a 390 pixel il componente è largo 358 e alto circa 240, senza niente che sfori. Il canvas dipinge alla densità vera dello schermo, fino a due volte, e la rifrazione riga per riga segue i pixel veri. Le pillole sono alte 38; col dito si schiacciano e rimbalzano, e toccare Install tende il filo come il puntatore sopra. Le animazioni sono le stesse del computer.
Niente molle, raffiche, onde né capriole: ogni albero passa da abbattuto a dritto in dissolvenza quando arriva a metà del suo tratto, ogni vela compare già gonfia con una pancia ferma, le bandierine compaiono senza sventolare, il mare resta fermo e il tappo sparisce dalla tavola e ricompare nel collo. Se l’installazione si ferma, l’albero torna giù in dissolvenza. Le parole cambiano in dissolvenza, e la nave si arma lo stesso un pezzo alla volta, perché è lei che dice a che punto si è.
GSAP 3.15.0, Archivo (font variabile) 5.3.0.
Compressi con gzip, i tre file della demo pesano 20 KB; le librerie: GSAP 28 KB.
Provata il 8 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.