Article
How to Build Scrollytelling Without Scroll Jank
Build scrollytelling that stays smooth on mobile with IntersectionObserver, scroll timelines, progressive enhancement, and fallback strategy.
Article details
Published
June 01, 2026
Reading time
5 min
Main sections
13
Scrollytelling is useful when progressive revelation improves comprehension. It is harmful when motion density, sticky panels, or scroll-coupled effects make the page harder to read than a normal document.
If you want to build scrollytelling on the web, the safest approach is progressive enhancement: start with semantic content, add sticky structure, layer in state changes with observers, and use scroll-driven animation only where it improves the story without causing scroll jank.
What scrollytelling is, and what it breaks
Scrollytelling is a narrative pattern where scrolling controls what content is revealed, emphasized, or animated over time. It is compelling because it creates pacing and focus. It is fragile because it can easily damage readability, mobile behavior, and performance.
The main failure modes are:
- too much sticky content
- large continuous animation tied directly to scroll
- mobile layouts that feel trapped
- reduced-motion users getting the same heavy motion path
The progressive-enhancement architecture
The best scrollytelling systems are built in layers.
1. Semantic content first
The story should still read as a normal document if animation fails.
2. Sticky frame second
Use sticky layout to preserve context only where it makes the narrative easier to follow. Do not make the page feel pinned by default.
3. State changes with IntersectionObserver
The MDN guide for IntersectionObserver is still the best practical starting point for section activation, chapter progress, and state changes that do not need continuous scroll coupling.
4. Scroll timelines only for continuous progress
The W3C Scroll Animations specification is useful when you need continuous scroll-linked progress, but that should be the last layer, not the first.
Choose the right pattern
| Pattern | Best use case | Mobile risk | Performance risk |
|---|---|---|---|
| Narrative rail | Long editorial or case-study pages | Medium | Low to medium |
| Progress stage | One visual tied to chapter progress | Medium | Medium |
| Chapter stack | Distinct sections with controlled activation | Low to medium | Low |
| Hybrid narrative | Sticky media plus local animated details | High | High |
Use the simplest pattern that communicates the story.
IntersectionObserver vs scroll timelines
| Approach | Best for | Strength | Trade-off |
|---|---|---|---|
| IntersectionObserver | Section state, chapter activation, discrete transitions | Simple, robust, easier to reason about | Less suited for continuous animation progress |
| Scroll timelines | Continuous scroll-linked progress | Expressive and direct for progress mapping | Higher compatibility and performance sensitivity |
Use observers by default. Reach for scroll timelines only when the narrative genuinely depends on continuous progress.
Mobile constraints and anti-patterns
Mobile is where weak scrollytelling architecture usually fails first.
Watch for:
- sticky regions that consume too much viewport height
- multiple competing animated layers
- sections that trap scrolling
- text that becomes secondary to motion
The mobile version should usually be simpler than the desktop one, not equally elaborate.
Performance budget for scrollytelling
Treat performance as part of the narrative. If the reader feels lag, they feel uncertainty.
Keep the budget tight:
- animate as little as possible
- avoid layout-heavy effects on scroll
- prefer discrete state changes over constant motion
- test under weaker devices and real touch scrolling
This is why the best companion read for this topic is Performance as product quality.
Accessibility and reduced motion
Scrollytelling should not require motion to preserve meaning.
Use these defaults:
- keep the information readable without the animation
- simplify or remove continuous motion for reduced-motion users
- preserve keyboard and screen-reader access to the same content
Implementation checklist
- does the story still work as plain content?
- is sticky behavior used sparingly and intentionally?
- are observers enough, or is continuous scroll progress truly necessary?
- does the mobile version reduce complexity instead of copying desktop behavior?
- is reduced motion respected?
- can the page stay smooth on real devices and long pages?
- does the motion improve comprehension instead of competing with the content?
If the answer to the last question is no, use a normal page.
For motion patterns that clarify state changes, read Frontend animation with intent. For the perceived-quality and performance side of the same problem, read Performance as product quality. For clarity and confidence in interface behavior, read Designing trust into interfaces.
Need help applying this?
Turn the trade-off into a practical product decision.
If you need a narrative product page, launch page, or case-study experience that uses motion without hurting readability or speed, see the work on get in touch or reach out here.
FAQ
Common questions before committing to the pattern.
What is the safest way to build scrollytelling?+
Start with semantic content and add motion as progressive enhancement. The page should still work without the animation layer.
Should I use IntersectionObserver or scroll-driven animations?+
Use IntersectionObserver by default for section state and activation. Use scroll-driven animation only when the story genuinely needs continuous progress tied to scroll.
Why does scrollytelling often feel bad on mobile?+
Because sticky regions, heavy motion, and constrained viewport space combine badly when the design is not simplified for smaller screens.
How do I avoid scroll jank?+
Keep the motion budget low, prefer discrete state changes, test on real devices, and avoid effects that make scrolling compete with layout work.
When should I skip scrollytelling entirely?+
Skip it when progressive revelation does not improve understanding. A normal page is often clearer, faster, and easier to maintain.