
Parole che si fondono
Testo, Scroll, SVG
NuovaGratis
Scorri dentro l’anteprima
La pagina di un museo del mare: scendendo, un piccolo sottomarino giallo si tuffa dalle onde e scende fino al fondale. La luce cala per fasce di profondità, i banchi di pesci si aprono al suo passaggio, passano meduse, un calamaro e un polpo dumbo, e nel buio il faro accende un cono di luce che a 4.800 metri spazza un relitto. Un contametri meccanico conta la profondità.
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 submarine in the deep</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/martian-mono@5.3.0/index.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<!-- the header of the made-up museum -->
<header class="testata">
<p class="marchio">Bellwether <span>Sea Museum</span></p>
<a class="testata__link" href="#fine"><span>Plan a visit</span></a>
</header>
<main>
<!-- the dive: a tall section with a still stage; scrolling moves the camera down the water column -->
<section class="discesa" data-discesa>
<div class="palco" data-palco>
<svg class="mondo" data-mondo aria-hidden="true"></svg>
<svg class="buio" data-buio aria-hidden="true"></svg>
<svg class="sotto" data-sotto aria-hidden="true"></svg>
<!-- the opening, in the sky above the water -->
<div class="apertura" data-apertura>
<p class="apertura__etichetta" data-entra>New in the Deep Gallery</p>
<h1 class="apertura__titolo">
<span class="riga"><span data-riga>Down to</span></span>
<span class="riga"><span data-riga>the <em>dark.</em></span></span>
</h1>
<p class="apertura__testo" data-entra>Ride the little yellow sub <em>Pip</em> from the waves to the seabed, 4,800 metres below.</p>
</div>
<p class="cenno" data-cenno>
Scroll to dive
<svg viewBox="0 0 24 32" aria-hidden="true"><path d="M12 3V27M4 19L12 28L20 19" /></svg>
</p>
<!-- one caption for every band of depth -->
<div class="didascalie" data-didascalie>
<article class="didascalia" data-zona="0">
<p class="didascalia__quota"><span>0 to 200 m</span></p>
<h2 class="didascalia__nome"><span>The sunlight zone</span></h2>
<p class="didascalia__testo"><span>Where the light still reaches. Most of the life in the sea crowds into this thin top layer.</span></p>
</article>
<article class="didascalia" data-zona="1">
<p class="didascalia__quota"><span>200 to 1,000 m</span></p>
<h2 class="didascalia__nome"><span>The twilight zone</span></h2>
<p class="didascalia__testo"><span>The blue fades to grey. Jellies drift past and whole schools rise every night to feed.</span></p>
</article>
<article class="didascalia" data-zona="2">
<p class="didascalia__quota"><span>1,000 to 4,000 m</span></p>
<h2 class="didascalia__nome"><span>The midnight zone</span></h2>
<p class="didascalia__testo"><span>No sunlight at all. From here on, the only light is the one Pip carries.</span></p>
</article>
<article class="didascalia" data-zona="3">
<p class="didascalia__quota"><span>4,000 to 6,000 m</span></p>
<h2 class="didascalia__nome"><span>The abyss</span></h2>
<p class="didascalia__testo"><span>Near-freezing water and hundreds of times the pressure of the air on your shoulders.</span></p>
</article>
<article class="didascalia" data-zona="4">
<p class="didascalia__quota"><span>On the seabed</span></p>
<h2 class="didascalia__nome"><span>The Argo Bell</span></h2>
<p class="didascalia__testo"><span>A cargo steamer lost in a winter storm in 1923, resting upright where no storm can reach her.</span></p>
</article>
</div>
<!-- the depth gauge: real numbers, counted as the sub goes down -->
<aside class="strumento" data-strumento aria-label="Depth gauge">
<p class="strumento__nome">Depth</p>
<p class="strumento__metri"><span class="contatore" data-contatore></span><span class="strumento__unita">m</span></p>
<dl class="strumento__dati">
<div><dt>Pressure</dt><dd data-pressione>1 atm</dd></div>
<div><dt>Sunlight</dt><dd data-luce>100%</dd></div>
</dl>
</aside>
<div class="scala" data-scala aria-hidden="true">
<div class="scala__binario"></div>
<svg class="scala__segno" data-segno viewBox="0 0 40 20"><path d="M6 10C6 5 11 3 20 3C29 3 35 6 35 10C35 14 29 17 20 17C11 17 6 15 6 10Z" /><path d="M16 3L18 0H24L25 3Z" /><path d="M1 6L6 10L1 14Z" /></svg>
</div>
</div>
</section>
<footer class="fine" id="fine">
<p class="fine__frase">Come down <em>with us.</em></p>
<p class="fine__testo">The Deep Gallery, open every day from ten. Pip is waiting at the bottom of the stairs.</p>
<a class="fine__bottone" href="#"><span>Plan your visit</span></a>
</footer>
</main>
<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="https://cdn.jsdelivr.net/npm/lenis@1.3.26/dist/lenis.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.
64 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 «Il sottomarino negli abissi» da Animorio e adattala al mio sitoLa sezione è alta DIVE_LENGTH+1 schermi e dentro c’è un palco sticky alto 100lvh con tre SVG uno sopra l’altro: il mondo, il buio e il sottomarino, tutti con il viewBox grande quanto il palco in pixel. Il mondo è un gruppo alto più di sei schermi (cielo, acqua con un gradiente a quattro fermate, pesci, meduse, relitto, fondale) che a ogni fotogramma scorre in su: la telecamera è solo un translate che tiene Pip fermo al 42% dell’altezza.
Le profondità vere non entrano in uno schermo in modo uniforme: 200 metri di luce contro 3.000 di mezzanotte. Una tabellina di nodi dice dove sta ogni profondità in schermi sotto le onde (0, 1,5, 3, 4,6, 5,8) e due funzioni, profondita(u) e quota(d), passano dall’una all’altra per tratti lineari. Così ogni fascia ha il suo pezzo di scorrimento, e il contatore legge sempre i metri giusti per la posizione di Pip.
Una sola timeline legata allo scorrimento con scrub muove un oggetto di numeri: p (quanto è sceso, con power1.inOut), luce (il faro, con elastic.out, così si accende tremolando), fine, mira e spazza (lo spostamento finale e il fascio che percorre il relitto). Le didascalie entrano nei momenti in cui Pip passa 200, 1.000 e 4.000 metri: il momento si trova invertendo la curva della discesa con trenta dimezzamenti.
Sopra il mondo c’è un rettangolo del colore del buio, con un’opacità che cresce con la profondità, e una maschera: un rettangolo bianco con il cono del faro in nero, sfumato con feGaussianBlur. Dove c’è il cono il buio sparisce e si vede il mondo sotto; sopra, lo stesso cono riempito con un gradiente caldo in mix-blend-mode screen fa la luce. Il cono segue il muso del sottomarino, ruotato con lui.
Ogni pesce ha un posto nel banco che nuota piano di lato e una molla smorzata: se il sottomarino o il puntatore sono entro un raggio, la meta della molla diventa uno spostamento verso fuori, più forte quanto più si è vicini, e il pesce ci arriva con un piccolo rimbalzo, girato secondo la velocità. Uscito Pip, la molla lo riporta al suo posto e il banco si richiude. Le meduse usano la stessa molla, più morbida.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
DIVE_LENGTH | script.js | 9 | Quanti schermi di scorrimento dura la discesa. |
MAX_DEPTH | script.js | 4800 | La profondità del fondale in metri, dove sta il relitto. |
FISH | script.js | 36 | Quanti pesci in ogni banco; il telefono ne ha circa tre quarti. |
PART | script.js | 1 | Quanto si aprono i banchi intorno al sottomarino e al puntatore. |
JELLIES | script.js | 6 | Quante meduse nella zona del crepuscolo. |
BEAM | script.js | 1 | Quanto è lungo e largo il fascio del faro. |
WEAVE | script.js | 1 | Quanto ondeggia di lato il sottomarino mentre scende. |
SNOW | script.js | 70 | Quanti fiocchi di neve marina passano nel fascio. |
--sottomarino | style.css | #ffc629 | Il giallo del sottomarino; accanto ci sono i colori dell’acqua a ogni profondità, del buio e del fascio. |
Per raccontare una discesa o una scala di grandezze: un museo del mare o di scienze, un acquario, una spedizione, un centro immersioni, la pagina di una ricerca oceanografica, ma anche una storia che va dal leggero al profondo, o i livelli di un prodotto.
La stessa discesa con le misure adattate: sottomarino, pesci e creature più piccoli, circa tre quarti dei pesci, il banco più largo rispetto allo schermo, il fascio più lungo, il relitto più piccolo e più al centro. La scala sul bordo è più corta e senza scritte. Un tocco su Pip lo fa scuotere e sbuffare bolle.
Niente telecamera che scorre, niente nuoto, niente bolle e niente scorrimento morbido: il palco mostra un’immagine ferma per ogni fascia (la superficie, la luce, il crepuscolo, la mezzanotte, l’abisso, il relitto) e scorrendo la successiva arriva in dissolvenza, con il faro già acceso dove è buio, il contatore sul numero della fascia e la sua didascalia.
GSAP 3.15.0, Lenis 1.3.26, Bricolage Grotesque (font variabile) 5.3.0, Martian Mono (font variabile) 5.3.0.
Compressi con gzip, i tre file della demo pesano 18 KB; le librerie: GSAP + ScrollTrigger 45 KB, Lenis 5,3 KB.
Provata il 10 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.