UX Engineer

Motion Showcase

Five web motion techniques in one demo — split-text entrances, scroll-driven reveals, magnetic cursor hover, staggered grid reveals, kinetic type. Motion as a UX decision, not decoration. Built in GSAP, no framework.

GSAP · ScrollTrigger · vanilla JS
scroll to explore ↓
The Brief

Five techniques. One file. No framework.

The brief was proof — not a portfolio item, but a technical argument. Each technique is a production approach worth reaching for on a real project: split-text for hero entrances, scroll scrub for narrative pacing, magnetic hover for interaction depth, stagger for list reveals, kinetic type for emphasis. They're not effects. They're tools.

No framework because a framework would obscure the motion. The motion is the content — and the code is the only thing between you and understanding how it works.

TECHNIQUE 02 · SCROLL SCRUB · gsap scrolltrigger · scrub
The interaction is the product. Design and build.
each word reveals on scroll · spotlight advances with scroll position
TECHNIQUE 03 · MAGNETIC HOVER · move cursor over each card

Attention
is attracted.

INTERACTION DESIGN
MOTION + ANIMATION
STATE MACHINES
DESIGN SYSTEMS
DATA VISUALIZATION
WEB TOYS
gsap magnetic pattern · elastic.out spring on release
TECHNIQUE 04 · STAGGER REVEAL · scrolltrigger · stagger

The stack.

01
GSAP + ScrollTrigger
orchestration · sequencing · scroll-driven animation
02
CSS Animations
keyframes · custom easing · no dependencies
03
Framer Motion
react component motion · layout animations · presence
04
Web Animations API
native browser · precise · zero overhead
05
Canvas + requestAnimationFrame
physics · particles · custom rendering loops
06
Three.js + WebGL
3d · shaders · immersive experiences
TECHNIQUE 05 · KINETIC TYPE · scroll through this section
DESIGN
AND BUILD
SHIPPED.
In review
Craft decisions
  • Hero stagger is 22ms per character with power3.out. The mask is an overflow:hidden line wrapper — characters slide up from yPercent: 110. Browser-native CSS clipping. No SVG, no plugin.
  • Magnetic cards pull 13/10px on the wrapper and 22/16px on the inner label. Inner moves further than outer — parallax depth inside a 2D animation. On exit, both spring back with elastic.out(1, .45).
  • Magnetic respects prefers-reduced-motion. The CSS hover state stays; the cursor chase and elastic spring are skipped.
  • Scroll scrub pins the section and steps each word on at i × .42s, dimming the previous to 28% opacity. The spotlight moves with reading speed — not animation speed.
  • Kinetic type pins for 2.8× the section height. Long pin = slow scrub = the user reads each line at the pace of their own scroll. Pin distance is the design knob.
What I'd do differently
  • Hero stagger uses character index. Long headlines create a wave that runs too long. Real implementation would group by word and stagger words, characters within word.
  • Magnetic effect runs on every mousemove with no throttling. Fine on a fresh page; on a heavier page it would jank. gsap.quickTo would smooth the hot path.
  • Kinetic section pins without a scroll prompt. First-time visitors stop, think the page froze. A subtle // scroll to advance annotation would solve it.
PALETTE