Vanilla Breeze

Horizontal Scroll Section

Vertical-scroll section where content translates sideways via scroll-driven animation. Pure CSS with position: sticky and animation-timeline.

Overview

A section that translates a horizontal row of content sideways as the user scrolls vertically. The browser still scrolls normally — the row just animates in response to scroll position. No scroll-jacking.

Anatomy:

  • An outer .stage taller than the viewport — its height controls how long the horizontal pass lasts
  • A .track that is position: sticky, viewport-sized, with overflow: hidden
  • A .row inside the track containing the horizontal content
  • animation-timeline: view() on the row drives a translate-X animation from the stage's scroll progress
  • Reduced-motion users get a wrapped vertical layout

HTML

CSS

Notes

  • Tune the end translate based on how many cards × their width. The formula in the demo (4 * 70vw + 3 * gap - 100vw + 10vw) leaves the last card centred.
  • The stage height controls timing. 400vh gives ~3 viewport-heights of vertical scroll across which the horizontal pass happens. Halve it for a snappier pass, double it for a slower one.
  • Named view-timeline. view-timeline-name on the stage and animation-timeline on the row decouples the animated element from the timeline source — useful when the element and the scroll trigger aren't the same node.
  • Don't use this for primary navigation flow. Horizontal-on-scroll is a feature presentation pattern, not a way to read essential content. Reduced-motion fallback is essential.