Vai al contenuto
animorio
EN
Torna alla libreria

La galleria in diagonale

Una fila infinita inclinata di otto gradi, con i quadri raddrizzati, che scivola di lato mentre scorri la pagina e si trascina e si lancia con l'inerzia.

Immagini, ScrollGSAPMediaGratis

Scorri dentro l’anteprima

Il codice

Una cartella che funziona da sola: index.html, style.css, script.js e le librerie da CDN.

<!doctype html>
<html lang="it">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>La galleria in diagonale</title>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/mona-sans@5.3.0/standard.css">
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <svg class="disegni" aria-hidden="true" focusable="false" width="0" height="0">
    <defs>
      <symbol id="d-girasole" viewBox="0 0 200 200">
        <rect width="200" height="200" fill="#F3E9D2" />
        <g fill="#2F5DA8"><circle cx="0" cy="0" r="46" /><circle cx="200" cy="0" r="46" /><circle cx="0" cy="200" r="46" /><circle cx="200" cy="200" r="46" /></g>
        <g fill="#2F5DA8" transform="translate(100 100)">
          <ellipse rx="12" ry="40" cy="-38" /><ellipse rx="12" ry="40" cy="-38" transform="rotate(45)" /><ellipse rx="12" ry="40" cy="-38" transform="rotate(90)" /><ellipse rx="12" ry="40" cy="-38" transform="rotate(135)" />
          <ellipse rx="12" ry="40" cy="-38" transform="rotate(180)" /><ellipse rx="12" ry="40" cy="-38" transform="rotate(225)" /><ellipse rx="12" ry="40" cy="-38" transform="rotate(270)" /><ellipse rx="12" ry="40" cy="-38" transform="rotate(315)" />
        </g>
        <circle cx="100" cy="100" r="22" fill="#E2A93B" />
      </symbol>
      <symbol id="d-onda" viewBox="0 0 200 200">
        <rect width="200" height="200" fill="#E7EEF3" />
        <g fill="none" stroke-width="14" stroke-linecap="round">
          <path d="M-10 40 Q15 16 40 40 T90 40 T140 40 T190 40 T240 40" stroke="#1E4F8C" />
          <path d="M-10 80 Q15 56 40 80 T90 80 T140 80 T190 80 T240 80" stroke="#3D7CC2" />
          <path d="M-10 120 Q15 96 40 120 T90 120 T140 120 T190 120 T240 120" stroke="#1E4F8C" />
          <path d="M-10 160 Q15 136 40 160 T90 160 T140 160 T190 160 T240 160" stroke="#3D7CC2" />
        </g>
      </symbol>
      <symbol id="d-stella" viewBox="0 0 200 200">
        <rect width="200" height="200" fill="#F6E7D8" />
        <path d="M100 18 L122 78 L182 100 L122 122 L100 182 L78 122 L18 100 L78 78 Z" fill="#B5452B" />
        <path d="M100 42 L141 59 L158 100 L141 141 L100 158 L59 141 L42 100 L59 59 Z" fill="none" stroke="#B5452B" stroke-width="6" />
        <rect x="80" y="80" width="40" height="40" fill="#F2C14E" transform="rotate(45 100 100)" />
      </symbol>
      <symbol id="d-foglia" viewBox="0 0 200 200">
        <rect width="200" height="200" fill="#EAF1E3" />
        <path d="M100 190 C100 140 100 80 100 14" stroke="#2F5C3C" stroke-width="5" fill="none" />
        <g fill="#3F7A4E"><ellipse cx="72" cy="60" rx="30" ry="13" transform="rotate(-30 72 60)" /><ellipse cx="128" cy="96" rx="30" ry="13" transform="rotate(30 128 96)" /><ellipse cx="72" cy="132" rx="30" ry="13" transform="rotate(-30 72 132)" /></g>
        <g fill="#6FA36A"><ellipse cx="128" cy="40" rx="24" ry="10" transform="rotate(30 128 40)" /><ellipse cx="72" cy="96" rx="24" ry="10" transform="rotate(-30 72 96)" /><ellipse cx="128" cy="150" rx="24" ry="10" transform="rotate(30 128 150)" /></g>
      </symbol>
      <symbol id="d-rombo" viewBox="0 0 200 200">
        <rect width="200" height="200" fill="#F4EEE6" />
        <path d="M100 8 L192 100 L100 192 L8 100 Z" fill="#2A3F6B" />
        <path d="M100 38 L162 100 L100 162 L38 100 Z" fill="#E0A43B" />
        <path d="M100 68 L132 100 L100 132 L68 100 Z" fill="#B94A36" />
      </symbol>
      <symbol id="d-nodo" viewBox="0 0 200 200">
        <rect width="200" height="200" fill="#EDE3F0" />
        <g fill="none" stroke="#5B3A7A" stroke-width="10">
          <circle cx="76" cy="76" r="44" /><circle cx="124" cy="76" r="44" /><circle cx="76" cy="124" r="44" /><circle cx="124" cy="124" r="44" />
        </g>
      </symbol>
      <symbol id="freccia" viewBox="0 0 24 24"><path d="M4 12h15M13 6l6 6-6 6" /></symbol>
    </defs>
  </svg>

  <header class="apertura">
    <p class="apertura__sopra">Una bottega di maiolica</p>
    <h1 class="apertura__titolo">Sei decori,<br>in diagonale</h1>
    <p class="apertura__testo">Scorri la pagina: la fila sale di traverso. Puoi anche trascinarla, o usare le frecce.</p>
  </header>

  <!-- la fila: inclinata di -8 gradi, ogni quadro raddrizzato di +8; le copie prima e dopo la fanno infinita -->
  <section class="galleria" data-galleria aria-label="Decori">
    <div class="galleria__inclinato">
      <div class="galleria__binario" data-binario>
        <figure class="vagone">
          <div class="vagone__quadro"><svg viewBox="0 0 200 200" preserveAspectRatio="xMidYMid slice" aria-hidden="true"><use href="#d-girasole" /></svg></div>
          <figcaption><span class="vagone__nome">Girasole</span><span class="vagone__nota">Blu cobalto e giallo zafferano</span></figcaption>
        </figure>
        <figure class="vagone">
          <div class="vagone__quadro"><svg viewBox="0 0 200 200" preserveAspectRatio="xMidYMid slice" aria-hidden="true"><use href="#d-onda" /></svg></div>
          <figcaption><span class="vagone__nome">Onda</span><span class="vagone__nota">Due azzurri che si inseguono</span></figcaption>
        </figure>
        <figure class="vagone">
          <div class="vagone__quadro"><svg viewBox="0 0 200 200" preserveAspectRatio="xMidYMid slice" aria-hidden="true"><use href="#d-stella" /></svg></div>
          <figcaption><span class="vagone__nome">Stella</span><span class="vagone__nota">Rosso mattone su crema</span></figcaption>
        </figure>
        <figure class="vagone">
          <div class="vagone__quadro"><svg viewBox="0 0 200 200" preserveAspectRatio="xMidYMid slice" aria-hidden="true"><use href="#d-foglia" /></svg></div>
          <figcaption><span class="vagone__nome">Foglia</span><span class="vagone__nota">Verde salvia e verde bosco</span></figcaption>
        </figure>
        <figure class="vagone">
          <div class="vagone__quadro"><svg viewBox="0 0 200 200" preserveAspectRatio="xMidYMid slice" aria-hidden="true"><use href="#d-rombo" /></svg></div>
          <figcaption><span class="vagone__nome">Rombo</span><span class="vagone__nota">Blu notte, ocra e ruggine</span></figcaption>
        </figure>
        <figure class="vagone">
          <div class="vagone__quadro"><svg viewBox="0 0 200 200" preserveAspectRatio="xMidYMid slice" aria-hidden="true"><use href="#d-nodo" /></svg></div>
          <figcaption><span class="vagone__nome">Nodo</span><span class="vagone__nota">Viola prugna, a mano libera</span></figcaption>
        </figure>
      </div>
    </div>
    <div class="galleria__frecce">
      <button class="freccia freccia--indietro" type="button" data-indietro aria-label="Decoro precedente"><svg aria-hidden="true"><use href="#freccia" /></svg></button>
      <button class="freccia" type="button" data-avanti aria-label="Decoro successivo"><svg aria-hidden="true"><use href="#freccia" /></svg></button>
    </div>
  </section>

  <section class="chiusura">
    <p>Ogni decoro nasce dipinto a mano su una piastrella cruda, poi va in forno una seconda volta. Nessuno è uguale al vicino.</p>
  </section>

  <script src="https://cdn.jsdelivr.net/npm/gsap@3.15.0/dist/gsap.min.js"></script>
  <script src="script.js"></script>
