
I filtri che si fondono
Etichette, Fisica, Transizioni, Hover
NuovaGratis
Il menu di un negozio di vernici e tessuti come una mazzetta di campioni: strisce di cartoncino tenute in basso da un rivetto d’ottone. Premendo la copertina le strisce si aprono a ventaglio intorno al rivetto, ognuna sulla sua molla e un attimo dopo l’altra; ogni striscia è una voce, coi suoi colori e i loro nomi. Al passaggio la striscia si solleva dal ventaglio; il ventaglio si apre e si chiude anche con la mano e lanciato continua da solo; la striscia scelta esce e le altre si richiudono dietro.
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 swatch fan menu</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/instrument-sans@5.3.0/index.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/fraunces@5.3.0/standard-italic.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="stage">
<!-- the swatch fan menu: a deck of paint card strips held by a brass rivet. Pressed, the strips fan out round the
rivet, each on its own spring; each strip is a section of the site, with its colours and their names. The fan
can be opened and closed by hand, and a chosen strip slides out while the others close behind it -->
<div class="swatch" data-swatch>
<div class="fan" data-fan>
<nav class="fan__deck" id="swatch-menu" aria-label="Main" data-deck inert>
<ul class="fan__list">
<li>
<a class="strip" href="#paints" style="--c: #b8432f" data-strip>
<span class="strip__chips" aria-hidden="true">
<span class="chip chip--deep"><span class="chip__name">Madder Red</span></span>
<span class="chip chip--mid"><span class="chip__name">Clay Pot</span></span>
<span class="chip chip--pale"><span class="chip__name">Blush Plaster</span></span>
</span>
<span class="strip__label">Paints</span>
</a>
</li>
<li>
<a class="strip" href="#wallpaper" style="--c: #4c6b43" data-strip>
<span class="strip__chips" aria-hidden="true">
<span class="chip chip--deep"><span class="chip__name">Fern Hollow</span></span>
<span class="chip chip--mid"><span class="chip__name">Sage Leaf</span></span>
<span class="chip chip--pale"><span class="chip__name">Pale Lichen</span></span>
</span>
<span class="strip__label">Wallpaper</span>
</a>
</li>
<li>
<a class="strip" href="#fabrics" style="--c: #2d4878" data-strip>
<span class="strip__chips" aria-hidden="true">
<span class="chip chip--deep"><span class="chip__name">Indigo Dye</span></span>
<span class="chip chip--mid"><span class="chip__name">Chambray</span></span>
<span class="chip chip--pale"><span class="chip__name">Mist Linen</span></span>
</span>
<span class="strip__label">Fabrics</span>
</a>
</li>
<li>
<a class="strip" href="#inspiration" style="--c: #c07f17" data-strip>
<span class="strip__chips" aria-hidden="true">
<span class="chip chip--deep"><span class="chip__name">Saffron Thread</span></span>
<span class="chip chip--mid"><span class="chip__name">Honeycomb</span></span>
<span class="chip chip--pale"><span class="chip__name">Oat Milk</span></span>
</span>
<span class="strip__label">Inspiration</span>
</a>
</li>
<li>
<a class="strip" href="#visit" style="--c: #6a3456" data-strip>
<span class="strip__chips" aria-hidden="true">
<span class="chip chip--deep"><span class="chip__name">Plum Velvet</span></span>
<span class="chip chip--mid"><span class="chip__name">Heather</span></span>
<span class="chip chip--pale"><span class="chip__name">Rose Quartz</span></span>
</span>
<span class="strip__label">Visit us</span>
</a>
</li>
</ul>
</nav>
<!-- the cover of the deck is the menu button -->
<button class="strip strip--cover" type="button" aria-expanded="false" aria-controls="swatch-menu" data-cover data-autoclic>
<span class="cover__word" data-word>Menu</span>
<span class="cover__now" data-now>Paints</span>
<span class="cover__bars" aria-hidden="true" data-bars></span>
<span class="cover__spine" aria-hidden="true">Colour library</span>
<span class="sr" data-name>Open the menu</span>
</button>
<span class="fan__rivet" aria-hidden="true" data-rivet></span>
</div>
<p class="sr" aria-live="polite" data-live></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.
44 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 mazzetta di colori» da Animorio e adattala al mio sitoOgni striscia è un elemento posato sul rivetto, con transform-origin sul foro: lo script le dà a ogni fotogramma rotate() per l’angolo e translateY() per quanto esce lungo sé stessa. Il rivetto e tutte le strisce scivolano insieme a sinistra mentre il ventaglio si apre, di metà della somma delle sue due estremità (calcolate dal seno e dal coseno degli angoli), così il ventaglio aperto sta al centro come la mazzetta chiusa.
Ogni striscia ha un angolo, una velocità e un angolo a cui tende; una molla smorzata (SPRING: forza e smorzamento) la porta lì in tre piccoli passi per fotogramma, col passo limitato a 1/30 di secondo. Aprendo, gli angoli d’arrivo partono uno dopo l’altro a STAGGER secondi dalla striscia in fondo; chiudendo, dalla copertina. Anche la salita lungo la striscia (al passaggio, per la scelta, per sporgere) ha la sua molla.
Presa la mazzetta, l’angolo della mano intorno al rivetto (atan2 della posizione rispetto al centro del rivetto) muove la copertina esattamente, e quanto è aperto il ventaglio viene da lei; le altre strisce ricevono il loro angolo a quella apertura e lo inseguono sulle molle, in ritardo. Oltre le due estremità il ventaglio resiste come una cerniera dura. Lasciato, la velocità degli ultimi cento millisecondi decide dove finisce (THROW) e passa a ogni striscia, che la porta con sé.
Nel ventaglio aperto ogni striscia sta sopra quella alla sua sinistra, e la copertina guida a destra sopra tutte: così di ogni striscia resta sempre scoperto il bordo sinistro, ed è lì che sta il nome della voce, scritto in verticale (writing-mode e una rotazione di 180 gradi) dal rivetto verso fuori. I colori sono variabili in linea sulle strisce; le mescole chiare sono color-mix verso il cartoncino.
La striscia scelta sale sopra le sue vicine e scivola fuori lungo sé stessa; le altre si richiudono dietro, la copertina torna davanti, poi la striscia si raddrizza sull’angolo della mazzetta chiusa e scende fino a sporgere di PEEK, col nome del colore in cima ben visibile. Prende aria-current, la copertina mostra il suo nome e un’area aria-live lo legge.
Il cartoncino ha una grana fatta da un feTurbulence in un SVG in linea, moltiplicata sopra carta e colori, e un’ombra che si allunga quando la striscia è sollevata. La copertina è un button con aria-expanded; le strisce sono link in un nav, inert quando la mazzetta è chiusa. Le frecce, Home e End spostano il fuoco fra le strisce, Invio sceglie, Esc chiude e riporta il fuoco alla copertina.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
SPREAD | script.js | 100 | L’angolo a cui si apre il ventaglio, in gradi, dalla prima striscia alla copertina. |
SPRING | script.js | [210, 0.52] | Le molle delle strisce: quanto forte tirano verso il loro angolo, e quanto sono smorzate (1 = nessun rimbalzo). |
STAGGER | script.js | 0.045 | I secondi fra la partenza di una striscia e quella dopo. |
LIFT | script.js | 16 | Quanto si solleva dal ventaglio una striscia sotto il puntatore, in unità del disegno. |
PEEK | script.js | 46 | Quanto sporge dalla mazzetta chiusa la striscia scelta. |
THROW | script.js | 0.2 | Quanto avanti si segue un lancio della mano, in secondi della sua velocità. |
Per il menu di un sito che vive di colore: un negozio di vernici, carte da parati o tessuti, uno studio di interni, un marchio di cosmetici, un portfolio di design. Da quattro a sette voci brevi, ognuna col suo colore; con di più le strisce si coprono troppo e i nomi non si leggono.
Tutto il disegno si scala sulla larghezza dello schermo (a 390 pixel una striscia è lunga circa 250) e il ventaglio aperto ci sta senza sforare. Il dito apre e chiude il ventaglio come la mano col mouse, e la mazzetta tiene touch-action: none perché il dito non faccia scorrere la pagina; un tocco su una striscia la sceglie.
Le strisce non girano e non rimbalzano: il ventaglio è aperto o chiuso subito, la striscia scelta è già al suo posto sporgente, e al passaggio la striscia è sollevata senza viaggio. La mano lo apre e lo chiude ancora, ma senza molle né inerzia.
GSAP 3.15.0, Instrument Sans (font variabile) 5.3.0, Fraunces (font variabile) 5.3.0.
Compressi con gzip, i tre file della demo pesano 8,3 KB; le librerie: GSAP 28 KB.
Provata il 5 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.