
La striscia che si impenna
Scroll, 3D, WebGL, Immagini
Gratis
I progetti come pagine sottili in fila nello spazio, viste di lato: la rotella, le frecce o il dito fanno scorrere la fila, le pagine si piegano con la velocità e quella di mezzo esce dalla fila e si gira verso di te.
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>Pages lined up in space</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/bricolage-grotesque@5.3.0/standard.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/geist@5.3.0/index.css">
<link rel="stylesheet" href="style.css">
<script type="importmap">
{ "imports": {
"three": "https://cdn.jsdelivr.net/npm/three@0.178.0/build/three.module.min.js"
} }
</script>
</head>
<body>
<!-- the work page of a made-up designer. The projects are thin pages standing in a row in space, like magazines on a
shelf seen from the side; the wheel, the arrows or a finger move the row, the pages bend with the speed, and the
one in the middle steps out of the row and turns to face you -->
<main class="sala" data-sala>
<canvas class="tela" data-tela aria-hidden="true"></canvas>
<header class="testata">
<p class="firma">KAI VERO<sup>®</sup></p>
<p class="sopra">Selected work</p>
</header>
<section class="scheda" aria-live="polite">
<p class="scheda__tipo" data-tipo>Brand · editorial</p>
<h1 class="scheda__nome" data-nome>Paper Moons</h1>
<p class="scheda__frase" data-frase>A lunar calendar printed on tracing paper.</p>
</section>
<nav class="comandi" aria-label="Projects">
<button type="button" data-passo="-1" aria-label="Previous project">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M15 5l-7 7 7 7" fill="none" stroke="currentColor" stroke-width="1.6"/></svg>
</button>
<button type="button" data-passo="1" aria-label="Next project">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M9 5l7 7-7 7" fill="none" stroke="currentColor" stroke-width="1.6"/></svg>
</button>
</nav>
<p class="aiuto">Scroll, use the arrows or drag</p>
</main>
<!-- the projects: the script draws a cover for each one -->
<ul class="progetti" data-progetti hidden>
<li data-colore="#ff4b3e" data-carta="#f6efe6" data-forma="luna">Paper Moons|Brand · editorial|A lunar calendar printed on tracing paper.</li>
<li data-colore="#181818" data-carta="#e9e4da" data-forma="solchi">Low Tide Records|Label · website|A record label that only releases at high tide.</li>
<li data-colore="#3b5bdb" data-carta="#eef0f6" data-forma="griglia">Field Notes Co.|Product · launch|Notebooks with a ruler printed on the spine.</li>
<li data-colore="#f2b705" data-carta="#1d1b18" data-forma="onde">Sunday Ferry|Travel · app|Timetables for a ferry that runs once a week.</li>
<li data-colore="#2f9e44" data-carta="#f3f1ea" data-forma="foglie">Greenhouse 9|Studio · website|A plant nursery with a room for every season.</li>
<li data-colore="#e64980" data-carta="#191919" data-forma="cerchi">Neon Choir|Music · campaign|Posters for a choir that sings in car parks.</li>
<li data-colore="#1971c2" data-carta="#f1ede4" data-forma="righe">Blue Hour Hotel|Hospitality · brand|Rooms named after the minutes after sunset.</li>
<li data-colore="#e8590c" data-carta="#efe9df" data-forma="scala">Orange Steps|Archive · collection|Every staircase of a hill town, one a day.</li>
</ul>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.15.0/dist/gsap.min.js"></script>
<script type="module" 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.
42 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 «Le pagine in fila nello spazio» da Animorio e adattala al mio sitoLe pagine sono una sola scatola di Three.js, larga PAGE_W, alta PAGE_H e spessa un centesimo, divisa in 32 per 16 quadratini perché possa piegarsi, ripetuta COPIES volte con InstancedBufferGeometry. Ogni copia sa solo il suo numero e dove sta la sua copertina nell’atlante, una tela con tutte le copertine disegnate dallo script.
Nel vertex shader il posto di ogni pagina è il suo numero per SPACING meno lo scorrimento, riportato con mod dentro la lunghezza della fila: chi esce da una parte rientra dall’altra. Le pagine vicine al centro vengono spinte via di GAP spaziature con uno smoothstep, così quella di mezzo ha spazio intorno.
La piega è un’onda lungo l’altezza, sin(2y) per 0,4, moltiplicata per la velocità e per CURVE: ferma la fila, la velocità si spegne di un 0,829 a ogni fotogramma e le pagine tornano dritte. La pagina di mezzo gira di FOCUS_TURN sui tre assi, in proporzione a quanto è vicina al centro.
La camera è ortografica, senza prospettiva: vede VIEW unità dall’alto in basso, sta in alto a destra e guarda in basso verso la fila, che è ruotata di TILT. Lo script poi la fa scivolare di lato perché la pagina di mezzo cada dove vuole l’impaginazione; al telefono vede di più dall’alto in basso.
La rotella sposta un obiettivo e la fila lo raggiunge di FOLLOW a ogni fotogramma; a fine gesto si aggancia a una pagina, e un gesto piccolo vale comunque un passo. Per sapere che pagina c’è sotto il mouse lo script rifà i conti dello shader, senza la piega, e proietta i quattro angoli di ogni pagina sullo schermo; quella si alza in LIFT_TIME con power4.out. Il nome si sfoca di 8 pixel in 0,2 secondi e torna a fuoco in 0,85.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
GAP | script.js | 5.3 | Quanto spazio ha la pagina di mezzo da ogni parte, in spaziature (nel sito 5,3). |
CURVE | script.js | 2.25 | Quanto si piegano le pagine con la velocità (nel sito 2,25). |
FOCUS_TURN | script.js | [0.06681, -0.36331, -0.51318] | Come si gira la pagina di mezzo, in radianti sui tre assi (sono i numeri del sito). |
FOCUS_TIME | script.js | 1.1 | Quanto ci mette la pagina di mezzo a uscire e girarsi all’arrivo (nel sito 1,1, dopo 1,06). |
LIFT_ZOOM | script.js | 0.156 | Quanto si avvicina la copertina di mezzo sotto il mouse (nel sito 0,156). |
VIEW | script.js | 10.8 | Quanta scena vede la camera dall’alto in basso (nel sito 10,8). |
AUTO | script.js | 3.2 | I secondi di quiete prima che la fila vada avanti da sola; 0 per mai. |
Per la pagina dei lavori di un designer, di uno studio o di una rivista: pochi progetti con una bella copertina ciascuno, da sfogliare uno alla volta.
Uguale: la camera vede più spazio dall’alto in basso, la pagina di mezzo sta al centro dello schermo e la fila si fa scorrere col dito.
La fila è già al suo posto con la pagina di mezzo girata; le pagine cambiano di colpo, senza piega, e il nome cambia senza sfocarsi.
Three.js 0.178.0, GSAP 3.15.0, Bricolage Grotesque (font variabile) 5.3.0, Geist (font variabile) 5.3.0.
Compressi con gzip, i tre file della demo pesano 9,9 KB; le librerie: GSAP 28 KB, Three.js 174 KB.
Provata il 14 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.