
Falling tools
Physics, Hover
NewFree
A minimal-style physics animation: a net of very thin threads stretched in a frame, with a word printed on it. The pointer presses it like a finger on a trampoline, the mesh sinks and the word bends with it, getting heavier where the net pulls hardest; let go, it swings and settles. A click strikes it and a wave runs out to the frame.
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>Spanne</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>
<!-- a taut net of hairlines in a frame, with one word printed on it: the pointer presses the net like a finger
on a trampoline, and the word bends with the mesh -->
<main class="stage" data-stage>
<canvas class="net" data-net aria-hidden="true"></canvas>
<h1 class="sr" data-word>bounce</h1>
<p class="brand">Spanne</p>
<p class="hint" data-hint>Press the net. Click to strike it.</p>
</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 elastic net” from Animorio and fit it into my siteThe net is a grid of points, each with a depth. At a fixed step (a two hundred and fortieth of a second, several steps per frame) every point moves by Verlet integration: the new depth is the current one plus the difference from the previous one, slowed by DAMPING, plus the sum of the differences with its four neighbours times STIFFNESS. It is the wave equation on a cloth: the points of the frame stay at zero, so the waves bounce off them.
The pointer is a rounded tip: inside PUSH_RADIUS no point can sit higher than the shape of the tip (a bell, minus PUSH_DEPTH times the square of one minus the squared distance). The net is pushed down but keeps its speed, so when the finger lifts it bounces back on its own. A click instead changes the previous depth of a patch of net: it is a kick of speed, and a wave starts.
Seen from above, depth does not show: what shows is the threads sliding towards the dent. Each point is drawn shifted against the slope under it (the difference between the neighbours left and right, above and below), times SLIDE. The same slope is the tension: past a threshold the pieces of thread take the vermilion in three steps of transparency.
Each letter has its own fixed centre, measured on the fullest weight, and on every frame the word is repainted on a hidden canvas with each letter at its weight. Then every cell of the net that holds ink is split into two triangles, and each triangle copies its piece of the word with the exact affine map that takes the three flat corners onto the three bent ones, clipped a pixel wider so no joins show.
The weight of each letter follows, on a spring with a hair of bounce, the highest tension of the points under it, from LIGHT to HEAVY. When the real pointer has been gone for 2.4 seconds, a repeating GSAP timeline takes an invisible hand on a walk that comes back the same: it presses, lifts, strikes once and lets the net settle.
| Name | File | Default | What it changes |
|---|---|---|---|
WORD | script.js | 'bounce' | The word printed on the net (up to 12 letters). |
COLS | script.js | 36 | How many threads across (fewer on a phone). |
ROWS | script.js | 22 | How many threads down. |
STIFFNESS | script.js | 2400 | How taut the net is: 800 a hammock, 6000 a drum. |
DAMPING | script.js | 2.6 | How quickly a swing dies out: 0.8 rings for long, 8 stops at once. |
PUSH_RADIUS | script.js | 5 | How wide the finger is, in threads. |
PUSH_DEPTH | script.js | 70 | How deep the finger presses, in px. |
SLIDE | script.js | 0.8 | How much the threads slide towards the dent (0: depth only shows in the colour). |
STRIKE | script.js | 1 | How hard a click strikes the net. |
LIGHT | script.js | 300 | The weight of the word on a slack net (100 to 900). |
HEAVY | script.js | 820 | The weight where the net pulls hardest (100 to 900). |
For a heading you can touch: the opening of a design studio or an agency, the name of a product on a landing page, a 404 page to play with, a section of a sports site or a theme park. It works with any short word.
The same net, narrower and taller, with fewer threads across: the finger presses it while it rests on the screen, and lifting it the net bounces back. A tap also strikes it. The hint says Tap instead of Click.
Nothing moves: the net fades in flat, with the word light, and stays still; the pointer and the click do not bend it.
GSAP 3.15.0, Archivo (font variabile) 5.3.0.
Compressed with gzip, the three demo files weigh 7.9 KB; the libraries: GSAP 28 KB.
Tested on 21 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.