Skip to content
animorio
IT
Back to the library

Column shutter

Four columns of different widths drop like a staircase, the page changes underneath, then it is revealed. One gesture for loading and page changes.

TransitionsGSAPEasyFree

The code

A folder that runs on its own: index.html, style.css, script.js and the libraries from a CDN.

<!doctype html>
<html lang="it">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Otturatore a colonne</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>
  <header class="testata">
    <span class="marchio">Studio</span>
    <nav class="voci" aria-label="Pagine">
      <button type="button" class="voce" data-vai="lavori" aria-current="page">Lavori</button>
      <button type="button" class="voce" data-vai="studio" data-autoclic>Chi siamo</button>
    </nav>
  </header>

  <main>
    <section class="pagina pagina--lavori" data-pagina="lavori">
      <p class="sopra">Pagina uno</p>
      <h1 class="titolo">Lavori scelti</h1>
      <p class="testo">Clicca «Chi siamo»: l'otturatore cade a colonne, la pagina cambia sotto, poi le colonne risalgono a scalinata.</p>
    </section>
    <section class="pagina pagina--studio" data-pagina="studio" hidden>
      <p class="sopra">Pagina due</p>
      <h1 class="titolo">Chi siamo</h1>
      <p class="testo">La stessa mossa serve per il caricamento iniziale e per ogni passaggio fra pagine: chi guarda la riconosce e il sito sembra uno solo.</p>
    </section>
  </main>

  <!-- l'otturatore: quattro colonne di larghezze diverse -->
  <div class="otturatore" aria-hidden="true">
    <span style="--f: 22"></span><span style="--f: 18"></span><span style="--f: 38"></span><span style="--f: 22"></span>
  </div>

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

What it does

When you change page, four columns come down from the top one after another, not in a row but in a scattered order: the widest first. Once the page is covered, the content changes; then the columns keep going down and uncover the new page while the title rises from its mask. The same gesture opens the site on first load.

How it works

Columns of different widths

A fixed full-screen flex container with four spans and flex-grow 22, 18, 38, 22. Different widths are half of the effect: with equal columns it looks like a curtain.

A scattered order

The ORDINE array decides who goes first: [2, 0, 3, 1] starts the wide column, then the first, then the last. With a small stagger the edge becomes a staircase.

Down, then onwards

To close, scaleY goes from 0 to 1 with the origin at the top. To open, scaleY goes from 1 to 0 with the origin at the bottom: the column seems to carry on instead of going back.

The swap underneath

The vai() function awaits the closing (GSAP timelines can be awaited), swaps the content, starts the title entrance and then opens.

Values to change

NameFileDefaultWhat it changes
ORDINEscript.js[2, 0, 3, 1]The column order. Try [0, 1, 2, 3] for a sweeping curtain, [1, 3, 0, 2] for a jumpier rhythm.
DURATA / SFASATURAscript.js0.85 / 0.06Duration of each column and delay between them.
--findex.html22, 18, 38, 22The relative width of each column.
--colonnastyle.css#0b3b39The shutter colour.

When to use it

For page transitions and loading, when you want the whole site to have a recognisable signature. Not for opening menus or dialogs: it is too slow there.

On phones

Identical. The columns are proportional, so they work in portrait too.

With reduced motion

No shutter: the page changes instantly.

Pitfalls

  • On a multi-page site the shutter must already be closed on the new page's first paint: set the class from an inline script in the head, or you get a flash of the page before it closes.
  • Going back with the browser button, the page may come from the cache with the shutter closed: listen for pageshow with event.persisted and open it.
  • Never leave links stuck: if the animation does not run (background tab), a safety timer should change page anyway.
  • Safari on iPhone tints its bars with the colour of a full-screen fixed element, even when the columns are scaled to zero: when the shutter is open, set visibility: hidden on the container.

Libraries

GSAP 3.15.0, Mona Sans (font variabile) 5.3.0.

Weight: 7.0 KB of our own files.

Testing

Tested on 26 September 2026

  • Desktop: Done
  • Phone: Done
  • Reduced motion: Done
  • Safari on iPhone: Done

License

Use it in your own projects and in your clients’ projects. Do not resell it or redistribute it as is. GSAP stays under its own Standard license. Full license.

All animations