067

Exploded View Scroll

£10 or the whole Vault, £79.20

A pinned product stack that separates into an exploded assembly diagram as you scroll, with layers that tilt into three-quarter view, callouts that draw in, and a velocity overshoot that springs back.

ScrollTrigger Lenis intermediate
7 more details
exploded-view3d-transformspinningscrubvelocity-reactivesvg-line-drawhover-effect

This demo reads better at your own screen size than in the frame below:

Updated

About this effect

An exploded view effect that turns a stack of product layers into the assembly diagram every hardware launch page wants. ScrollTrigger pins the scene, and as the visitor scrolls the stack tilts from a flat product shot into a three-quarter view while each layer lifts along the stack's normal, its slab edge and drop shadow appearing as the gap opens.

Read the full effect overview

Every layer gets a callout: a numbered label with a leader line that draws itself in the moment its layer reaches position, and re-measures against the projected 3D position on every frame so it stays attached whatever the viewport. Scroll velocity over-separates and fans the layers, and they spring back with an elastic settle once the wheel stops. Hover, focus or tap a layer to lift it and dim the rest.

Exploded View Scroll - GSAP animation effect preview

What's included

8 items
  • Scroll-scrubbed explosion of any number of stacked layers, pinned for a configurable runway on desktop and mobile
  • Layers are plain elements, so each one can be a PNG, an SVG, a video frame or the CSS-drawn parts the demo ships with
  • Three-quarter tilt and turn applied through custom properties, so the transform order never fights GSAP's
  • Velocity channel: a fast flick over-separates and fans the stack, then elastic.out brings it back to the diagram
  • Callouts with self-drawing leader lines, positioned from each layer's projected 3D bounds and pushed apart so labels never overprint
  • Hover, keyboard focus and tap isolate one layer with a lift and a dim-and-blur on its siblings; Escape releases it
  • A one-line legend replaces the callouts on phones and tracks the layer the scroll has just revealed
  • Static mode renders the finished diagram at any progress without a pin, used for reduced motion and for print-style pages

Perfect for

5 use cases
  • Hardware and wearable launch pages that need an Apple-style teardown without a 3D pipeline
  • Product detail pages showing what is inside a device, a shoe, a mattress or a skincare formula
  • Architecture and engineering sites explaining a system's layers as the visitor scrolls
  • Packaging and materials brands walking through a laminate or a composite build
  • Pitch and investor microsites explaining how a product is assembled

How it works

2 sections

Each [data-exploded] scene holds a preserve-3d stack of [data-exploded-layer] buttons. A ScrollTrigger pins the scene and scrubs progress from 0 to 1; a render function eases that into a tilt, a turn and a scale on the stack, and a depth offset per layer proportional to its distance from the middle, all written as CSS custom properties so the transform order is fixed in the stylesheet.

Scroll speed drives two extra values, an over-separation factor and a tilt wobble, that the render multiplies in; a short pause after the last scroll event starts a spring settle back to zero. After every render the script reads each layer's projected 3D bounds and positions its callout and connector from that, staggering each callout's reveal by its index and drawing the line in. Isolation tweens a per-layer lift value that the same render adds to the depth.

Plugins ScrollTrigger
Difficulty Intermediate
Smooth scroll Lenis integration
Includes HTML + JS + CSS source, documentation, AI setup prompt, lifetime updates

Lighthouse, as measured

Google Lighthouse on this effect's demo, from the latest scan. A measurement of the demo as shipped, not a promise for your page.

Accessibility
100
Best practices
100

No performance score, on purpose. That figure depends on how you deploy: your server's compression and caching, your CDN, the connection and the device doing the test, none of which the code controls. The same page can score very differently on two consecutive runs, so measure it where it will live.

Paid effect

Purchase to unlock the code.

Buying Exploded View Scroll opens the HTML, CSS and JavaScript source, the full documentation, an AI setup prompt for your editor, and every update we ship to it. Standard license: unlimited personal and commercial projects. Every paid product is tested for desktop and mobile layouts, reduced-motion handling, animation cleanup and keyboard controls wherever there is something to operate.

£10 Standard license, unlimited projects

Browse free effects

Or the whole library: the Vault, £79.20, one payment.

Documentation

Quick Start

1. Add to your HTML <head>:

Code snippet omitted: it ships with the download.

2. Add before closing </body> tag:

Code snippet omitted: it ships with the download.

3. Add the effect HTML anywhere in your <body>:

Code snippet omitted: it ships with the download.

The scene pins to the top of the viewport and holds for the runway distance, so give it a full viewport of height (the shipped CSS sets 100svh).

Using It With Your Own Design

