Vai al contenuto
animorio
EN
Torna alla libreria

Le pagine in fila nello spazio

WebGL, 3D, ImmaginiWebGL, GSAPImpegnativaPeso compresso: Demo 9,9 KBGSAP 28 KBThree.js 174 KBGratisScarica lo zip

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.

Il codice

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>&reg;</sup></p>
      <p class="sopra">Selected work</p>
    </header>

    <section class="scheda" aria-live="polite">
      <p class="scheda__tipo" data-tipo>Brand &middot; 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>

Playground

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

Oppure chiedila a Claude Code

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 sito

Cosa fa

La pagina dei lavori di Kai Vero, un designer inventato. Su un fondo grigio chiaro i progetti sono pagine sottili, in piedi in una lunga fila che attraversa lo schermo in diagonale, come riviste su uno scaffale viste di lato; ogni pagina ha una copertina disegnata. All’arrivo la fila scivola al suo posto frenando, e dopo un secondo la pagina di mezzo si stacca: le altre si allontanano lasciandole spazio da tutte e due le parti, e lei si gira verso chi guarda. Con la rotella, le frecce, i pulsanti o trascinando, la fila scorre di una pagina alla volta e non finisce mai; mentre corre, le pagine si piegano in una curva morbida, più forte quanto più vanno veloci, e tornano dritte quando si fermano. Passando col mouse su un’altra pagina, quella si alza un poco; cliccandola, arriva in mezzo. In basso a sinistra il nome del progetto si sfoca e torna a fuoco a ogni cambio, e tutta la fila si gira appena verso il mouse.

Come funziona

Una mesh, tante copie

Le 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.

La fila che non finisce

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 e la rotazione

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

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, il mouse e il nome

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.

Valori da cambiare

NomeFileDi partenzaCosa cambia
GAPscript.js5.3Quanto spazio ha la pagina di mezzo da ogni parte, in spaziature (nel sito 5,3).
CURVEscript.js2.25Quanto si piegano le pagine con la velocità (nel sito 2,25).
FOCUS_TURNscript.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_TIMEscript.js1.1Quanto ci mette la pagina di mezzo a uscire e girarsi all’arrivo (nel sito 1,1, dopo 1,06).
LIFT_ZOOMscript.js0.156Quanto si avvicina la copertina di mezzo sotto il mouse (nel sito 0,156).
VIEWscript.js10.8Quanta scena vede la camera dall’alto in basso (nel sito 10,8).
AUTOscript.js3.2I secondi di quiete prima che la fila vada avanti da sola; 0 per mai.

Provali nel Playground

Quando usarla

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.

Sul telefono

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.

Con il movimento ridotto

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.

Trappole

  • Nello shader half è una parola riservata: una variabile chiamata così non compila, e Three.js mostra solo lo schermo vuoto.
  • Con l’aggancio a fine gesto, uno scatto della rotella sposta la fila di meno di mezza pagina e l’aggancio la riporta indietro: un gesto piccolo deve valere comunque un passo nella sua direzione.
  • Il controllo del mouse va fatto con la matrice della mesh (matrixWorld) prima di proiettare: i conti dello shader sono nello spazio della mesh, che è spostata e ruotata.
  • La parte della copertina che finisce sui fianchi sottili delle pagine va coperta col colore della carta (si riconosce dalla normale), o sui bordi si vedono righe stirate.

Librerie

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.

Collaudo

Provata il 14 ottobre 2026

  • Computer: Fatto
  • Telefono: Fatto
  • Movimento ridotto: Fatto
  • Safari su iPhone: Da fare

Licenza d’uso

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.

Tutte le animazioni