
The title that rises from a line
Transitions, Text, Images
NewFree
In the minimal style: a photo cut into horizontal slats, like a blind. The slats turn over one after another from the top, each on a spring that goes a few degrees too far and settles, and the next photo is already waiting behind; the caption changes letter by letter, narrowing and widening on the width axis.
A folder that runs on its own: index.html, style.css, script.js and the libraries from a CDN. The React and Vue tabs hold the same demo as a ready component, which switches its animations off when it leaves the page.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>The photo on turning slats</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>
<p class="mark">Lattis</p>
<!-- the plate: the script places it and cuts the photo into slats; behind them waits the next photo -->
<figure class="plate" data-plate role="img">
<div class="settle" data-settle>
<div class="behind" data-behind aria-hidden="true"></div>
<div class="slats" data-slats aria-hidden="true"></div>
</div>
<div class="ruler" data-ruler aria-hidden="true"></div>
<i class="marker" data-marker aria-hidden="true"></i>
<figcaption class="cap" aria-hidden="true">
<span class="cap__title" data-title></span>
<span class="cap__meta" data-meta></span>
</figcaption>
</figure>
</main>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.15.0/dist/gsap.min.js"></script>
<script src="script.js"></script>
</body>
</html>Change values, colours and text with the controls and watch the animation respond live. Or write in the code yourself. Then download the folder with your changes.
19 values to change
With the Animorio connector, Claude Code takes it from here, guide included, and fits it into your project. Paste this request:
Take “The photo on turning slats” from Animorio and fit it into my siteThe photo is cut into SLATS horizontal slats, each a div with two faces: on the front its strip of the current photo, on the back (turned by 180 degrees, with backface-visibility: hidden) the same strip of the next photo. Every face has the whole photo as its background, as big as the frame and moved up by the slat's distance from the top: so the still slats meet to the pixel. Under the slats there is a layer with the next photo, which shows through the gaps while they turn.
Every slat has an angle, a, and on every frame GSAP's ticker writes rotateX(a). To turn it goes from 0 to -180 degrees on a hand-made curve: the response of a damped spring, which starts still, goes OVERSHOOT degrees too far and settles. The damping comes from the overshoot you ask for, so the knob says exactly by how many degrees the slat misses before it settles.
The slats start one after another, STAGGER seconds apart, from the first at the top. As they turn they darken: over every face there is a dark veil whose opacity grows the more the face turns its back on the viewer (1 minus the cosine of the angle). A red tick runs down the ruler in step with the wave, and when the last slat lands the whole photo drops by one pixel and comes back with an elastic.
When the wave is over, every slat shows its back, that is the new photo. At that moment the fronts take the new photo, the backs and the layer underneath the one after that, and all the angles go back to zero: the picture stays identical and the next round starts from scratch. Every slat is one pixel taller than its share and sits under the next one, so between two still slats you never see a line of the photo behind.
The caption is in Archivo, a variable typeface with the wght and wdth axes, and every letter is a span with two CSS variables read by font-variation-settings. The old word leaves upwards letter by letter while its width drops to 62; the new one comes up from below at width 125 and weight 220, and settles at 100 with elastic.out and at weight 560. The line's box cuts the letters above and below, so the two words never touch.
| Name | File | Default | What it changes |
|---|---|---|---|
IMAGE_A | script.js | '' | The first photo: an address, or a file loaded in the Playground. Empty, the dune drawn by the script. The photo fills the portrait frame like background-size: cover. |
IMAGE_B | script.js | '' | The second photo (empty: the low tide drawn by the script). |
IMAGE_C | script.js | '' | The third photo (empty: the arch drawn by the script). |
CAPTIONS | script.js | [{ title: 'Dune', meta: 'f/8, 1/500 s' }, ...] | The captions of the three photos, in order: the word that changes letter by letter and the small line on the right. |
SLATS | script.js | 9 | How many slats the photo is cut into. |
STAGGER | script.js | 0.07 | The seconds between one slat and the next (0 = they all turn together). |
OVERSHOOT | script.js | 6 | By how many degrees a slat turns past its place before it settles (0 = it stops dead). |
HOLD | script.js | 2.6 | How many seconds every photo stays still before the slats turn again. |
To show a few photos calmly and with a recognisable gesture: the opening of a photographer's or an architect's portfolio, the rooms of a hotel or a holiday home, a restaurant's dishes, the covers of a travel blog. It works with any photo, including ones loaded in the Playground.
The same animation with the sizes adapted: the photo is almost as wide as the screen, the slats shorter, the ruler shorter and the caption smaller. A tap on the still photo turns the slats straight away.
Nothing turns or slides: the photos and the captions take turns with a slow dissolve, the next photo appears from underneath while the first one fades.
GSAP 3.15.0, Archivo (font variabile) 5.3.0.
Compressed with gzip, the three demo files weigh 9.8 KB; the libraries: GSAP 28 KB.
Tested on 16 October 2026
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.
With your account’s email and password.
or with your email
You’re signed in as .
With your account, you can download the zip of every animation and every pack, for free.