Scroll animations

Scroll-driven motion with restraint, not parallax for its own sake

Scroll-driven animation ties motion to scroll position instead of a clock.

If it doesn't serve orientation, feedback, or continuity, remove it.

CSS scroll-driven animations

Scroll progress timeline

animation-range: 0% 30% means the animation completes at 30% scroll depth.

View progress timeline

entry 0% = first touches the viewport. entry 100% = fully visible.

IntersectionObserver patterns

Paired with CSS:

Parallax

scale(2) compensates for size reduction from the Z-axis offset.

Use for: Hero sections, landing pages. Skip on: Content-heavy pages, documentation, dashboards, mobile.

Performance

Only animate transform and opacity.

Batch JavaScript scroll handlers with requestAnimationFrame:

Accessibility

Common mistakes

Scroll-jacking. Hijacking native scroll breaks back/forward, bookmarks, find-on-page, and screen readers.

Hiding content behind scroll. Reveal content already in the DOM with opacity: 0, not dynamically injected content.

Momentum scroll on mobile. iOS fires scroll events at irregular intervals. Keep mobile scroll animations to IntersectionObserver triggers, not continuous scrubbing.