Lab · Experiment
Dictionary
of motion.
A reference of how words can move. Hover any entry to see its definition act itself out. Some entries breathe, pulse, and flicker whether you watch them or not. Filter by name, or jump to a category from the bar below.
A · Appear & Reveal
10 entriesB · Decay & Disappear
10 entriesC · Spring & Elastic
8 entriesD · Continuous
10 entries · always runningE · Force & Impact
8 entriesF · Distort
7 entriesG · Travel
8 entriesH · State Change
6 entriesI · Light & Energy
8 entriesJ · Sound-Feel
5 entriesK · Mechanical
8 entriesL · Trail & Double
5 entriesM · Glitch
5 entriesTake one home
Every entry on this page is a tiny self-contained recipe. The pattern: split the word into per-character spans, set an index variable on each, then run a keyframe animation with a staggered delay. Here's the smallest possible version, ready to paste into a project.
1 — Markup & tiny JS
<span class="word">bloom</span>
<script>
document.querySelectorAll('.word').forEach(word => {
const text = word.textContent;
word.textContent = '';
[...text].forEach((ch, i) => {
const span = document.createElement('span');
span.className = 'char';
span.textContent = ch;
span.style.setProperty('--i', i);
word.appendChild(span);
});
});
</script>
2 — The CSS, one animation per word
.word { display: inline-flex; font: 700 3rem/1 serif; }
.word .char { display: inline-block; }
.word:hover .char {
animation: bloom 1.2s cubic-bezier(.16, .87, .34, 1)
calc(var(--i) * 60ms) both;
transform-origin: center;
}
@keyframes bloom {
0% { transform: scale(0); opacity: 0; filter: blur(8px); }
60% { transform: scale(1.15); opacity: 1; filter: blur(0); }
100% { transform: scale(1); }
}
3 — Auto-play on scroll (optional)
const io = new IntersectionObserver(entries => {
for (const e of entries) {
if (!e.isIntersecting) continue;
e.target.classList.add('playing');
setTimeout(() => e.target.classList.remove('playing'), 2000);
io.unobserve(e.target);
}
}, { threshold: 0.45 });
document.querySelectorAll('.word').forEach(w => io.observe(w));
All 98 animations on this page follow the same three pieces. Open
DevTools and inspect any entry to grab its specific keyframes — the
stylesheet is at /assets/css/lab/dictionary-of-motion.css
and it's plain CSS, no preprocessor.
Read the writeup
For the story behind this — why I built it, the one repeated pattern that makes every entry work, and a few specific animations broken down — see A dictionary of motion in pure CSS.
Need an animated typographic moment for your site, or a small interactive reference like this one? Let's talk →