
Words that melt into each other
Text, Scroll, SVG
NewFree
Scroll inside the preview
A building cut in half like a doll’s house, with a glass lift in the middle: as you scroll the cabin rides up floor by floor, brakes, bounces on its cables, opens its doors and the floor switches on with its own little scene. The passenger bends the knees when it starts and rises on the toes when it brakes.
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 lift up the building</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/bricolage-grotesque@5.3.0/index.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource/dm-mono@5.3.0/500.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<!-- a made-up coworking building cut open like a doll's house. The stage sticks while you scroll: a glass lift rides
up the middle floor by floor, brakes and bounces, opens its doors, and the floor it stops at switches on.
The building, the rooms and the passenger are SVG drawn by the script -->
<main>
<section class="corsa" data-corsa>
<div class="palco">
<div class="finestra" data-finestra>
<svg class="palazzo" data-palazzo aria-hidden="true"></svg>
</div>
<aside class="testo">
<p class="testo__marchio">Halden Works · Coworking</p>
<div class="testo__testa">
<div class="quadro" aria-hidden="true">
<svg class="quadro__freccia" data-freccia viewBox="0 0 20 20"><path d="M10 2.5 17 11h-4.6v6.5H7.6V11H3z"/></svg>
<span class="quadro__cifra" data-cifra><span>G</span></span>
</div>
<div class="testo__nomi">
<p class="testo__piano" data-piano><span>Ground floor</span></p>
<h2 class="testo__titolo" data-titolo><span>Halden Works</span></h2>
</div>
</div>
<p class="testo__riga" data-riga><span>Six floors of desks, books and fresh air. Step in, the lift is waiting.</span></p>
<nav class="pulsantiera" data-pulsantiera aria-label="Floors"></nav>
<p class="testo__cenno" data-cenno>Scroll to ride up</p>
</aside>
</div>
</section>
<section class="uscita">
<p class="uscita__marchio">Halden Works</p>
<h2 class="uscita__titolo">Top floor. Mind the doors.</h2>
<a class="tasto" href="#"><span>Book a desk</span></a>
</section>
</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>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.
33 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 lift on scroll” from Animorio and fit it into my siteThe script draws everything in one SVG: the sky is the CSS background of the window, then a layer of clouds, then the world (ground, shaft, rooms, machine room, cabin, slabs). A floor is 340 units tall and every room is drawn in a box 380 wide, fixed to the shaft: on a phone the rooms are narrower and only the part near the lift shows, so the important things sit there. The back walls are a path with the window cut out (fill-rule evenodd), so the sky and the clouds show behind. The viewBox is as wide as the building and as tall as the window’s shape asks.
The scroll through the section becomes a position along the ride, split into pieces: stop (doors open), close, travel, open, stop, and so on up to the roof. From that number a function tells which floor the cabin is at (with power2.inOut on the journeys) and how open the doors are (back.out when opening, so they bang a little). The section is 100lvh tall plus as many lvh as there are pieces, so more floors means more scroll; SPEED shortens the journeys.
The braking is a spring: when the cabin finishes a journey it gets a kick in the way it was going and a lightly damped spring brings it back to the floor, so it overshoots and comes back two or three times; when it leaves, a small kick the other way makes it dip for a moment. The camera (a translate on the world group) follows the cabin without the bounce and slightly late, so the bounce shows; the clouds move at a third of the speed. Cables, counterweight and wheel come from the same position: the counterweight drops as much as the cabin rises.
The cabin’s speed is measured frame by frame and from it the acceleration, smoothed. The passenger is another spring pushed by that acceleration: when the cabin speeds up upwards the passenger lags behind and squashes (a vertical scale with the origin at the feet), when it brakes the passenger stretches. The arms open as hard as the push is and the bag jumps a bit more. SWAY sets how much the passenger reacts.
Every scene has two timelines: an entrance and a loop holding the endless repeats (screens, bag, ladder, drops, flag). When a floor’s doors are more than half open, the dark veil on the room goes off with a flicker, the entrance plays and the loop resumes with its timeScale rising from zero; when the cabin leaves the entrance plays backwards faster and the loop slows down to a stop. Numbers, text and panel follow the nearest floor; the title’s letters hop in word by word.
| Name | File | Default | What it changes |
|---|---|---|---|
FLOORS | script.js | 5 | How many floors above the lobby, from 2 to 5: the top one is always the roof terrace, the others are office, gym, library and garden, in that order. |
BOUNCE | script.js | 1 | How far the cabin overshoots the floor and bounces when it brakes (0 = it stops dead). |
SPEED | script.js | 1 | How fast the cabin rides: with 2 half the scroll takes it up a floor, with 0.5 it takes twice as much. |
SWAY | script.js | 1 | How much the passenger sinks and stretches when the cabin starts and brakes (0 = still as a statue). |
LIVELY | script.js | 1 | The speed of the floors’ little scenes once they are on: 2 is twice as fast, 0.5 half as fast. |
To tell a building or a layered offer one floor at a time: the site of a coworking space, a hotel, a new office, a sports centre, an agency showing its departments, a product with several price tiers, an “about us” page split by team.
The same animation with the sizes adapted: the building sits on top and the text below, the rooms are narrower and show the part near the lift (the back windows only appear on a computer), the panel is smaller.
No journey and no smooth scrolling: the building fades out and back in with the cabin already at the new floor, and the doors open with a fade. The rooms are already set up and light up with a fade, with nothing moving; the passenger stands still and the text changes with a fade.
GSAP 3.15.0, Lenis 1.3.26, Bricolage Grotesque (font variabile) 5.3.0, DM Mono 5.3.0.
Compressed with gzip, the three demo files weigh 21 KB; the libraries: GSAP + ScrollTrigger 45 KB, Lenis 5.3 KB.
Tested on 10 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.