Skip to content
Creative Marketing AI

Motion Showcase

Parallax Depth

Six ways to fake a third dimension with nothing but scroll position. Scroll slowly — every layer on this page moves at a different rate, and one scene moves with your cursor.

01 — Rate-split background

Rate-split backgroundTall alpine valley

This copy scrolls at normal speed. The valley behind it is scrubbed to −20% of its own height across the section, so it lags — the speed difference alone reads as depth.

The cheapest parallax there is: one image, one tween, one scrub. Perfect for long editorial pages.

gsap.to(bg, { yPercent: -20, ease: 'none', scrollTrigger: { scrub: 0.6 } })
Multi-layer depth stack — pinnedDusk skyMountain ridge lineLodge and trees midgroundDark foreground pines

Four plates, one valley

tl.fromTo(layer, { yPercent: 0 }, { yPercent: depth, scale }, 0) // pin + scrub, pines overshoot +18

03 — Foreground overshoot

Foreground overshootAlpine lodge exterior at golden hour

Nearest layer

This card travels faster than the scroll itself — the closer an object is, the more it should outrun the world behind it.

gsap.fromTo(card, { y: 150 }, { y: -150, scrollTrigger: { scrub: 0.6 } })

04 — Mouse parallax

Same four plates, driven by your cursor instead of the scrollbar. Move the mouse across the scene — near layers push against you, the sky drifts with you. Disabled on touch devices.

Mouse parallax — pointer: fine onlyDusk skyMountain ridge lineLodge and trees midgroundDark foreground pines
const xTo = gsap.quickTo(layer, 'x'); onMove → xTo(dx * depth) // gsap.matchMedia('(pointer: fine)')

05 — Depth-of-field

Depth-of-fieldWorkshop wide with silhouetteAmber bottle, out of focus in the foreground
near: blur(2px) + yPercent -30 · far: yPercent -8 — two scrubs, camera-lens depth

06 — Velocity parallax

Flick the scroll hard, then stop. The row is offset by scroll velocity — clamped so it never flies apart — and springs back elastically when you settle.

Velocity parallax
Alpine lodge at golden hourGreat-hall corridorCraftsman hands close-upWorkshop wide silhouette
onUpdate: (self) => clamp(self.getVelocity() / -25) → elastic.out back to 0

Keep exploring

Depth is a rate difference. Pinning is a held breath.

← All effectsNext: Pinned Scenes →