Vai al contenuto
animorio
EN
Torna alla libreria

La transizione a nastro di testo

Transizioni, TestoGSAP, Solo CSSMediaPeso compresso: Demo 5,9 KBGSAP 28 KBGratisScarica lo zip

Un cambio di pagina nello stile minimal: al clic ogni riga della pagina, l’etichetta, il titolo, il testo e il link, si rimpicciolisce e si stringe in una sola colonna di caratteri piccoli in mezzo allo schermo, come il nastro di una telescrivente. Il nastro scorre in su davanti a una testina sottile color vermiglio, porta via le righe vecchie e porta su quelle della pagina nuova, che si aprono al loro posto prendendo larghezza e peso con una molla, una dopo l’altra.

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>The ticker-tape transition</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" data-stage>
    <header class="bar">
      <span class="brand">Wire</span>
      <nav class="nav" aria-label="Pages">
        <button type="button" data-go="notes" aria-current="page">Notes</button>
        <button type="button" data-go="rooms">Rooms</button>
        <button type="button" data-go="about">About</button>
      </nav>
    </header>

    <!-- three pages of a made-up sound archive; on a change every line of the page runs into one narrow tape,
         the tape scrolls past a thin head and the lines of the new page open out into their places -->
    <section class="page" data-page="notes" aria-label="Notes">
      <p class="ln ln--kicker" data-role="kicker">Field notes</p>
      <h1 class="ln ln--title" data-role="title">Listen.</h1>
      <p class="ln ln--body" data-role="body">Notes from a studio that</p>
      <p class="ln ln--body" data-role="body">records the quiet parts</p>
      <p class="ln ln--body" data-role="body">of cities at night.</p>
      <a class="ln ln--go" data-role="go" href="#rooms" data-next="rooms" data-autoclic>Hear the rooms<svg viewBox="0 0 16 12" aria-hidden="true"><path d="M1 6h13M9 1.5 14 6l-5 4.5"/></svg></a>
    </section>

    <section class="page" data-page="rooms" aria-label="Rooms">
      <p class="ln ln--kicker" data-role="kicker">Recordings</p>
      <h2 class="ln ln--title" data-role="title">Rooms.</h2>
      <p class="ln ln--body" data-role="body">Twelve rooms, one microphone,</p>
      <p class="ln ln--body" data-role="body">the hum of every ceiling</p>
      <p class="ln ln--body" data-role="body">kept exactly as it was.</p>
      <a class="ln ln--go" data-role="go" href="#about" data-next="about" data-autoclic>Who we are<svg viewBox="0 0 16 12" aria-hidden="true"><path d="M1 6h13M9 1.5 14 6l-5 4.5"/></svg></a>
    </section>

    <section class="page" data-page="about" aria-label="About">
      <p class="ln ln--kicker" data-role="kicker">About</p>
      <h2 class="ln ln--title" data-role="title">Wire.</h2>
      <p class="ln ln--body" data-role="body">A small sound archive</p>
      <p class="ln ln--body" data-role="body">kept by two people</p>
      <p class="ln ln--body" data-role="body">and one long cable.</p>
      <a class="ln ln--go" data-role="go" href="#notes" data-next="notes" data-autoclic>Back to the notes<svg viewBox="0 0 16 12" aria-hidden="true"><path d="M1 6h13M9 1.5 14 6l-5 4.5"/></svg></a>
    </section>

    <!-- the head the tape runs past: a short hairline with a tick at each end -->
    <div class="head" data-head aria-hidden="true"><span class="head__tick"></span><span class="head__tick"></span></div>

    <footer class="foot">
      <span>Wire sound archive</span>
      <span>Listening room open on weekdays</span>
    </footer>
  </main>

  <script src="https://cdn.jsdelivr.net/npm/gsap@3.15.0/dist/gsap.min.js"></script>
  <script 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.

37 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 «La transizione a nastro di testo» da Animorio e adattala al mio sito

Cosa fa

Il sito di un archivio di suoni inventato, Wire, in tre pagine e quasi niente: Notes, Rooms e About, ognuna con un’etichetta, un titolo enorme in Archivo, tre righe di testo e un link con la freccia disegnata. All’apertura la prima pagina esce già dal nastro. Al clic su un link o su una voce del menu le righe della pagina corrono in mezzo allo schermo, prima il titolo, e diventano una colonna sola di caratteri piccoli e stretti (larghezza 62), una riga sotto l’altra come su un nastro di carta. Sotto la riga che passa compare la testina, un filo vermiglio con due tacche. Il nastro scorre in su con una partenza dolce e una frenata: le righe vecchie salgono e sbiadiscono, quelle nuove arrivano da sotto e ognuna, passando sulla testina, si accende di vermiglio. Quando le righe nuove sono davanti alla testina, la testina si spegne e ogni riga si apre al suo posto nella pagina: cresce fino alla sua misura, si allarga e prende peso con una molla, prima il titolo e poi le altre dall’alto in basso. Da sola la pagina cambia ogni due secondi e mezzo, nel giro Notes, Rooms, About.

