WebGL scroll effects · a concept demo

Scroll fast.
Feel the speed.

This entire page is one WebGL texture — a proof of concept, not a product. Flick the scroll wheel — or swipe hard on mobile — and a directional blur shader smears the pixels along your velocity vector, like a long camera exposure nobody asked for.

Get started View source

Both buttons are, of course, part of the image.

How the trick works

Three stages, all invisible to you — like the rest of the page, technically.

📸

1. Snapshot

On load, html2canvas takes a screenshot of the page you think you're reading right now — same-origin only, so no security prompts.

🧵

2. Texture

The snapshot is sliced into GPU-friendly tiles and uploaded as WebGL textures. The real DOM is hidden but keeps its height, so the scrollbar still works. It is the only part of this page that's real.

💨

3. Shader

Every frame, scroll velocity drives a multi-tap directional blur shader. Fast flicks stretch the pixels; at rest the page is perfectly sharp, so you'd never suspect a thing.

Fig. 1 — a purely decorative gradient panel, here to give your eyes something colorful to smear.

By the numbers

31shader taps per pixel
120Hzrender loop, vsynced
2render passes per frame
0DOM reads during scroll
1screenshot you're reading right now
“Motion blur is the difference between a page that scrolls and a page that moves.”
— someone who definitely exists, 2026

Testimonials

Real quotes from real users of this entirely hypothetical product.

“I never knew my scrolling had a motion-blur problem. It didn't. Thank you for solving it anyway — I honestly can't imagine going back to whatever was perfectly fine before.”

— Casey R., early adopter

“So many websites these days are just boring documents you scroll and read. Finally: a real-time GPU rendering of a screenshot of a boring document you scroll and read.”

— Priya S., design thought leader

“Readability while scrolling is genuinely improved. Text I wasn't reading used to fly past sharp; now it flies past blurred, which is how my eyes always intended it. Comprehension is unchanged, but it feels faster.”

— Marcus T., competitive speed reader

“I arrived with three criticisms and read the other testimonials first. All three had already been addressed — as compliments. There is nothing left for me to do here. Five stars.”

— Dana K., professional skeptic

Why not pure CSS?

CSS filters can fake a blur on scroll, but filter: blur() is an isotropic Gaussian — it fogs the whole element equally in every direction. Real motion blur is directional: pixels streak along the axis of movement, proportional to speed, like film exposed while the camera pans.

Doing it properly means controlling every pixel yourself. So this page snapshots its own DOM into a texture, hides the original, and re-renders the visible slice through a fragment shader that samples the texture 31 times along the scroll direction. The offset between taps is your scroll velocity times a virtual shutter time.

Because the shader reads a pre-rendered texture, nothing touches layout or paint during scrolling — the browser only composites one canvas. That is what keeps it smooth on a phone.

Is any of this a sensible way to ship a website? Absolutely not — which is why this is a concept demo and not a framework. But as a way of making pixels do something they shouldn't: extremely.

  • Works with any arbitrary HTML — it just screenshots whatever you were about to read
  • Native scrolling preserved, including mobile momentum scrolling
  • Rubber-band overscroll stays sharp — blur only applies to real page motion
  • Blur comes from real motion only — the instant the page stops, it snaps sharp
  • Page is tiled into multiple textures, so tall pages don't hit GPU size limits
  • Falls back to the plain, legible page if WebGL or the snapshot fails (purists call this “the fix”)

Keep scrolling

This section exists purely to give you runway. The words here don't matter — though, since you're reading a texture, that was already true.

Fig. 2 — more smearable pixels.