Scrollytelling without the hostage-taking

Scrollytelling has a trust problem. Somewhere between the fiftieth full-viewport pinned section of the late 2010s and the first wave of WebGL nonsense, readers learned to brace when a page starts animating on scroll. The thumb hovers over the back button. The reader is not admiring your choreography; they are calculating whether your story is worth their scroll wheel.

That's a shame, because scroll-driven narrative done well is genuinely powerful. When we built the data story inside the Meridian Climate explorer — thirty years of council emissions data that had previously lived in a PDF nobody opened — the scrollytelling chapter was the only format we tested where participants could retell the story afterwards with the numbers in the right order. Scroll is a beautiful input: continuous, reversible, forgiving, already learned. The craft is in not abusing it.

Here is everything we hold ourselves to.

The reading-position contract

Every scroll behaviour is a contract with the reader. The default contract of the web is simple and sacred: my thumb moves, the content moves proportionally, I control the pace, and I can always see where I am. Scrolljacking — stealing delta, smoothing it, rerouting it — breaks all four clauses at once. Don't do it. Not for "premium feel". Not ever.

Scrollytelling, done honourably, amends the contract rather than breaking it: scroll still scrubs forward and backward at my pace; instead of just moving the page, it also advances the state of what I'm looking at. The reader still drives. You're a projectionist responding to the reel, not a rollercoaster operator.

That framing produces three concrete rules:

  1. Every state must be reachable by scrolling both directions. If a chart annotation appears scrolling down, it must disappear scrolling up to the same place. Symmetric reversibility is the difference between a scrubber and a trap.
  2. **The page must still move — or very clearly section.** Readers judge progress by motion. A pinned scene with no moving elements and no progress indicator feels broken within two seconds. Either the narrative column scrolls beside a pinned visual (our default pattern) or the pinned scene gets an honest progress rail.
  3. Keyboard and screen-reader users get the same story in the same order. Scrollytelling steps are just headings and paragraphs with extra choreography. If removing the choreography breaks comprehension, the choreography was carrying the meaning — which means you never wrote the story down. Fix the story first.

When scroll earns it — and when it's showing off

We green-light scroll choreography only when it does a job a static layout can't. The honest job list, from a decade of these projects:

Preserving object constancy in data. This is the big one. When a scatter plot morphs into a bar chart — the same dots, rearranged — readers track the transformation and the data stops being abstract. This is why the Meridian piece works: the council's emissions are a line, then the line stacks into sectors, then the sectors explode into a map, and the reader never loses the thread. A static grid of three charts asks the reader to do that diff in their head. Most won't.

Sequencing a genuinely long argument. Reports that must land one point before the next can use stepped reveals to enforce order — sparingly. The Postcards from the Museums archive uses a short three-step lead-in to establish what the collection is before handing over the browsing controls. Three steps. Then it gets out of the way.

Orienting inside a physical space. Zooming from a continent into a site into a detail — maps, floor plans, exploded product views — benefits because scroll maps naturally onto depth.

The list of illegitimate reasons is longer: making a brand page feel expensive, disguising thin content, padding a page that should have been a diagram. If the same story works as a well-typeset article with three strong figures — and most do — write that article. Scroll choreography is a spice with an LD50.

Pacing: the 1.5-viewport rule

The most common pacing failure is the "scroll corridor": a pinned visual that holds for four or five viewport-lengths of scrolling while text steps drift past. Readers experience this as wading. Our pacing budgets:

  • One narrative step per ~1–1.5 viewports of scroll. Enough scroll to feel like reading, not so much that the visible state feels uneventful. If a beat needs three viewports, it wants to be two beats.
  • Text step changes and visual changes are coupled. New text card, new visual state, same scroll region. Decoupling them — text changes, nothing moves — reads as a bug.
  • The first 600px of the scene must show life. Arrive at a pinned scene and scroll slightly: something must respond immediately, or the reader concludes the page has stalled.
  • Total pinned distance stays under your audience's patience. For public, top-of-funnel stories we cap pinned scroll at roughly 8–12 viewport-lengths total. Internal reports for motivated readers can run longer. Nobody has ever complained that a data story was too efficient.

