Open to full-time roles
Hire me
Lab

Pinned Horizontal Scroll

The section holds still while its contents travel sideways, so vertical scrolling drives horizontal movement. The distance is measured from the real content width, not a guessed number, so it stays correct when the text wraps or the window changes.

01

Plan

Sitemap, page templates and the CMS structure agreed before a single section is built.

02

Foundation

Style guide, variables and base components. Everything after this inherits from here.

03

Build

Sections assembled from components, CMS bound, motion added last so it never hides a layout problem.

04

Launch-ready

Real phones, real content, SEO fields, redirects, forms tested end to end.

05

Launch

Publish, then a Loom walkthrough and a written handover so the team can run it.

How it works

How it holds up

Measured, not hardcoded

Travel distance comes from scrollWidth minus the stage width, recalculated on every refresh. Most tutorials hardcode a percentage, which breaks the moment a heading wraps onto two lines.

Scrub, not duration

The tween is tied to scroll position with a small scrub value, so it tracks the finger or wheel with a touch of lag. Easing is set to none, because the scroll already provides the timing.

Reduced motion gets a real fallback

Rather than freezing the panels, it becomes a normal swipeable row with scroll snapping. The content is still reachable, it just does not hijack the page.

Want this in your build?