</body>
</html>

Cosa fa

Una fila di quadri grandi attraversa lo schermo di traverso, salendo verso destra, ma ogni quadro resta dritto. Mentre scorri la pagina la fila si sposta di lato, un pixel per ogni pixel di pagina; se la prendi col mouse o col dito la trascini più veloce del gesto, e lasciandola scivola ancora un poco e frena. Le frecce la spostano di un quadro alla volta. La fila non finisce mai: dopo l'ultimo decoro torna il primo.

Come funziona

Inclinata, ma dritta

Il contenitore della fila ruota di -8 gradi e ogni quadro ruota di +8: il binario corre sulla diagonale, le immagini restano in piedi. Lo spostamento si dà al binario dentro il contenitore ruotato, così avanza lungo la diagonale e non in orizzontale.

Senza fine

Gli originali stanno in mezzo a due serie di copie. La posizione passa per gsap.utils.wrap(-giro/2, giro/2), dove il giro è la larghezza di una serie: quando esce da un lato rientra dall'altro, e con copie identiche lo scatto non si vede.

Una posizione sola

Scorrimento della pagina, trascinamento, lancio, frecce e deriva cambiano tutti lo stesso bersaglio; ogni fotogramma la posizione vera lo insegue con una frenata indipendente dai fotogrammi al secondo (0,08 mentre trascini, 0,12 dopo).

