Vai al contenuto
animorio
EN
Torna alla libreria

Il titolo che scopre la foto

Scroll, Testo, ImmaginiGSAP, Solo CSS, CanvasMediaPeso compresso: Demo 12 KBGSAP + ScrollTrigger 45 KBGratisScarica lo zip

Scorri dentro l’anteprima

L’apertura di un grande reportage: su carta chiara un titolo enorme in serif, e la foto si vede solo dentro le sue lettere. Scorrendo il titolo cresce dentro una lettera finché la foto esce e riempie lo schermo, poi si stringe in una cornice con la didascalia e sotto comincia l’articolo, con il capolettera.

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 headline that opens the photo</title>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/bodoni-moda@5.3.0/index.css">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/newsreader@5.3.0/opsz.css">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/newsreader@5.3.0/opsz-italic.css">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/schibsted-grotesk@5.3.0/index.css">
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <!-- the opening of the feature: a tall section with a pinned screen inside; scrolling through it opens the photo -->
  <section class="opener" data-opener>
    <div class="stage" data-stage>
      <header class="mast" data-fade="up">
        <div class="mast__row in">
          <a class="mast__name" href="#">Halyard</a>
          <span class="mast__tag">A quarterly of the sea</span>
          <span class="mast__date">Autumn 2026</span>
        </div>
        <span class="mast__rule" data-rule></span>
      </header>

      <div class="cover">
        <p class="kicker" data-fade="up">
          <span class="in"><span class="kicker__section">The Long Read</span><span class="kicker__sep" aria-hidden="true"></span><span class="kicker__place">North Atlantic</span></span>
        </p>
        <h1 class="cover__title" data-headline>Salt</h1>
        <!-- an empty box as tall as the headline: the script draws the letters over it -->
        <div class="cover__slot" data-slot aria-hidden="true"></div>
        <p class="standfirst" data-fade="down">
          <span class="in">On the last island where the weather still decides when the boats go out, a village of forty-one people has learned the slow art of waiting.</span>
        </p>
        <p class="byline" data-fade="down">
          <span class="in"><span>Words by <b>Ines Harlow</b></span><span>Photographs by <b>Tomas Vey</b></span><span class="byline__time">18 min read</span></span>
        </p>
      </div>

      <p class="hint" data-hint>
        <span class="in">Scroll to read
          <svg class="hint__arrow" data-arrow viewBox="0 0 12 18" aria-hidden="true"><path d="M6 1v15M1 11l5 5 5-5" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg>
        </span>
      </p>

      <!-- the photo: at first it shows only through the letters of the headline, at the end it is the whole frame -->
      <svg class="art" data-art aria-hidden="true">
        <defs>
          <clipPath id="headline-clip" clipPathUnits="userSpaceOnUse">
            <text class="art__word" data-word></text>
          </clipPath>
        </defs>
        <g data-art-in>
          <!-- the clip sits on a group: on the image itself it would grow with the image -->
          <g clip-path="url(#headline-clip)"><image data-photo-in preserveAspectRatio="xMidYMid slice"/></g>
          <image data-photo-full preserveAspectRatio="xMidYMid slice" opacity="0"/>
        </g>
      </svg>

      <p class="caption" data-caption>
        <span>The harbour at Skarvik at ten to six, before the first boat leaves.</span>
        <span class="caption__credit">Tomas Vey for Halyard</span>
      </p>
    </div>
  </section>

  <article class="story">
    <p class="story__lead" data-reveal><span class="drop" aria-hidden="true"><span data-drop>E</span></span><span class="sr">E</span>very morning at a quarter past five, Aksel Dam walks to the end of the stone pier, takes off one glove and holds his hand up to the wind. He does not check his phone. The forecast, he says, is written by people who have never had to row home. If the air smells of iron, the boats stay in. If it smells of kelp and nothing else, the boats go out. On the morning I met him it smelled, he told me, of both, so we stood there for a long time and said nothing.</p>
    <p data-reveal>Skarvik has forty-one residents, one shop that opens when its owner remembers, and a harbour older than the church. For three centuries the village lived on cod, salted and dried on the flat rocks behind the houses until the whole bay smelled like a kitchen. The racks are still there, grey and silver, though nobody has hung a fish on them since the plant across the sound closed in 1998.</p>
    <p data-reveal>What the village kept is the salt. In a shed with a turf roof, Marit Joensen boils seawater in three iron pans over a driftwood fire, sixteen hours at a time, until what is left at the bottom looks like snow that has been told a secret. She sells it in paper bags to restaurants in cities she has never visited. The waiting list is two years long. She finds this funny.</p>
    <blockquote class="quote" data-quote>
      <span class="quote__rule" data-quote-rule></span>
      <p data-quote-text>The sea gives you the salt. It just wants you to stay up all night for it.</p>
      <span class="quote__rule" data-quote-rule></span>
    </blockquote>
    <p data-reveal>It would be easy to call Skarvik a place that time forgot. The people who live here would disagree. Time, they will tell you, is the one thing they have paid close attention to: the hour of the tide, the week the eider ducks come back, the single afternoon in March when the light returns over the ridge and every kitchen door in the village is opened at once.</p>
  </article>

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

33 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 «Il titolo che scopre la foto» da Animorio e adattala al mio sito

Cosa fa

