
Il menu che si apre dal pulsante
Menu, Transizioni, Testo
Gratis
Le pagine di un elenco di risultati stanno su un nastro che corre nella barra, e i puntini di sospensione sono le sue bobine: cambiando pagina il nastro scorre, i numeri passano dentro il carrello scuro della pagina attuale e si accendono di bianco tagliati sul suo bordo, quelli in fondo si avvolgono stringendosi nei puntini che girano, e sotto le cifre dei risultati rotolano.
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 tape pagination</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/archivo@5.3.0/wdth.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="stage">
<!-- the pagination of a list of 472 results, ten to a page. The pages in between are numbers on a tape that runs
through the bar, and the two sets of dots are its reels: going to another page the tape runs, the numbers
slide through the dark carriage of the current page (lit white inside it), the ones at the ends are wound
into the dots and new ones come out of the other side. Under the bar the range of results rolls, digit by
digit. Without the script, the links below work as they are -->
<div class="pager" data-pager>
<nav class="bar" aria-label="Pagination" data-bar>
<a class="key key--prev" href="?page=6" rel="prev" aria-label="Previous page" data-prev>
<svg class="key__arrow" viewBox="0 0 24 24" aria-hidden="true"><path d="M14.25 6.5 8.75 12l5.5 5.5"/></svg>
</a>
<div class="track" data-track>
<ol class="slots" data-slots>
<li class="slot"><a class="slot__page" href="?page=1" aria-label="Page 1">1</a></li>
<li class="slot"><span class="slot__gap" aria-hidden="true">…</span></li>
<li class="slot"><a class="slot__page" href="?page=6" aria-label="Page 6">6</a></li>
<li class="slot"><a class="slot__page" href="?page=7" aria-label="Page 7" aria-current="page">7</a></li>
<li class="slot"><a class="slot__page" href="?page=8" aria-label="Page 8">8</a></li>
<li class="slot"><span class="slot__gap" aria-hidden="true">…</span></li>
<li class="slot"><a class="slot__page" href="?page=48" aria-label="Page 48">48</a></li>
</ol>
<!-- what the script draws: the carriage, the reels and the tape twice, the second one lit inside the carriage -->
<span class="carriage" aria-hidden="true" data-carriage></span>
<span class="reel" aria-hidden="true" data-reel><i></i><i></i><i></i></span>
<span class="reel" aria-hidden="true" data-reel><i></i><i></i><i></i></span>
<div class="tape" aria-hidden="true" data-tape></div>
<div class="tape tape--lit" aria-hidden="true" data-lit></div>
</div>
<a class="key key--next" href="?page=8" rel="next" aria-label="Next page" data-next data-autoclic>
<svg class="key__arrow" viewBox="0 0 24 24" aria-hidden="true"><path d="M9.75 6.5 15.25 12l-5.5 5.5"/></svg>
</a>
</nav>
<p class="range">
<span class="range__said" aria-live="polite" data-said>Results 61 to 70 of 472</span>
<span class="range__shown" aria-hidden="true"><span class="odo" data-odo>61</span><span class="range__dash">–</span><span class="odo" data-odo>70</span> of <span data-total>472</span> results</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 «La paginazione a nastro» da Animorio e adattala al mio sitoIl nastro non è una serie di stati ma un numero: la pagina come frazione, che GSAP porta dalla vecchia alla nuova. Da lì ogni fotogramma ricava u, la pagina nella casella di mezzo, fermata vicino ai capi (fra la quarta e la quartultima con un vicino per lato), e la casella del carrello, m + pagina − u: nel mezzo resta ferma e scorrono i numeri, vicino ai capi u si ferma e viaggia il carrello. Un salto di quaranta pagine le fa passare tutte, e un clic a metà strada riparte da dove il nastro è arrivato.
Ogni pagina ha la sua posizione sul nastro, r = m + p − u, fermata fra la prima e l'ultima casella dei puntini. Quanto si vede è il minimo fra r − eL e l'ultima casella − r − eR, dove eL ed eR dicono quanto sono aperti i puntini (0 quando la casella tiene la seconda o la penultima pagina). Così una pagina che entra nei puntini si stringe sull'asse wdth del carattere fino a 62, si schiaccia e svanisce nella stessa casella dove i puntini si stanno formando, e le regole classiche della paginazione (i puntini solo se nascondono almeno due pagine) vengono da sole.
Il nastro è disegnato due volte, uguale: i numeri scuri e sopra quelli bianchi, ritagliati a ogni fotogramma con un clip-path inset dalle misure del carrello, angoli tondi compresi. Così un numero a metà strada è bianco dentro e scuro fuori, tagliato sul bordo. I due strati hanno la stessa grazia: il peso dei numeri cresce con la vicinanza al carrello in tutti e due, altrimenti le due metà non combacerebbero. Il carrello segue la sua casella su una molla, il nastro lo trascina con la sua velocità e si allunga quando corre.
Sotto la barra ogni numero è una fila di finestrelle, una per cifra, con dentro una colonna di cifre ripetuta due volte, così una finestra va avanti da 9 a 0 senza tornare indietro. Ogni finestra va alla sua nuova cifra con la stessa durata e la stessa curva del nastro, le cifre iniziali che non servono si chiudono in larghezza. Una regione aria-live nascosta dice ai lettori di schermo Results 71 to 80 of 472.
Sotto il nastro ci sono le caselle vere: link con href ?page=N e aria-label Page N, aria-current sulla pagina attuale, i puntini come pulsanti Ahead 5 pages, to page 12. Il loro testo è trasparente e i numeri che si vedono stanno sul nastro, aria-hidden; senza lo script i link si vedono e funzionano. Le caselle cambiano subito, il nastro le raggiunge; il fuoco della tastiera passa alla nuova pagina attuale. Quando niente si muove il ciclo smette di disegnare. L'anteprima della libreria clicca a turno la pagina 1, la pagina dopo quella attuale, i puntini e Next: hanno data-autoclic.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
RESULTS | script.js | 472 | Quanti risultati ha l'elenco. |
PER_PAGE | script.js | 10 | I risultati di ogni pagina. |
START | script.js | 7 | La pagina aperta quando il componente si carica. |
NEIGHBOURS | script.js | 1 | Le pagine mostrate da ogni lato di quella attuale (meno su uno schermo stretto, se non ci stanno). |
SKIP | script.js | 5 | Quante pagine salta un clic sui puntini. |
STEP | script.js | 0.5 | I secondi che il nastro ci mette a spostarsi di una pagina (un salto lontano un po' di più). |
FAR | script.js | 1.1 | Il tempo più lungo di un salto, in secondi, per quanto lontano vada. |
TURN | script.js | 0.5 | Quanto girano i puntini per ogni pagina che ci si avvolge dentro, in giri (0,5: mezzo giro, e tornano dritti). |
SWAY | script.js | 1 | Quanto il nastro trascina il carrello prima che torni indietro sulla molla (0 per niente). |
SMEAR | script.js | 1 | Quanto lasciano la scia i numeri quando il nastro corre forte (0 niente scia). |
WIND | script.js | 0.16 | Quanto si caricano le bobine col mouse sopra una freccia, in pagine (0,16: un piccolo giro). |
Sotto un elenco lungo diviso in pagine: i risultati di una ricerca, gli ordini di un negozio, l'archivio di un blog, una tabella di un pannello di controllo. Il nastro fa vedere dove si va e quanta strada si fa, anche in un salto di quaranta pagine, e la riga sotto dice subito quali risultati ci sono.
La barra si stringe allo schermo con 16 pixel di margine per lato (358 pixel su un telefono di 390) e scende a 56 di altezza, coi tasti di 40; ogni pagina è un bersaglio di circa 34 per 44 pixel. Se i vicini scelti non ci stanno con caselle di almeno 34 pixel se ne mostrano meno, e un numero lungo che non entra nella sua casella si stringe sull'asse della larghezza. Il dito sopra una freccia carica le bobine come il mouse, e una pagina premuta si rimpicciolisce sul nastro.
Il nastro non scorre: numeri e carrello si dissolvono e ricompaiono già sulla pagina nuova, le cifre dei risultati si scambiano in dissolvenza, i puntini non girano. All'arrivo il componente compare solo in dissolvenza; niente molla, niente scia, niente bobine che si caricano.
GSAP 3.15.0, Archivo (font variabile) 5.3.0.
Compressi con gzip, i tre file della demo pesano 12 KB; le librerie: GSAP 28 KB.
Provata il 6 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.