Il lancio

Durante il trascinamento si tengono gli ultimi cinque spostamenti; lasciando andare, la loro velocità media per 1200 diventa un momento che si aggiunge al bersaglio e perde il 6% ogni sessantesimo di secondo.

Valori da cambiare

NomeFileDi partenzaCosa cambia
ACCOPPIATAscript.js1Pixel di lato per ogni pixel di pagina scorsa. Con 0 la fila si muove solo trascinandola.
TRASCINAscript.js2.5Quanto corre la fila rispetto al dito.
LANCIOscript.js1200Forza del lancio quando lasci andare.
DERIVAscript.js18Pixel al secondo di movimento da sola quando nessuno la tocca. Con 0 sta ferma.
--inclinazionestyle.css-8degQuanto sale la fila; al telefono -4 gradi.

Quando usarla

Per mostrare una collezione di immagini grandi (lavori, prodotti, stanze) in una sezione che si attraversa scorrendo, senza fermare la pagina.

Sul telefono

I quadri diventano quasi larghi quanto lo schermo e l'inclinazione scende a quattro gradi. Il dito in verticale scorre la pagina, in orizzontale trascina la fila.

Con il movimento ridotto

La fila resta inclinata ma ferma: niente deriva, niente legame con lo scorrimento e niente inerzia. Si trascina uno a uno e le frecce saltano al quadro dopo.

Trappole

  • Dai lo spostamento al binario dentro il contenitore ruotato, non al contenitore: altrimenti la fila scorre in orizzontale e non sulla diagonale.
  • Decidi l'asse dopo pochi pixel (touch-action: pan-y sulla sezione): in verticale il dito deve restare della pagina.
  • Le copie devono essere identiche e il giro deve essere la larghezza esatta di una serie (quadro più spazio, per il numero dei quadri), o l'avvolgimento scatta.
  • Nascondi le copie ai lettori di schermo (aria-hidden) o leggeranno ogni decoro tre volte.

Librerie

GSAP 3.15.0, Mona Sans (font variabile) 5.3.0.

Peso: 16 KB dei nostri file.

Collaudo

Provata il 27 settembre 2026

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

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