
Il pulsante elastico
Pulsanti, Hover, Testo
NuovaGratis
Nello stile minimal, su nero: il menu di una piccola libreria. Fra due margini sottili, come i bordi di una colonna stampata, le voci stanno corte e leggere a sinistra; quella sotto il puntatore allarga le lettere su una molla, prende peso e larghezza finché riempie la riga da margine a margine e, passando un poco oltre, spinge i due margini in fuori di qualche pixel, che lì diventano vermigli.
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 menu whose links stretch between the margins</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/mona-sans@5.3.0/wdth.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="stage">
<!-- the menu of a small bookshop. Between two hairline margins, like the edges of a printed column, the links sit
short on the left. The one under the pointer stretches its letters until it touches both margins and pushes
them out by a pixel; the margins bulge there in vermilion. The page you are on stays a little stretched. -->
<div class="column" data-frame>
<div class="top">
<span class="brand">Orvel Books</span>
<button class="toggle" type="button" aria-expanded="false" aria-controls="orvel-menu" data-toggle data-autoclic>
<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>Open the menu</span>
</button>
</div>
<div class="field" data-field>
<svg class="margins" aria-hidden="true" data-margins>
<path class="margin" data-margin-left></path>
<path class="margin" data-margin-right></path>
<path class="margin margin--hot" data-hot-left></path>
<path class="margin margin--hot" data-hot-right></path>
</svg>
<nav class="menu" id="orvel-menu" aria-label="Main" data-menu inert>
<ul class="menu__list">
<li><a class="row" href="#books" data-desc="New and second-hand, two floors" aria-current="page" data-row><span class="row__mask"><span class="row__word" data-word>Books</span></span></a></li>
<li><a class="row" href="#authors" data-desc="Forty writers who read here" data-row><span class="row__mask"><span class="row__word" data-word>Authors</span></span></a></li>
<li><a class="row" href="#readings" data-desc="Thursdays at seven" data-row><span class="row__mask"><span class="row__word" data-word>Readings</span></span></a></li>
<li><a class="row" href="#journal" data-desc="Notes from the counter" data-row><span class="row__mask"><span class="row__word" data-word>Journal</span></span></a></li>
<li><a class="row" href="#visit" data-desc="12 Canal Row, open daily" data-row><span class="row__mask"><span class="row__word" data-word>Visit</span></span></a></li>
</ul>
</nav>
</div>
<p class="note" data-note><span class="note__line" data-note-line>Point at a link, it fills the line</span></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.
24 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 delle voci che si stendono fra i margini» da Animorio e adattala al mio sitoOgni voce ha un numero s fra 0 (corta) e 1 (stesa), che segue la sua meta con una molla (SPRING): 1 per la voce sotto il puntatore, REST per la pagina in cui si è quando non si punta niente, 0 per le altre. La molla è poco frenata, quindi la voce va un poco oltre 1 e torna.
Ogni parola è divisa in lettere. All'apertura e al resize si misura la sua larghezza col peso e la larghezza dell'asse più bassi e più alti (WEIGHT, WIDTH). A ogni fotogramma la spaziatura fra le lettere è s per la differenza fra la colonna e la larghezza naturale, diviso il numero degli spazi: con s uguale a 1 la parola misura esattamente la colonna, oltre 1 la supera di poco. L'ultima lettera non ha spaziatura, così la parola finisce sul margine.
I due margini sono due tracciati SVG ridisegnati a ogni fotogramma, un punto ogni 3 pixel: ogni voce stesa oltre 0,78 li spinge in fuori con una campana larga poco meno di una riga, fino a PUSH pixel. Un secondo tracciato vermiglio copre solo il tratto spinto dalla voce più stesa, più acceso quanto più spinge.
GSAP: Menu e Close si scambiano, i margini si disegnano dall'alto in 0,8 secondi, le voci salgono dalle maschere con back.out a STAGGER secondi l'una dall'altra. Scegliendo una voce la sua molla riceve una spinta in più, la voce passa dal vermiglio al bianco, e dopo tre quarti di secondo il menu si chiude: le voci scendono dall'ultima e i margini si ritirano.
Il pulsante ha aria-expanded e il menu chiuso è inert; le frecce spostano la voce stesa, Esc chiude, Tab gira fra pulsante e voci. Sul telefono il dito che scorre sulle voci fa come il puntatore (il campo ha touch-action none solo a menu aperto), e un tocco sceglie.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
SPRING | script.js | [190, 15] | La molla della voce che si stende: quanto è rigida e quanto è frenata (meno, più rimbalzo). |
REST | script.js | 0.16 | Quanto resta stesa la pagina in cui si è quando non si punta niente. |
WEIGHT | script.js | [300, 640] | Il peso di una voce corta e di una voce stesa. |
WIDTH | script.js | [100, 112] | La larghezza dell'asse di una voce corta e di una voce stesa. |
PUSH | script.js | 3 | Di quanti pixel una voce stesa spinge in fuori i margini. |
STAGGER | script.js | 0.05 | I secondi fra una voce e l'altra all'apertura e alla chiusura. |
Per il menu di chi lavora con le parole: una libreria, una casa editrice, una rivista, una fonderia di caratteri, un'agenzia di testi. Sta bene con quattro, cinque o sei voci corte su un fondo scuro o chiaro; le parole lunghe vogliono una colonna un po' più larga.
La colonna è larga quanto lo schermo meno 32 pixel e alta al massimo l'88% dell'altezza; le voci si rimpiccioliscono con la larghezza e l'altezza. Il dito che scorre sulle voci le stende come il puntatore, e un tocco sceglie.
Niente molle né rimbalzi: la voce sotto il puntatore è subito stesa, le voci e i margini compaiono e spariscono in dissolvenza.
GSAP 3.15.0, Mona Sans (font variabile, con gli assi della larghezza e del peso) 5.3.0.
Compressi con gzip, i tre file della demo pesano 6,8 KB; le librerie: GSAP 28 KB.
Provata il 24 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.