Motion typography
Type on screen is not fixed. Once type moves, it acquires a time dimension the
print canon has nothing to say about — and a set of accessibility obligations that
static type does not carry.
1. When to invoke
- Animated headlines, kinetic type, text reveals or transitions.
- Animated, flexible, or generative logotypes.
- Scroll-driven or scroll-linked text effects.
- Typing, counting, or streaming text (including LLM token streaming).
- Animating variable-font axes.
- Someone reports motion sickness, discomfort, or unreadable moving text.
Do not invoke for static composition (typography-layout-systems) or for
general UI text (ui-component-typography).
2. Required context
- What the motion is for — meaning, feedback, continuity, or decoration. Only
the first three are usually defensible.
- Whether the text is read during motion or only before/after it.
- Duration, and whether it loops or auto-starts.
- Whether the user can pause, stop, or skip it.
- Whether motion is scroll-linked (user-controlled) or time-based
(autonomous).
- Reduced-motion and vestibular-disorder considerations.
3. Invariant principles
- Text being read must not move. Motion during reading defeats the saccadic
process entirely — the eye cannot fixate on a moving target and cannot execute
reliable return sweeps. Animate into a resting state, then stop.
- Respect
prefers-reduced-motion. Not optional. Provide a meaningful
reduced state — usually an instant cut to the end state, not a broken one.
- WCAG 2.2.2 (Pause, Stop, Hide): any moving, blinking, or scrolling content
that starts automatically, lasts more than 5 seconds, and is presented
alongside other content must have a mechanism to pause, stop, or hide it.
- WCAG 2.3.1 (Three Flashes or Below Threshold): nothing may flash more than
three times per second. This is a seizure risk, not a preference.
- Motion must not be the only carrier of meaning. If an animation communicates
state, that state must also be available statically.
- Layout must not shift as a side effect. Animating a property that changes
text metrics reflows the page and damages CLS.
4. Context-dependent heuristics
Animate the cheap properties. transform and opacity are composited and
don't trigger layout. Animating font-size, font-weight, letter-spacing, or
width reflows text on every frame — expensive and visually unstable.
| Want |
Animate |
| Reveal / entrance |
opacity, transform: translate |
| Emphasis |
transform: scale |
| Weight change (variable font) |
font-variation-settings — but see reflow warning |
| Position along scroll |
transform, via scroll-driven animation |
Variable-font axis animation is the genuinely new capability, and the trap is
that wght and wdth change advance widths, so animating them reflows the line.
Either reserve the space, animate a display element that owns its line, or accept
the reflow only where nothing else depends on the metrics. See variable-fonts.
Duration. Text reveals want to be fast — roughly 150–300ms for a single
element. Anything a user waits through before they can read is a tax. Stagger
across multiple elements sparingly; a long stagger delays comprehension of the
last item.
Scroll-driven vs. time-based. Scroll-linked motion is user-controlled, so it
sidesteps most of 2.2.2 — the user can always stop by not scrolling. Time-based
autonomous motion carries the full obligation. Prefer scroll-linked where the
effect allows.
Streaming text (LLM output, live captions) is a special case: it's continuously
changing text the user is reading. Keep the already-rendered text stable — never
re-flow or re-wrap what's been read. Append only.
Layering over time. Type on Screen's additive layering — styles within a family
acting as separate structural or decorative elements — extends naturally to motion:
layers can arrive in sequence rather than all at once. Carter's Walker (1995) uses
five "snap-on" serif styles as composable layers while keeping a unified look.
Logotype motion. Animated and flexible logotypes are a legitimate genre, but
the resting state must be the canonical mark. Motion is an entrance, not the
identity.
5. Failure patterns
| Pattern |
Cause |
Fix |
| Users can't read the animated headline |
Text moving while being read |
Animate in, then rest |
| Motion sickness reports |
No reduced-motion handling |
prefers-reduced-motion |
| Reduced-motion state shows nothing |
Animation is the reveal; disabling hid the text |
Reduced state = final state, instantly |
| Page jumps during a weight animation |
wght changes advance widths |
Reserve space or animate transform |
| Carousel text can't be stopped |
Auto-starting, >5s, no control |
Add pause/stop (2.2.2) |
| Janky animation |
Animating layout-triggering properties |
transform / opacity |
| Streaming text re-wraps as it arrives |
Re-laying out rendered content |
Append-only rendering |
| Long stagger delays reading |
Too many staggered elements |
Shorten or group |
| Flashing emphasis effect |
Rapid opacity toggling |
Never exceed 3 flashes/second (2.3.1) |
6. Evaluation procedure
- Ask what the motion is for. If the answer is "it looks nice", weigh it
against its cost honestly.
- Confirm no text is expected to be read while moving.
- Set
prefers-reduced-motion: reduce and verify the result is usable and
complete, not empty or broken.
- If motion auto-starts and runs >5s alongside other content, confirm a pause,
stop, or hide mechanism exists (2.2.2).
- Count flashes per second — must be ≤3 (2.3.1).
- Record a performance profile. Confirm no layout thrash per frame.
- Measure CLS with the animation running.
- For variable-font axes: confirm no reflow, or that reflow is contained.
- For streaming text: confirm rendered text never re-wraps.
- Test on a low-end device — motion that's smooth on an M-series Mac may not be.
7. Output format
Purpose: <meaning | feedback | continuity | decoration>
Motion: <property> over <duration> <easing>, <scroll-linked | time-based>
Read-during-motion: <no | yes → defect>
prefers-reduced-motion: <behaviour> — usable: <yes/no>
WCAG 2.2.2 (>5s auto): <n/a | control provided>
WCAG 2.3.1 (flashes): <n>/sec
Layout impact: reflow <yes/no> · CLS <n>
Tested on low-end device: <yes/no>
8. Examples
Hero headline that animates its variable-font weight from 300 to 700 on load.
Two problems. The wght axis changes advance widths, so the headline reflows on
every frame — the text visibly re-wraps and it shows up as CLS. And under
prefers-reduced-motion: reduce the current implementation skips the animation
and leaves the element at its 300 start value, so reduced-motion users get the
wrong design rather than a calmer one.
Fix: animate opacity and a small translateY for the entrance instead, and set
the final 700 weight statically so no metrics change. Reduced-motion state becomes
the final design shown instantly. If the weight animation is essential to the
brand, give the headline a reserved fixed block so reflow is contained.
Streaming assistant response.
The text is being read as it arrives, which is the one case where moving text is
unavoidable. The rule is that already-rendered text must never move: append new
tokens without re-wrapping what's above. Avoid text-wrap: balance on the
streaming container — it rebalances the whole block on every update, so every
line the user has already read jumps. Apply it only once streaming completes.
9. Counterexamples
- ❌ "Animate the paragraph text in word by word, it looks premium." — Delays
reading and defeats fixation.
- ❌ "We respect reduced-motion — we disable the animation." — If the animation was
the reveal, disabling it hides the content. The reduced state must be the final
state.
- ❌ Animating
letter-spacing or font-size for a hover effect. — Reflows text on
every frame.
- ❌ "It's a carousel, users can wait for it to come around." — 2.2.2 requires a
control.
- ❌ "The animation communicates that the item is new." — Motion alone can't carry
meaning; provide a static indicator too.
- ❌ Applying
text-wrap: balance to text that is still streaming in.
- ❌ Testing motion only on a high-end laptop.
10. Source citations
- Lupton (ed.), Type on Screen — primary book source. Motion and temporal
typography; animated, flexible, and generative logotypes; kinetic alphabets; logo
transition; type and code (Processing, Scriptographer, SVG type generators);
additive layering, where each style in a family acts as a distinct structural or
decorative element — Matthew Carter's Walker (1995) and its five "snap-on" serif
styles; "typography is forever in motion — and never more so than now."
- WCAG 2.2 §2.2.2 (Pause, Stop, Hide), §2.3.1 (Three Flashes or Below
Threshold), and
prefers-reduced-motion as the mechanism for §2.3.3 (Animation
from Interactions, AAA). Outranks aesthetic preference.
- MDN —
prefers-reduced-motion,
scroll-driven animations,
font-variation-settings.
- Hochuli, Detail in Typography — the reading process (saccades and fixations)
that moving text disrupts; the reason "text being read must not move" is a
physiological claim, not a stylistic one.
1---2name: motion-typography3description: Use when type moves or changes over time — animated headlines, kinetic type, text transitions, animated or responsive logotypes, scroll-driven text effects, typing/counting animations, variable-font axis animation, or loading and streaming text. Also use when motion is making text hard to read, causing discomfort, or failing reduced-motion and accessibility requirements.4---56# Motion typography78Type on screen is not fixed. Once type moves, it acquires a time dimension the9print canon has nothing to say about — and a set of accessibility obligations that10static type does not carry.1112## 1. When to invoke1314- Animated headlines, kinetic type, text reveals or transitions.15- Animated, flexible, or generative logotypes.16- Scroll-driven or scroll-linked text effects.17- Typing, counting, or streaming text (including LLM token streaming).18- Animating variable-font axes.19- Someone reports motion sickness, discomfort, or unreadable moving text.2021**Do not** invoke for static composition (`typography-layout-systems`) or for22general UI text (`ui-component-typography`).2324## 2. Required context2526- **What the motion is for** — meaning, feedback, continuity, or decoration. Only27 the first three are usually defensible.28- Whether the text is **read during motion** or only before/after it.29- **Duration**, and whether it loops or auto-starts.30- Whether the user can **pause, stop, or skip** it.31- Whether motion is **scroll-linked** (user-controlled) or **time-based**32 (autonomous).33- Reduced-motion and vestibular-disorder considerations.3435## 3. Invariant principles3637- **Text being read must not move.** Motion during reading defeats the saccadic38 process entirely — the eye cannot fixate on a moving target and cannot execute39 reliable return sweeps. Animate *into* a resting state, then stop.40- **Respect `prefers-reduced-motion`.** Not optional. Provide a meaningful41 reduced state — usually an instant cut to the end state, not a broken one.42- **WCAG 2.2.2 (Pause, Stop, Hide)**: any moving, blinking, or scrolling content43 that starts automatically, lasts more than **5 seconds**, and is presented44 alongside other content must have a mechanism to pause, stop, or hide it.45- **WCAG 2.3.1 (Three Flashes or Below Threshold)**: nothing may flash more than46 three times per second. This is a seizure risk, not a preference.47- **Motion must not be the only carrier of meaning.** If an animation communicates48 state, that state must also be available statically.49- **Layout must not shift as a side effect.** Animating a property that changes50 text metrics reflows the page and damages CLS.5152## 4. Context-dependent heuristics5354**Animate the cheap properties.** `transform` and `opacity` are composited and55don't trigger layout. Animating `font-size`, `font-weight`, `letter-spacing`, or56`width` reflows text on every frame — expensive and visually unstable.5758| Want | Animate |59|---|---|60| Reveal / entrance | `opacity`, `transform: translate` |61| Emphasis | `transform: scale` |62| Weight change (variable font) | `font-variation-settings` — but see reflow warning |63| Position along scroll | `transform`, via scroll-driven animation |6465**Variable-font axis animation** is the genuinely new capability, and the trap is66that `wght` and `wdth` change advance widths, so animating them reflows the line.67Either reserve the space, animate a display element that owns its line, or accept68the reflow only where nothing else depends on the metrics. See `variable-fonts`.6970**Duration.** Text reveals want to be fast — roughly 150–300ms for a single71element. Anything a user waits through before they can read is a tax. Stagger72across multiple elements sparingly; a long stagger delays comprehension of the73last item.7475**Scroll-driven vs. time-based.** Scroll-linked motion is user-controlled, so it76sidesteps most of 2.2.2 — the user can always stop by not scrolling. Time-based77autonomous motion carries the full obligation. Prefer scroll-linked where the78effect allows.7980**Streaming text** (LLM output, live captions) is a special case: it's continuously81changing text the user *is* reading. Keep the already-rendered text stable — never82re-flow or re-wrap what's been read. Append only.8384**Layering over time.** Type on Screen's *additive layering* — styles within a family85acting as separate structural or decorative elements — extends naturally to motion:86layers can arrive in sequence rather than all at once. Carter's Walker (1995) uses87five "snap-on" serif styles as composable layers while keeping a unified look.8889**Logotype motion.** Animated and flexible logotypes are a legitimate genre, but90the resting state must be the canonical mark. Motion is an entrance, not the91identity.9293## 5. Failure patterns9495| Pattern | Cause | Fix |96|---|---|---|97| Users can't read the animated headline | Text moving while being read | Animate in, then rest |98| Motion sickness reports | No reduced-motion handling | `prefers-reduced-motion` |99| Reduced-motion state shows nothing | Animation *is* the reveal; disabling hid the text | Reduced state = final state, instantly |100| Page jumps during a weight animation | `wght` changes advance widths | Reserve space or animate transform |101| Carousel text can't be stopped | Auto-starting, >5s, no control | Add pause/stop (2.2.2) |102| Janky animation | Animating layout-triggering properties | `transform` / `opacity` |103| Streaming text re-wraps as it arrives | Re-laying out rendered content | Append-only rendering |104| Long stagger delays reading | Too many staggered elements | Shorten or group |105| Flashing emphasis effect | Rapid opacity toggling | Never exceed 3 flashes/second (2.3.1) |106107## 6. Evaluation procedure1081091. Ask what the motion is **for**. If the answer is "it looks nice", weigh it110 against its cost honestly.1112. Confirm no text is expected to be **read while moving**.1123. Set `prefers-reduced-motion: reduce` and verify the result is **usable and113 complete**, not empty or broken.1144. If motion auto-starts and runs >5s alongside other content, confirm a pause,115 stop, or hide mechanism exists (2.2.2).1165. Count flashes per second — must be ≤3 (2.3.1).1176. Record a performance profile. Confirm no layout thrash per frame.1187. Measure CLS with the animation running.1198. For variable-font axes: confirm no reflow, or that reflow is contained.1209. For streaming text: confirm rendered text never re-wraps.12110. Test on a low-end device — motion that's smooth on an M-series Mac may not be.122123## 7. Output format124125```126Purpose: <meaning | feedback | continuity | decoration>127Motion: <property> over <duration> <easing>, <scroll-linked | time-based>128Read-during-motion: <no | yes → defect>129prefers-reduced-motion: <behaviour> — usable: <yes/no>130WCAG 2.2.2 (>5s auto): <n/a | control provided>131WCAG 2.3.1 (flashes): <n>/sec132Layout impact: reflow <yes/no> · CLS <n>133Tested on low-end device: <yes/no>134```135136## 8. Examples137138**Hero headline that animates its variable-font weight from 300 to 700 on load.**139140> Two problems. The `wght` axis changes advance widths, so the headline reflows on141> every frame — the text visibly re-wraps and it shows up as CLS. And under142> `prefers-reduced-motion: reduce` the current implementation skips the animation143> and leaves the element at its 300 start value, so reduced-motion users get the144> wrong design rather than a calmer one.145>146> Fix: animate `opacity` and a small `translateY` for the entrance instead, and set147> the final 700 weight statically so no metrics change. Reduced-motion state becomes148> the final design shown instantly. If the weight animation is essential to the149> brand, give the headline a reserved fixed block so reflow is contained.150151**Streaming assistant response.**152153> The text is being read as it arrives, which is the one case where moving text is154> unavoidable. The rule is that already-rendered text must never move: append new155> tokens without re-wrapping what's above. Avoid `text-wrap: balance` on the156> streaming container — it rebalances the whole block on every update, so every157> line the user has already read jumps. Apply it only once streaming completes.158159## 9. Counterexamples160161- ❌ "Animate the paragraph text in word by word, it looks premium." — Delays162 reading and defeats fixation.163- ❌ "We respect reduced-motion — we disable the animation." — If the animation was164 the reveal, disabling it hides the content. The reduced state must be the *final*165 state.166- ❌ Animating `letter-spacing` or `font-size` for a hover effect. — Reflows text on167 every frame.168- ❌ "It's a carousel, users can wait for it to come around." — 2.2.2 requires a169 control.170- ❌ "The animation communicates that the item is new." — Motion alone can't carry171 meaning; provide a static indicator too.172- ❌ Applying `text-wrap: balance` to text that is still streaming in.173- ❌ Testing motion only on a high-end laptop.174175## 10. Source citations176177- Lupton (ed.), *Type on Screen* — **primary book source.** Motion and temporal178 typography; animated, flexible, and generative logotypes; kinetic alphabets; logo179 transition; type and code (Processing, Scriptographer, SVG type generators);180 *additive layering*, where each style in a family acts as a distinct structural or181 decorative element — Matthew Carter's Walker (1995) and its five "snap-on" serif182 styles; "typography is forever in motion — and never more so than now."183- **WCAG 2.2** §2.2.2 (Pause, Stop, Hide), §2.3.1 (Three Flashes or Below184 Threshold), and `prefers-reduced-motion` as the mechanism for §2.3.3 (Animation185 from Interactions, AAA). **Outranks aesthetic preference.**186- MDN — [`prefers-reduced-motion`](https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion),187 [scroll-driven animations](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_scroll-driven_animations),188 [`font-variation-settings`](https://developer.mozilla.org/en-US/docs/Web/CSS/font-variation-settings).189- Hochuli, *Detail in Typography* — the reading process (saccades and fixations)190 that moving text disrupts; the reason "text being read must not move" is a191 physiological claim, not a stylistic one.