
Il menu a mazzetta di colori
Menu, Fisica, Transizioni, Hover
NuovaGratis
Il menu di un campeggio di case sugli alberi: chiuso è una botola di legno con le cerniere di ferro e un anello d'ottone. Premuta, la botola si apre e ne cade una scala di corda arrotolata, che si srotola gradino dopo gradino, si tende di colpo e oscilla prima di fermarsi: ogni piolo è una voce. Le due corde sono simulate punto per punto, con la torsione disegnata; sopra un piolo la scala si tende come sotto un peso e il piolo si inclina e scricchiola; scelto, si accende di luce calda e la scala risale arrotolandosi.
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 rope ladder menu</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/bricolage-grotesque@5.3.0/standard.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="stage">
<!-- the menu of a treehouse camp: closed, the button is a wooden trapdoor. Pressed, the lid swings open on its
hinges and a rope ladder drops out of the hole, unrolling rung after rung, and sways before it settles. Every
rung is a section of the site. The two ropes are simulated (verlet) and drawn on the canvas; the rungs are
real links, moved every frame to where the ropes hold them -->
<nav class="ladder" aria-label="Fernhollow Treehouses" data-ladder>
<canvas class="ladder__ropes" aria-hidden="true" data-ropes></canvas>
<ul class="ladder__rungs" id="ladder-menu" data-rungs inert>
<li><a class="rung" href="#treehouses" data-rung><span class="rung__wood" aria-hidden="true"><span class="rung__lash"></span><span class="rung__lash rung__lash--r"></span></span><span class="rung__label">Treehouses</span></a></li>
<li><a class="rung" href="#book" data-rung><span class="rung__wood" aria-hidden="true"><span class="rung__lash"></span><span class="rung__lash rung__lash--r"></span></span><span class="rung__label">Book a stay</span></a></li>
<li><a class="rung" href="#trails" data-rung><span class="rung__wood" aria-hidden="true"><span class="rung__lash"></span><span class="rung__lash rung__lash--r"></span></span><span class="rung__label">Forest trails</span></a></li>
<li><a class="rung" href="#campfire" data-rung><span class="rung__wood" aria-hidden="true"><span class="rung__lash"></span><span class="rung__lash rung__lash--r"></span></span><span class="rung__label">Campfire nights</span></a></li>
<li><a class="rung" href="#find-us" data-rung><span class="rung__wood" aria-hidden="true"><span class="rung__lash"></span><span class="rung__lash rung__lash--r"></span></span><span class="rung__label">Find us</span></a></li>
</ul>
<!-- the trapdoor is the menu button -->
<button class="hatch" type="button" aria-expanded="false" aria-controls="ladder-menu" data-hatch data-autoclic>
<span class="hatch__hole" aria-hidden="true">
<span class="hatch__close">
<svg viewBox="0 0 16 16"><path d="M4 4l8 8M12 4l-8 8"/></svg>
Close
</span>
</span>
<span class="hatch__knuckle" aria-hidden="true"></span>
<span class="hatch__knuckle hatch__knuckle--low" aria-hidden="true"></span>
<span class="lid" aria-hidden="true" data-lid>
<span class="lid__face lid__face--front">
<span class="lid__strap"></span>
<span class="lid__strap lid__strap--low"></span>
<span class="lid__word">Menu</span>
<svg class="lid__ring" viewBox="0 0 30 30">
<rect class="lid__plate" x="9" y="2" width="12" height="7" rx="2"/>
<circle class="lid__loop" cx="15" cy="17" r="8"/>
<path class="lid__glint" d="M9.2 13.4a7 7 0 0 1 4.6-3.6"/>
</svg>
</span>
<span class="lid__face lid__face--back"></span>
</span>
<span class="sr" data-name>Open the menu</span>
</button>
<p class="sr" aria-live="polite" data-live></p>
</nav>
</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.
29 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 menu a scala di corda» da Animorio e adattala al mio sitoOgni corda è una fila di punti a dieci pixel l'uno dall'altro, mossi con l'integrazione di Verlet: la velocità sta nella differenza fra la posizione di adesso e quella di prima, con la gravità e uno smorzamento (DAMPING). A ogni passo, centoventi al secondo e mai più lunghi di 1/30 di secondo, quattordici giri di vincoli rimettono ogni tratto alla sua lunghezza e il primo punto di ogni corda attaccato alla botola.
Ogni piolo lega un punto della corda di sinistra a quello alla stessa altezza della corda di destra con un vincolo di distanza fisso: così la scala si storce, oscilla e si torce tutta insieme. I pioli sono link veri in una lista: a ogni fotogramma lo script mette ciascuno nel punto medio dei suoi due punti e lo ruota dell'angolo fra di loro (atan2).
La parte di corda ancora arrotolata non è libera: i suoi punti stanno sul rotolo, che cade con la gravità e un po' d'attrito, e passano alla fisica uno dopo l'altro con la velocità del rotolo man mano che scende. I pioli escono girandosi (scaleY), il rotolo si assottiglia; quando l'ultimo punto è libero le corde si tendono di colpo, la botola prende lo strattone e la scala riceve una spinta di lato (SWAY) che la fa oscillare. Per risalire si fa il contrario: il rotolo sta sulla corda e si mangia un punto alla volta, a REEL pixel al secondo.
Sopra un piolo i suoi due punti ricevono una forza verso il basso (WEIGHT), più forte dal lato del puntatore. Le corde sopra si allungano un poco (STRETCH) e, dal lato del puntatore, il tratto subito sopra il piolo si allunga mentre quello sotto si accorcia altrettanto: così si inclina solo quel piolo e il resto della scala pende dritto sotto di lui. Il piolo trema per un attimo (un seno smorzato sull'angolo) e dalla legatura cade una manciata di segatura.
Le corde sono curve morbide (quadraticCurveTo fra i punti medi) su un canvas: un bordo scuro, il corpo con un gradiente dall'alto, una riga di luce, e i fili della torsione come trattini di sbieco a passo fisso lungo la corda. Dove un tratto è stirato il passo si allunga e i trattini si distendono. Il cono di luce dalla botola e l'alone del piolo acceso sono gradienti radiali; quando niente si muove più il canvas smette di ridisegnare.
La botola è un button con aria-expanded e aria-controls; il coperchio gira in 3D sulla cerniera con GSAP (un rimbalzo aprendo, un colpo chiudendo). La lista dei pioli è inert finché la scala è arrotolata. Da tastiera il fuoco va al piolo della voce attuale quando la scala atterra; le frecce scorrono i pioli, Invio sceglie, Esc e un clic fuori riarrotolano la scala; un'area aria-live legge la voce scelta.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
GRAVITY | script.js | 1900 | La gravità sulle corde, in pixel al secondo al quadrato. |
DAMPING | script.js | 0.9 | Quanto in fretta si spegne l'oscillazione (0.2 oscilla a lungo, 3 si ferma quasi subito). |
SWAY | script.js | 110 | La spinta di lato che riceve la scala quando atterra, in pixel al secondo. |
WEIGHT | script.js | 1500 | Quanto forte è tirato in giù un piolo sotto il puntatore, come se qualcuno ci salisse. |
STRETCH | script.js | 0.05 | Quanto cedono le corde sopra quel piolo sotto il peso (0.05 = il cinque per cento); dà anche l'inclinazione del piolo. |
RUNG_GAP | script.js | 70 | La corda fra un piolo e l'altro, in pixel. |
GLOW | script.js | 0.6 | I secondi in cui il piolo scelto resta acceso prima che la scala risalga. |
REEL | script.js | 700 | Quanto in fretta la scala si riarrotola, in pixel al secondo. |
Per il menu di un sito all'aria aperta o giocoso: un campeggio, un rifugio, case sugli alberi, un parco avventura, un'attività per bambini, un gioco. Da tre a sei voci brevi (il nome deve stare su un piolo largo 176 pixel); con di più la scala diventa troppo lunga per lo schermo.
La scala è larga 340 pixel e ci sta intera a 390, aperta e mentre oscilla. Il dito che preme su un piolo ci sale sopra (il piolo si inclina dalla parte del dito e scricchiola) e lasciandolo lo sceglie; la botola si apre e si chiude col tocco.
Niente cade e niente oscilla: il coperchio sparisce in dissolvenza e la scala compare già appesa dritta, in dissolvenza; sopra un piolo il legno si scalda di colore senza muoversi; il piolo scelto si accende, poi la scala svanisce e il coperchio torna.
GSAP 3.15.0, Bricolage Grotesque (font variabile) 5.3.0.
Compressi con gzip, i tre file della demo pesano 13 KB; le librerie: GSAP 28 KB.
Provata il 9 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.