Come funziona

Ogni riga è un blocco

Ogni riga della pagina (etichetta, titolo, testo, link) è un blocco su una riga sola (white-space: nowrap), mosso solo con le trasformazioni x, y e scale, con l’origine in alto a sinistra. La sua larghezza e il suo peso stanno nelle variabili --w e --g, legate nel CSS a font-stretch e font-weight con clamp, così GSAP le anima come numeri e la molla non porta mai il carattere fuori dagli assi di Archivo (62-125, 100-900).

Il nastro

Il nastro è una colonna in mezzo allo schermo con le righe a TAPE_SIZE per 1,9 pixel di distanza, la riga zero sulla testina. Per mandare una riga sul nastro si misura dove sta a riposo (getBoundingClientRect con la trasformazione tolta un attimo) e si calcolano lo spostamento fino al suo posto sul nastro e la scala, TAPE_SIZE diviso la sua misura del carattere. Le righe vecchie si mettono intorno alla testina, quelle nuove subito dopo, con due righe e mezza di spazio, già piccole e invisibili.

Lo scorrimento

Lo scorrimento è un tween di un solo numero, da zero a quanto serve per portare il centro delle righe nuove sulla testina, con power2.inOut; a ogni aggiornamento ogni riga si rimette a y dalla stessa formula. La trasparenza dipende dalla distanza dalla testina (sbiadisce sopra e sotto) e la riga che passa sulla testina diventa vermiglia. Tutto si calcola da quel numero, quindi il banco di montaggio può fermare e riavvolgere lo scorrimento.

La pagina che si apre

Finito lo scorrimento, ogni riga nuova torna a x 0, y 0 e scala 1 con elastic.out(1, SPRING), e larghezza e peso tornano ai suoi con back.out, sfalsate di STAGGER: prima il titolo, poi le altre dall’alto in basso. Alla fine le trasformazioni e le variabili si tolgono dalle righe, così la pagina resta com’è nel CSS e un resize non trova niente di scritto a mano.

Il giro, il telefono e il movimento ridotto

Un clic durante il cambio aspetta in coda; un resize porta subito il cambio alla fine. Da solo il sito gira le tre pagine con una gsap.delayedCall di HOLD secondi. Sul telefono le misure scendono (il titolo con min di vw e vh) e il nastro resta in mezzo. Col movimento ridotto la pagina nuova compare in dissolvenza sopra la vecchia, senza nastro.

Valori da cambiare

NomeFileDi partenzaCosa cambia
TAPE_SIZEscript.js15La misura in pixel dei caratteri sul nastro.
TAPE_WIDTHscript.js62La larghezza dei caratteri sul nastro, da 62 a 125 (la pagina torna alla sua).
GATHER_TIMEscript.js0.6I secondi che le righe vecchie impiegano a entrare nel nastro.
SCROLL_TIMEscript.js0.95I secondi dello scorrimento del nastro davanti alla testina.
OPEN_TIMEscript.js1.1I secondi che le righe nuove impiegano ad aprirsi al loro posto.
STAGGERscript.js0.05I secondi fra una riga e la successiva.
SPRINGscript.js0.5La molla dell’apertura: più basso oscilla di più, 1 quasi non oscilla.
HOLDscript.js2.6I secondi che ogni pagina resta prima che arrivi da sola la successiva.

Provali nel Playground

Quando usarla

Per passare da una pagina all’altra in un sito sobrio fatto di parole: un archivio, una rivista, un giornale, uno studio di suono o di grafica, un portfolio. Il nastro dice che la pagina nuova è fatta delle stesse righe di quella vecchia, solo rimesse in fila.

Sul telefono

La stessa transizione con le misure adattate: il titolo si misura sulla larghezza e sull’altezza dello schermo, il nastro resta in mezzo e la testina si accorcia. Un tocco sul link o sul menu cambia pagina.

Con il movimento ridotto

Niente si sposta: la pagina nuova compare in dissolvenza sopra la vecchia, con le righe già al loro posto, e non c’è nastro.

Trappole

  • Le righe si misurano con la trasformazione tolta per un attimo: con il transform di GSAP addosso getBoundingClientRect dà il posto sul nastro, non quello nella pagina.
  • Lo scorrimento non anima le righe una per una ma un numero solo, e a ogni aggiornamento rimette tutte le y: così le righe non si staccano dal nastro e il banco di montaggio può riavvolgerlo.
  • Le variabili --w e --g scritte da GSAP non si tolgono con clearProps: alla fine si tolgono con style.removeProperty, altrimenti la riga resta stretta alla pagina dopo.
  • La testina sta sotto la riga che passa, non in mezzo: in mezzo sembrava un testo barrato.

Librerie

GSAP 3.15.0, Archivo (font variabile) 5.3.0.

Compressi con gzip, i tre file della demo pesano 5,9 KB; le librerie: GSAP 28 KB.

Collaudo

Provata il 22 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