React 3D components
Depth, perspective and real rotation, most of it in plain CSS rather than a 3D engine. Copy any one into your project and it runs without a renderer.
Built with the stack you already ship
3D components built with CSS
These use transform, perspective and preserve-3d only. No renderer, no shader compilation, and no extra bytes beyond the component itself.
Split-Flap Vestaboard DisplayA mechanical character cascade in pure CSS 3D, running 80 cells at a solid 60fps.
Dimensional Book CoverA tactile 3D book cover that opens on click with real matte depth, then turns each page on a weighted hinged flip.
Lifted Archive FolderA tactile archive folder that peels open on click and fans its documents out while the flap hinges away in 3D.
Stack RevealA React 3D card stack built on Framer Motion where the front card drops away, the deck promotes, then it returns.
Perspective MarqueeA 3D tilted image grid with alternating rows scrolling infinitely in both directions.
Scroll StackCards that pin, tilt, and stack into a tidy deck as you scroll, with zero scroll hijacking anywhere in the sequence.
Fan Hover Card StackHover a stacked profile deck and watch the cards fan outward in sequence while the active one lifts to the front.
Macbook MockupA closed MacBook that hinges open and powers on when you hover, in ten finishes.
iPhone MockupA thick, extruded iPhone with a machined side rail, side buttons, and lock screen.
Tactile KeyboardA 65% QWERTY board with real key travel, live shift legends, and five colorways.
Refraction Glass ContainerReal refraction, where feDisplacementMap warps the actual pixels sitting behind the card instead of blurring them.
3D components built with WebGL
These load a renderer and compile shaders before their first frame. Worth the weight when the effect is the point, and worth checking on a mid range phone.
Interactive 3D GlobeA photo-real Earth carrying animated avatar pins, a soft atmosphere shader, and smooth drag-to-orbit controls.
Chatgpt OrbLow-power WebGL fractal noise that blooms white ink inside a soft circular mask.
Siri OrbA glassy WebGL sphere with a prism ribbon sweeping a full spectrum through it.
CSS 3D or WebGL, and how to tell which you need
Most things people call a 3D component in React are not running a 3D engine at all. A card that tilts toward the cursor, a book that opens, a stack that fans out: all of that is CSS transforms with a perspective value set on the parent and transform-style set to preserve-3d on the child. The browser composites it on the GPU, it costs nothing to load, and it degrades to a flat layout if transforms are unsupported. Reach for this first, because it covers more cases than people expect.
You need actual WebGL when the surface itself has to be computed per pixel. A globe with an atmosphere, a fluid orb, refraction that bends whatever sits behind the element: none of those can be expressed as a transform on a rectangle, because they depend on lighting and distortion across the whole surface. That is the line. If you can describe the effect as moving and rotating flat panels, CSS will do it. If you have to describe it as light behaving a certain way, you need a renderer.
The cost difference is not subtle. A CSS 3D component ships as one file and animates the moment the stylesheet parses. A WebGL component pulls in a renderer, compiles its shaders, and only then paints its first frame, which on a mid range Android phone is a visible pause. That pause is fine three screens down the page and a real problem if the component is the largest thing above the fold, where it becomes the element Google times for Largest Contentful Paint.
Perspective value is the setting that most often makes a CSS 3D effect look wrong. It is the distance from the viewer to the z equals zero plane, so a small number like 400px gives a strong, almost fisheye distortion, and a large number like 2000px flattens the effect until it barely reads. Set it on the container rather than the transformed element, otherwise each child gets its own vanishing point and the group stops looking like one scene.
Whatever you pick, check it against reduced motion. A component that rotates continuously is exactly the kind of thing that triggers motion sickness, and the browser already tells you when someone has asked for less of it. Everything here respects the prefers-reduced-motion media query by settling into a static state rather than disabling itself, so the component still communicates what it is without moving.