La prima pagina di un reportage di Halyard, una rivista del mare inventata. In alto la testata con un filetto sottile; al centro l’occhiello «The Long Read», la parola «Salt» in Bodoni nerissimo larga quasi tutta la pagina, il catenaccio in corsivo e la firma. Dentro le lettere si vede una foto: un porto all’alba, con il promontorio scuro, il sole basso sul mare, una barca e un faro. All’arrivo la foto entra nelle lettere con un leggero assestamento e le scritte salgono una dopo l’altra. Scorrendo, occhiello e testata salgono e svaniscono, catenaccio e firma scendono e svaniscono, mentre il titolo cresce dentro la «l» fino a quaranta volte: le altre lettere escono dallo schermo e la foto riempie tutto. Poi la foto si stringe in una cornice, compare la didascalia con il fotografo e sotto partono i paragrafi, il primo con il capolettera che sale dalla sua riga, e una citazione fra due filetti che si disegnano.

Come funziona

Un palco fermo

Una sezione alta (1 + LENGTH) schermi con dentro un palco sticky alto 100lvh. Un solo ScrollTrigger con scrub porta una timeline da 0 a 1, e la timeline muove quattro numeri: quanto è cresciuto il titolo, quanto è grande la foto, quanto è coperta la carta e quanto è chiusa la cornice. Una funzione sola li disegna.

Il titolo come finestra

Sopra la pagina c’è un SVG grande quanto lo schermo, con la foto in un <image> e un clipPath fatto di testo: la parola WORD in Bodoni Moda 900. Il clipPath va su un gruppo intorno all’immagine, non sull’immagine: lì crescerebbe insieme alla foto. Lo script misura le lettere con measureText e sceglie la grandezza che riempie la larghezza; nella pagina un riquadro vuoto alto come il titolo tiene il posto.

La lettera dove entrare

La lettera LETTER si disegna da sola in un canvas e una mappa delle distanze in due passate trova il suo punto più spesso, il più lontano dal bordo. Il titolo cresce intorno a quel punto con scala GROW elevato al progresso, così si avvicina sempre allo stesso ritmo, e intanto il punto scivola al centro dello schermo: la lettera copre tutto il prima possibile.

La foto esce e si incornicia

Verso la fine della crescita una seconda copia della foto, senza ritaglio, sale da trasparente a piena: se la lettera non bastasse, la carta sparisce comunque. Poi clip-path: inset() stringe la foto dai lati di FRAME e dall’alto e dal basso, mentre la foto passa da 1,06 a 1 e si assesta. La didascalia sale sotto la cornice.

La foto e l’articolo

La foto è un disegno SVG a strati (cielo, sole, foschia, colline, mare con i riflessi, promontorio con la roccia, faro, barca, grana e vignettatura) cotto una volta in un JPEG su canvas: muovere un’immagine non costa niente. Sotto, ogni paragrafo sale con un ScrollTrigger suo, il capolettera esce da una scatola che taglia, i filetti della citazione si disegnano dal centro.

Valori da cambiare

NomeFileDi partenzaCosa cambia
WORDscript.js'Salt'Il titolo, una o due parole: la foto si vede solo dentro le sue lettere. Sul telefono due parole vanno su due righe.
GROWscript.js40Quante volte cresce il titolo alla fine dello zoom.
LETTERscript.js2La lettera in cui entra lo zoom, contando da 0 e senza gli spazi: con «Salt», 2 è la «l».
LENGTHscript.js2.6Quanto dura l’apertura, in altezze di finestra di scorrimento.
SCRUBscript.js0.9I secondi che l’apertura impiega a raggiungere lo scorrimento: più alto, più morbido.
FRAMEscript.js0.07Quanto si stringe la foto dai lati alla fine, in parte della larghezza.

Provali nel Playground

Quando usarla

Per aprire un articolo lungo, un reportage, un caso studio o la pagina di un progetto: un titolo corto e forte e una foto che valga lo schermo intero. Funziona meglio con parole brevi e lettere spesse, in un serif nero o in un bastoni pesante.

Sul telefono

Il titolo riempie la larghezza dello schermo stretto (due parole vanno su due righe) e lo zoom entra nella stessa lettera, fino a coprire tutto. La cornice finale è verticale, con più spazio sotto per la didascalia su due righe.

Con il movimento ridotto

Niente cresce e niente si sposta: scorrendo le scritte svaniscono, le lettere con la foto si dissolvono e al loro posto si dissolve dentro la foto già nella sua cornice, con la didascalia. I paragrafi e la citazione compaiono solo con una dissolvenza.

Trappole

  • Il clip-path messo direttamente sull’<image> usa lo spazio dell’immagine, transform compreso: ingrandendo la foto crescono anche le lettere. Va su un gruppo che la contiene.
  • Scalare il testo dal suo centro non basta: a quaranta volte il centro di una lettera può essere un buco (la pancia della «a») e lo schermo resta di carta. Si entra nel punto più spesso della lettera, trovato con una mappa delle distanze.
  • Con una crescita in linea retta la lettera copre lo schermo nel primo quarto e il resto dello scorrimento non mostra niente: la scala GROW elevato al progresso cresce dello stesso fattore a ogni passo.
  • Una foto disegnata con sfocature e grana, mossa a ogni passo dello scroll, si ridisegna da capo e scatta: va cotta una volta in un’immagine.
  • Le misure si prendono solo a caratteri caricati (document.fonts.load con la parola): con il carattere di ripiego il titolo non riempie la riga e la lettera di centro è nel posto sbagliato.
  • Sul telefono la barra del browser cambia l’altezza mentre si scorre: rifare le misure a ogni resize fa saltare il titolo. Si rifanno solo se cambia la larghezza o l’altezza cambia di molto.

Librerie

GSAP 3.15.0, Bodoni Moda (font variabile) 5.3.0, Newsreader (font variabile) 5.3.0, Schibsted Grotesk (font variabile) 5.3.0.

Compressi con gzip, i tre file della demo pesano 12 KB; le librerie: GSAP + ScrollTrigger 45 KB.

Collaudo

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