Exit lanes are non-negotiable

Every scrollytelling scene ships with a visible escape route. Ours is a slim "skip the story" link pinned alongside the progress rail — one tap and you land at a static, fully readable summary of the same argument (which, per the contract above, always exists). On mobile it becomes a button in the sticky header.

The skip link is not an admission of failure. In the Meridian analytics, 22% of returning visitors used it — people who had read the story once and came back for a number. Serving them fast is the difference between a story and a reference work, and a good data story should be both.

The technical rules that keep it honest

Intersection Observer, not scroll listeners. State transitions driven by IO thresholds, with the visual pinned via CSS position: sticky wherever possible. Sticky is free, butter-smooth, and — critically — it degrades gracefully. The day your scrubbing library breaks, sticky still works.

Scrub animations with care. GSAP's ScrollTrigger is excellent for canvas, WebGL and SVG morphs that CSS can't express. Use it for those, not for things <details> could do.

Reduced motion is a different design, not a broken one. Under prefers-reduced-motion, our scenes render as the static summary: every step visible, visuals in their final state, no pinning, no scrubbing. Not "the same page with the animation disabled" — a deliberately rebuilt experience. Readers who set that flag are telling you something about their nervous system; the respectful answer is a page designed for stillness, and this is one place where motion earns its keep by leaving.

Performance is part of the story. A scrollytelling scene that janks is worse than no scene. Budget: under 100KB of JS for the choreography layer, all heavy media lazy, transform-and-opacity animations only, and we profile on a mid-tier Android over 4G before launch — the same hardware budgets we apply across our web builds. If the phone in your pocket can't scrub the story smoothly, the story isn't finished.

Test the "wrong" inputs early. Mouse wheel and trackpad momentum and keyboard and a phone flicked hard. Trackpad inertial scrolling is where 90% of scrub-timing bugs breed.

A note on restraint

The best scrollytelling moment I've shipped recently is nearly invisible: in a climate-sector project, a single chart where scrolling once rearranges 400 dots from "pledged" to "delivered". Three seconds. No pinning beyond it, no soundtrack, no confetti. Readers got it instantly, because the page had spent its entire budget of attention on one honest transformation.

That's the bar. If your scroll choreography is the most memorable thing about the page, something quieter was supposed to be.

Got a report nobody opens? That's the brief we like — tell us about it.

Key takeaways

  • Respect the reading-position contract: scroll still scrubs at the reader's pace, reversibly, with visible progress.
  • Green-light scrollytelling only for object constancy in data, strict sequencing, or spatial orientation. Otherwise, write the article.
  • Budget pacing: one beat per ~1–1.5 viewports, coupled text/visual changes, total pinned distance under the audience's patience.
  • Ship a visible skip link to a static summary — the summary must exist anyway for accessibility.
  • Build with sticky + Intersection Observer; reserve heavy libraries for canvas and WebGL. Reduced motion gets a redesigned static experience, not a crippled one.
  • Profile on a real phone. Janky choreography is worse than none.

FAQ

Isn't scrollytelling bad for engagement metrics? Bad scrollytelling is. In our projects, completion of the narrative chapter predicts downstream action (downloads, sign-ups, dwell on the data explorer) better than any other section of the page. The mechanism matters: stories that preserve object constancy measurably improve comprehension, and comprehension is what converts.

How do you handle scrollytelling for screen readers? The story is real content — headings, paragraphs, figure captions with the numbers written out in sentence form. The choreography is decorative enhancement on top. Then we test with an actual screen reader, because assumptions about "it's just headings" have burned us before.

Should the whole page be scrollytelling? Almost never. Our default shape is: a strong editorial opening, one or two choreographed scenes where they earn it, then a conventional, scannable body and a fast reference layer. Choreography is a chapter, not a binding.

What about mobile, where half the audience lives? Design the phone version first — it's the constrained case. Steps stack tighter, pinned visuals shrink to the top third, and if a scene only works on a desktop-sized visual, that's a sign the scene is doing layout tricks rather than storytelling.


Keep reading