
Il pulsante di gelatina
Pulsanti, Fisica, Hover, Testo
NuovaGratis
Un menu a tutto schermo con le voci grandi in un carattere variabile: ogni lettera prende peso e larghezza dalla distanza dal puntatore, così un'onda di lettere nere e larghe lo segue fra le parole, con una molla per lettera che la fa ondeggiare. La voce sotto il puntatore si inclina; al telefono l'onda segue il dito.
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 variable weight menu</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/anybody@5.3.0/wdth.css">
<link rel="stylesheet" href="style.css">
</head>
<body class="is-open">
<!-- the button stays above the menu: it closes the menu and opens it again -->
<button class="toggle" type="button" aria-expanded="true" aria-controls="menu" data-toggle>
<span class="toggle__words" aria-hidden="true">
<span class="toggle__word" data-word-open>Menu</span>
<span class="toggle__word" data-word-close>Close</span>
</span>
<span class="sr" data-toggle-name>Close the menu</span>
<span class="toggle__icon" aria-hidden="true"><i data-line></i><i data-line></i></span>
</button>
<!-- the menu: big words in a variable typeface; every letter takes its weight and width from how far the pointer
is, so a wave of heavy, wide letters follows it through the words -->
<nav class="menu" id="menu" aria-label="Main" data-menu>
<ul class="menu__list" data-list>
<li class="menu__row"><a class="menu__item" href="#" data-item><span class="menu__mask"><span class="menu__word" data-word>Work</span></span><span class="menu__note">38 projects since 2016</span></a></li>
<li class="menu__row"><a class="menu__item" href="#" data-item><span class="menu__mask"><span class="menu__word" data-word>Studio</span></span><span class="menu__note">Eleven people, two cities</span></a></li>
<li class="menu__row"><a class="menu__item" href="#" data-item><span class="menu__mask"><span class="menu__word" data-word>Services</span></span><span class="menu__note">Brand, motion and web</span></a></li>
<li class="menu__row"><a class="menu__item" href="#" data-item><span class="menu__mask"><span class="menu__word" data-word>Journal</span></span><span class="menu__note">Notes from the desk</span></a></li>
<li class="menu__row"><a class="menu__item" href="#" data-item><span class="menu__mask"><span class="menu__word" data-word>Contact</span></span><span class="menu__note">Start a project</span></a></li>
</ul>
</nav>
<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.
31 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 onda di peso» da Animorio e adattala al mio sitoAnybody, da Fontsource nella versione wdth, ha nello stesso file l'asse del peso (da 100 a 900) e quello della larghezza (da 50 a 150). Ogni parola è divisa in una lettera per span; ognuna riceve a ogni fotogramma font-variation-settings: 'wght' e 'wdth' calcolati fra WEIGHT e WIDTH, e una variabile --v che col color-mix la scurisce dal grigio al nero. Una copia della parola intera resta per chi legge con lo screen reader.
Per ogni lettera si prende il centro nel layout (sommando gli offset fino alla lista, così né la salita delle parole né l'inclinazione la spostano) e la distanza dal puntatore; il valore voluto è una campana di Gauss, exp(−d²/R²), con R uguale a REACH volte l'altezza delle lettere. Oltre le estremità di una parola il puntatore conta come se fosse sull'ultima lettera, così anche lo spazio vuoto della riga tira la fine della parola.
La lettera non prende subito il valore voluto: lo insegue su una molla (rigidità e smorzamento in SPRING), integrata a mano sul ticker di GSAP col passo limitato a 1/30 di secondo. Smorzata poco, quando il puntatore corre l'onda resta indietro, sorpassa e si assesta ondeggiando. Lo stile di una lettera si riscrive solo se peso, larghezza o colore sono cambiati.
La parola sotto il puntatore si inclina con skewX dal piede, su una molla a parte: l'angolo è una parte fissa di LEAN più una parte che segue la velocità del puntatore in orizzontale, misurata fra due movimenti e smorzata. Accanto, la nota arancio entra con una transizione CSS quando la riga riceve la classe is-on.
Mouse e dito guidano l'onda; il dito solo finché tocca, e la lista ha touch-action: none perché il trascinamento non diventi uno scorrimento. Coi tasti, un puntatore fantasma scivola sulla parola raggiunta. All'apertura e quando nessuno punta lo guida un tween, prima in diagonale una volta, poi su una curva lenta di Lissajous fra le parole. Esc chiude il menu, Close e Menu lo aprono e chiudono con un clip-path sulla carta.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
WEIGHT | script.js | [240, 900] | Il peso di una lettera lontana dal puntatore e di una proprio sotto (da 100 a 900). |
WIDTH | script.js | [78, 150] | La larghezza di una lettera lontana dal puntatore e di una proprio sotto (da 50 a 150). |
REACH | script.js | 1.7 | Quanto arriva lontano l'onda intorno al puntatore, in volte l'altezza delle lettere. |
SPRING | script.js | [210, 15] | La molla di ogni lettera: quanto è rigida e quanto è frenata (meno freno, più ondeggia). |
LEAN | script.js | 9 | Di quanti gradi si inclina la parola sotto il puntatore. |
WANDER | script.js | true | Un'onda lenta vaga da sola fra le parole quando nessuno punta. |
OPEN | script.js | 0.9 | I secondi che la carta impiega a scendere quando il menu si apre. |
Per il menu a tutto schermo di uno studio, di un'agenzia, di un fotografo o di una rivista: poche voci brevi, dove la tipografia è la protagonista. Con voci lunghe o più di sei o sette righe le parole non stanno più grandi abbastanza perché l'onda si veda.
Le parole sono grandi quanto lo schermo permette e la nota accanto sparisce. L'onda segue il dito finché tocca la lista (che non scorre sotto il dito) e si spegne piano quando si alza; dopo un momento riparte l'onda che vaga da sola. Il tocco su una voce la apre come un clic.
Niente onda, niente molle e niente inclinazione: la parola sotto il puntatore, o raggiunta coi tasti, diventa nera e pesante in una breve dissolvenza senza allargarsi, quindi niente si sposta; la nota compare senza scivolare. Il menu si apre e si chiude con una dissolvenza.
GSAP 3.15.0, Anybody (font variabile, assi wght e wdth) 5.3.0.
Compressi con gzip, i tre file della demo pesano 7,7 KB; le librerie: GSAP 28 KB.
Provata il 4 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.