
Marquee that speeds up with scroll
Scroll, Text, Hover
Free
A big headline whose letters, near a cursor, turn for a moment into the symbols of a comic-strip curse, each in a colour of its own, and turn back into letters once the cursor has gone. The symbol is picked among those almost as wide as the letter, and the letters next door slide instead of jumping. Two cursors with name tags share the page: yours, and a colleague’s that wanders by itself.
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>Symbols under the cursor</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/instrument-sans@5.3.0/wdth.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<header class="bar">
<a class="brand" href="#"><span class="brand__mark" aria-hidden="true"></span>Redline</a>
<nav class="bar__nav" aria-label="Sections">
<a href="#">Product</a>
<a href="#">Pricing</a>
<a href="#">Changelog</a>
</nav>
<a class="bar__login" href="#">Log in</a>
</header>
<main class="hero">
<!-- the headline: the script splits it into letters; near a cursor they turn into symbols for a moment -->
<h1 class="title" data-scramble>Edit together,<br>swear less.</h1>
<p class="lead">Comments, suggestions and tracked changes for teams who write. Your cursor and theirs, on the same page.</p>
<div class="actions">
<a class="btn" href="#">Start a draft</a>
<a class="btn btn--ghost" href="#">See it live</a>
</div>
</main>
<!-- the two cursors: yours follows the mouse, the colleague's wanders over the page -->
<div class="cursor" data-cursor="you" aria-hidden="true">
<div class="cursor__body" data-body>
<svg class="cursor__arrow" viewBox="0 0 24 28"><path d="M3 2.5 21 15.6l-7.7 1.1 4.6 8.4-3.3 1.8-4.6-8.4L3.6 23.7z"/></svg>
<span class="cursor__chip">You</span>
</div>
</div>
<div class="cursor cursor--mate" data-cursor="mate" aria-hidden="true">
<div class="cursor__body" data-body>
<svg class="cursor__arrow" viewBox="0 0 24 28"><path d="M3 2.5 21 15.6l-7.7 1.1 4.6 8.4-3.3 1.8-4.6-8.4L3.6 23.7z"/></svg>
<span class="cursor__chip" data-mate-name>Mara</span>
</div>
</div>
<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.
36 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 “Symbols under the cursor” from Animorio and fit it into my siteThe headline is split into words, which never break in the middle, and into letters: each letter is a box with the glyph inside. The box is there to slide, the glyph to hop. The headline keeps its whole text in aria-label, for whoever listens to it.
Once the font has loaded, the script measures on a canvas, at 100 pixels, the width of every letter and every symbol, and lines up for each letter the symbols from the most similar to the most different. Usually it draws one among the six closest, weighted 1/(1 + difference); with probability WILD it takes one further away, up to 60 pixels of difference, and then the most different weigh most.
Every frame the centre of every letter is measured. A cursor starts the game if it is inside the REACH oval of at least one letter, in letter heights; then every letter inside the bigger SPREAD oval changes. Each one books its change for between 0 and SWAP milliseconds later, and those that leave the oval turn back between 0 and RESTORE. Every REROLL pixels the cursor travels, the symbols are shuffled again. Two letters side by side never get the same colour or the same symbol.
When a symbol is wider than its letter, everything after it moves. The script reads every letter’s offsetLeft every frame: if it has changed, the letter takes an equal and opposite offset and wins back a DRIFT share of it each frame. So on screen the letters slide to where they have to go.
Your cursor and the colleague’s are two fixed elements moved with a transform. Each leans with its sideways speed and rises with its overall speed, on a spring: stiffness 0.16 and damping 0.8 every sixtieth of a second, with speed counting up to 28 pixels a frame. The colleague runs a figure of eight over the headline in LAP seconds, and the cursor is like yours: it changes letters too.
| Name | File | Default | What it changes |
|---|---|---|---|
SYMBOLS | script.js | !@#$%^&*>< | The symbols the letters turn into. |
COLORS | script.js | #744cf6, #3fa9f5, #e0a91f, #ff5004, #6fa52f | The symbols’ colours; two letters side by side never share one. |
REACH | script.js | 0.6, 0.55 | How close a cursor must come to a letter for the game to start, in letter heights: sideways, and up or down. |
SPREAD | script.js | 1.7, 1.3 | How far around the cursor the letters change, in letter heights: sideways, and up or down. |
REROLL | script.js | 16 | The pixels a cursor travels before the symbols change again. |
SWAP | script.js | 70 | The longest wait before a letter changes, in milliseconds. |
RESTORE | script.js | 150 | And before it turns back into a letter. |
HOP | script.js | 0.09 | How far below the line a new symbol starts before hopping into place, in letter heights. |
WILD | script.js | 0.22 | The chance of a symbol much wider or narrower than the letter. |
DRIFT | script.js | 0.24 | How much of their way the letters moved by a wide symbol win back every frame. |
TILT | script.js | 7.2 | How far a cursor leans when it runs sideways, in degrees; a little more over the headline. |
LIFT | script.js | 1.9 | How far a fast cursor rises, in pixels. |
MATE | script.js | Mara | The name of the colleague who wanders over the headline; empty, nobody is there. |
LAP | script.js | 13 | The seconds the colleague takes for one lap. |
For the opening headline of a site that has to do with writing, play or working together: an app, a studio, a magazine. It wants a short, big headline, two lines at most, and a solid sans serif in which the symbols do not look like a mistake. On a long text meant to be read it would get in the way.
There is no cursor of yours, because there is no mouse: the game is played by the colleague’s cursor, which wanders over the headline on its own, and by a finger on the headline, while it stays down. The headline drops to 46-72 pixels.
There is no colleague and the cursors do not lean. The letters near your cursor still change, but without hopping or sliding: glyph and colour change in place.
GSAP 3.15.0, Instrument Sans (font variabile) 5.3.0.
Compressed with gzip, the three demo files weigh 6.8 KB; the libraries: GSAP 28 KB.
Tested on 2 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.