
Il menu a onda di peso
Menu, Testo, Hover, Fisica
NuovaGratis
La barra in alto di una scuola di vela, con una striscia d'acqua lungo il fondo e una barchetta a vela ferma sotto la pagina in cui si è. Scegliendo un'altra voce la barca vira, gonfia la vela e corre là, e la sua scia rotola lungo la striscia, rimbalza sui bordi e la fa dondolare quando si è fermata; le lettere delle voci cavalcano le onde che passano. L'acqua è un'equazione delle onde vera, calcolata cella per cella. Al telefono le voci si aprono in un pannello di ormeggi, uno per voce, e la barca esce da uno ed entra nell'altro.
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 sailboat nav</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/bricolage-grotesque@5.3.0/wdth.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="stage">
<!-- the top bar of a sailing school. Along the bottom of the bar runs a strip of water, worked out as a real wave
equation, and a small sailboat lies under the page you are on. Choosing another link the boat turns, fills its
sail and runs there, leaving a wake that rolls along the strip, bounces off the ends and rocks it when it has
stopped; the words ride the waves that pass under them. Pointing at a link drops a ripple under it. On a phone
the links open in a panel of moorings, one strip of water each, and the boat sails out of one and into another -->
<header class="bar" data-bar>
<canvas class="sea" aria-hidden="true" data-sea></canvas>
<a class="brand" href="#" aria-label="Halyard Sailing School, home">
<svg class="brand__mark" viewBox="0 0 22 24" aria-hidden="true">
<path class="brand__pole" d="M4 2v20"/>
<path class="brand__flag" d="M5 3.2l13 4.6L5 12.4z"/>
</svg>
<span class="brand__name">Halyard</span>
</a>
<nav class="nav" id="halyard-links" aria-label="Main" data-nav>
<canvas class="nav__sea" aria-hidden="true" data-panel-sea></canvas>
<ul class="list" data-list>
<li class="item"><a class="link" href="#" aria-current="page" data-link><span class="link__word" data-word>Lessons</span></a></li>
<li class="item"><a class="link" href="#" data-link data-autoclic><span class="link__word" data-word>Fleet</span></a></li>
<li class="item"><a class="link" href="#" data-link data-autoclic><span class="link__word" data-word>Regattas</span></a></li>
<li class="item"><a class="link" href="#" data-link><span class="link__word" data-word>Clubhouse</span></a></li>
<li class="item"><a class="link" href="#" data-link data-autoclic><span class="link__word" data-word>Contact</span></a></li>
</ul>
</nav>
<a class="cta" href="#" data-cta><span class="cta__bg" aria-hidden="true" data-cta-bg></span><span class="cta__label">Book a lesson</span></a>
<button class="toggle" type="button" aria-expanded="false" aria-controls="halyard-links" data-toggle>
<svg class="toggle__icon" viewBox="0 0 24 24" aria-hidden="true">
<path class="toggle__line" d="M4 9 Q7 7 10 9 T16 9 T22 9" data-line/>
<path class="toggle__line" d="M4 15 Q7 13 10 15 T16 15 T22 15" data-line/>
</svg>
<span class="toggle__label" data-toggle-label>Menu</span>
</button>
</header>
</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.
30 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 «La nav con la barca a vela» da Animorio e adattala al mio sitoLa striscia è una fila di celle ogni 3 pixel, ognuna con la sua altezza e la sua velocità. A ogni passo ogni cella è tirata verso le vicine (c² per la differenza seconda delle altezze, diviso dx²: le onde corrono a WAVE_SPEED pixel al secondo), frenata da un attrito proporzionale a CALM, da un po' di viscosità sulle velocità che tiene le creste lisce e da una molla debolissima che riporta il livello. Ai due capi la cella si specchia nella vicina, quindi le onde rimbalzano sui bordi della barra. I passi sono piccoli quanto serve perché l'onda non salti più di 0,7 celle per passo (condizione di Courant), e mai più di 1/30 di secondo per fotogramma.
Finché la barca si muove, le celle intorno a lei ricevono a ogni passo una spinta in giù a forma di ondina di Ricker, (1 − d²)·e^(−d²/2), proporzionale alla velocità della barca e a WAKE: un avvallamento sotto lo scafo e l'acqua spostata ammucchiata a prua e a poppa. L'integrale della forma è zero, quindi la striscia non perde livello per quanta strada faccia la barca (con una semplice fossa sotto lo scafo l'acqua dietro di lei si svuotava). Il resto lo fa l'equazione: la barca corre più veloce delle onde e se le lascia dietro.
La posizione della barca è una molla verso il suo ormeggio, con lo smorzamento 0,74 e la pulsazione presa da SAIL_TIME, ma la spinta della molla è limitata (2600/SAIL_TIME² pixel al secondo quadrato): da lontano la barca non scatta, prende velocità, scivola e arriva andando appena oltre. La direzione è un'altra molla, da 1 a −1: quando passa per lo zero la sagoma disegnata con scale(face, 1) si stringe e si riapre girata, come una barca vista di fianco che vira.
A ogni passo la barca legge l'altezza dell'acqua a prua, a poppa e al centro: l'altezza media è la quota di una molla stretta (beccheggio e sussulto con un po' di inerzia), la pendenza fra prua e poppa più l'accelerazione (la prua si alza quando prende velocità e si abbassa quando frena) è l'angolo di un'altra molla. La vela si gonfia con la velocità (la balumina è una curva quadratica che si allarga) e il guidone si stende all'indietro. L'acqua davanti allo scafo si ridisegna sopra di lui con lo stesso gradiente della striscia, così la barca ci sta dentro.
Ogni parola è tagliata in lettere (il link tiene il suo nome in aria-label); di ogni lettera si misura una volta il centro con offsetLeft, che non vede le trasformazioni. A ogni fotogramma ogni lettera prende translateY(−altezza·BOB) e una rotazione dalla pendenza dell'acqua sotto di lei, e lo stile si scrive solo se cambia. Il mouse su una voce aggiunge alle velocità delle celle sotto la parola una campana: è la goccia, che si apre in due onde verso i due lati.
Sotto i 760 pixel le voci finiscono in un pannello sotto la barra, e ogni riga ha la sua striscia d'acqua, con la sua equazione. Il pulsante Menu apre il pannello con un clip-path che scende, le righe entrano una dopo l'altra, l'acqua di ogni riga sale con un back.out (quindi trabocca un poco e torna) e la barca entra dal bordo destro fino all'ormeggio, accanto alla parola. Scegliendo un'altra riga la barca esce a destra dal suo ormeggio e rientra da destra in quello nuovo. Le onde del pulsante si appiattiscono e ruotano in una croce, Esc chiude e riporta il fuoco sul pulsante, le frecce scorrono le voci.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
SAIL_TIME | script.js | 1.1 | Più o meno quanti secondi ci mette la barca ad andare sotto una voce nuova. |
WAKE | script.js | 1 | Quanto è grande la scia che la barca si lascia dietro (0, nessuna). |
WAVE_SPEED | script.js | 230 | Quanto corrono le onde lungo l'acqua, in pixel al secondo. |
CALM | script.js | 0.9 | Quanto in fretta l'acqua torna ferma: più alto, prima. |
RIPPLE | script.js | 1 | Quanto è grande l'increspatura che cade sotto una voce puntata (0, nessuna). |
BOB | script.js | 0.7 | Quanto le lettere delle voci cavalcano le onde che passano sotto di loro (0, ferme). |
BOAT_SIZE | script.js | 1.2 | Quanto è grande la barca. |
Per la testata di chi ha a che fare col mare e con l'acqua: una scuola di vela, un circolo nautico, un noleggio di barche o di kayak, un albergo o delle case vacanza sul mare, uno stabilimento balneare, un sito di regate o di gite in barca. Sta bene con poche voci corte su una barra scura; i colori dell'acqua, della barca e della barra si cambiano nelle variabili.
Sotto i 760 pixel la barra è alta 60 pixel, larga quanto lo schermo meno 32 (358 a 390), il pulsante giallo sparisce e a destra compare il pulsante Menu con due onde disegnate. Toccato, sotto la barra scende un pannello dello stesso blu con le cinque voci in colonna, ognuna con la sua striscia d'acqua: le righe entrano una dopo l'altra, l'acqua sale in ogni riga traboccando appena, e la barca entra da destra e si ferma accanto alla voce corrente. Toccando un'altra voce la barca esce dal suo ormeggio verso destra e rientra da destra in quello nuovo; il dito giù su una voce fa cadere la goccia, come il mouse. Le onde del pulsante diventano una croce e la scritta Close; Esc chiude.
L'acqua resta piatta e ferma, le lettere non si muovono e non cadono gocce: scegliendo un'altra voce la barca sfuma dove era e ricompare con una dissolvenza sotto la voce nuova, già ferma. Al telefono il pannello compare e sparisce con una dissolvenza, senza scendere, e la barca è già al suo ormeggio. I pulsanti non si schiacciano e non si allargano.
GSAP 3.15.0, Bricolage Grotesque (font variabile, con gli assi del peso e della larghezza) 5.3.0.
Compressi con gzip, i tre file della demo pesano 13 KB; le librerie: GSAP 28 KB.
Provata il 13 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.