What the effect needs from your markup: one [data-exploded] scene containing a [data-exploded-stack] with the layers as its direct children, each marked [data-exploded-layer], listed bottom to top. The stack must sit inside an untransformed wrapper (.exploded__scene in the demo) because the callouts are measured from that wrapper's box. Callouts ([data-exploded-callout]) are optional and matched to layers by order; the [data-exploded-lines] SVG is optional and only draws leader lines when present. The mobile legend ([data-exploded-legend]) is optional and reads each callout's data-exploded-title and data-exploded-note. Layers are <button> elements so hover, focus and tap isolation work; plain <div>s also work, and the isolation simply never fires from the keyboard.

What is only the demo's styling: everything under the LAYER ART heading in style.css (the ceramic back, battery, board, display and crystal are CSS drawings), plus the prompt, the eyebrow and title in the corner, and the background gradients. Replace each layer's inner <span> with an <img>, an inline SVG or your own markup. Transparent PNGs of each part, all exported at the same canvas size, give the most convincing result. Set --size and --radius on .exploded to match your parts.

CSS the effect depends on: .exploded__scene must carry perspective and no transform. .exploded__stack must keep transform-style: preserve-3d and its transform must stay scale(var(--zoom)) rotateX(var(--tilt)) rotateZ(var(--turn)): the script writes those custom properties, and the order (turn in the plane, then tilt) is what makes the diagram read as a three-quarter view. Each layer must keep transform: translateZ(var(--z)) rotateX(var(--flap)) and position: absolute; inset: 0. Never put a filter on the stack or the scene: a filter flattens 3D and the layers would render as one plane, which is why the isolation blur lives on the leaf layers. The .has-js .exploded.is-live .exploded__callout { opacity: 0 } pre-hide stops callouts flashing before their reveal; keep it, together with the reduced-motion rule that restores it.

Options

Set these as attributes on the [data-exploded] element.

Attribute Values Default Description
data-exploded-gap 20 to 400 110 Depth between adjacent layers at full spread, in px at a 300px stack (scales with the rendered size)
data-exploded-tilt 0 to 80 58 Final rotateX in degrees
data-exploded-turn -90 to 90 -24 Final rotateZ in degrees, applied in the stack's plane
data-exploded-scale 0.3 to 1.5 0.86 Stack scale at full spread, to keep a tall explosion inside the viewport
data-exploded-runway 300 to 2400 900 Pinned scroll distance in px on fine pointers
data-exploded-mobile-runway 200 to 1600 620 Pinned scroll distance in px on coarse pointers
data-exploded-velocity 0 to 3 1 Strength of the over-separation and fan on fast scrolls; 0 disables the velocity channel
data-exploded-lift 0 to 200 32 How far the other layers push away from an isolated layer, in px at a 300px stack (the isolated layer itself stays put so it never leaves its own hover)
data-exploded-static true or 0 to 1 unset Render the diagram at a fixed progress with no pin or scroll; true is fully exploded

Live clock

Add data-exploded-clock to any element inside the scene and it shows the visitor's local time (hours and minutes, updated on the minute); data-exploded-date shows the short weekday and day of month. Both are optional and the element's own text is the no-JS fallback, which is why the demo's markup says 10:09.

Interaction

  • Scroll drives the explosion. Scrolling back re-assembles it.
  • Fast scroll in either direction over-separates and fans the stack in proportion to velocity, then settles with elastic.out(1, 0.38) about 140ms after the last scroll event.
  • Hover a layer or its callout to lift it and dim the others (fine pointers only).
  • Tab to a layer to do the same from the keyboard. Enter or Space pins the isolation so it survives the pointer leaving; press again or hit Escape to release. Tapping on touch devices does the same.
  • The pinned state is exposed as aria-pressed on the layer button.

Accessibility

  • Reduced motion: prefers-reduced-motion: reduce renders the finished diagram, fully exploded and labelled, with no pin and no scroll-linked motion. Isolation still works.
  • Keyboard: every layer is a focusable button; focus mirrors hover, Enter pins the isolation and Escape releases it.
  • Focus visible: :focus-visible draws an accent outline around the focused layer.
  • No JavaScript: the stack renders assembled and the callouts render as a plain list beside it.
  • Screen readers: give each layer button an aria-label naming the part; decorative inner markup should be aria-hidden="true". The mobile legend is an aria-live="polite" region.

Dependencies

Required:

  • GSAP 3.12+ (demo uses 3.15.0)
  • ScrollTrigger plugin

Optional:

  • Lenis (smooth scroll; the shipped script wires it to ScrollTrigger's clock when present and honours data-smooth="off" on <html>, ?smooth=off in the URL, and reduced motion)

Worked examples, the events and programmatic API, and the class reference ship with the download, alongside the full source.