# Camera move animations in CSS

> Camera move animations for HTML video: push, pull, parallax dive, rack focus and crash zoom, built from one scale and one translate.

Canonical: https://vawe.dev/video-components/group/move-the-camera
Last updated: 2026-11-03

A camera move in a page is a transform on a wrapper. Push toward a subject, pull back to the whole, fly through layers at real depths, or move focus from near to far. The group also holds the lens, which films a screen as a real object, and a gradient ground that moves under the title.

Scale runs on a log path, so a zoom reads at an even speed instead of racing at the end. The camera holds still by default.

16 components, 12 with a clip.

## Pick by what the camera should discover

| Component | Use it when |
| --- | --- |
| [Pull back reveal](https://vawe.dev/video-components/pull-back-reveal) | Open tight on a detail and answer with the whole. |
| [UI focus zoom](https://vawe.dev/video-components/ui-focus-zoom) | Zoom onto one part of a captured interface. |
| [Parallax dive](https://vawe.dev/video-components/parallax-dive) | Fly forward through layers, near ones rushing past. |
| [Pan stations](https://vawe.dev/video-components/pan-stations) | Several steps read as one continuous place. |
| [Rack focus](https://vawe.dev/video-components/rack-focus) | Focus moves from one depth layer to another. |
| [Crash zoom](https://vawe.dev/video-components/crash-zoom) | One detail hits on a beat. |
| [Drift hold](https://vawe.dev/video-components/drift-hold) | The line holds still and only the ground drifts. |

## All 16 components in move the camera

- [UI focus zoom](https://vawe.dev/video-components/ui-focus-zoom): zoom onto one part of a captured UI: the cursor lands, then one translate and one scale put the part in the middle
- [Caret follow](https://vawe.dev/video-components/caret-follow): the camera trails the typing caret on a soft spring, so a long line stays readable at close range
- [Pull back reveal](https://vawe.dev/video-components/pull-back-reveal): open tight on a detail and pull back to the whole; scale runs on a log path so the speed reads even
- [Parallax dive](https://vawe.dev/video-components/parallax-dive): the camera flies forward through layers at real depths: near layers rush past, the far ground barely moves; also one camera move on ground, mid and front layers by depth (parallax())
- [Exposure flash](https://vawe.dev/video-components/exposure-flash): a cut on a screen film reads as over-exposure: 3 frames of white, the swap inside the peak, the new shot starts at 2x brightness and settles in 0.15 s; at most 3 flashes a second
- [Lens](https://vawe.dev/video-components/lens): a screen filmed as a real object: tilt, depth, bloom, LED grid, fringes, done as lens work and never faked with CSS layers
- [Camera moves](https://vawe.dev/video-components/camera-moves): a whole world as one wrapper: push toward a subject (the ground scales less so the layers separate), pull, whip between worlds (camera()); the camera holds still by default
- [Depth resolve](https://vawe.dev/video-components/depth-resolve): far words small and soft resolve as the camera arrives; a focus pull (focus())
- [Scale through](https://vawe.dev/video-components/scale-through): fly into a plain element and its colour is the next world, in Web Animations only
- [Direction wipe](https://vawe.dev/video-components/direction-wipe): a mask edge moves the way the last move went and reveals the next beat
- [Arrival spring](https://vawe.dev/video-components/arrival-spring): EASE.nudge on one arrival in three, EASE.pop on the one that matters (nudgeEvery)
- [Rack focus](https://vawe.dev/video-components/rack-focus): focus moves from one depth layer to another: near melts, far resolves, pinpoint lights swell into discs; use once per film
- [Drift hold](https://vawe.dev/video-components/drift-hold): the line holds still while only the ground drifts, so a held frame never sits dead
- [Gradient mesh field](https://vawe.dev/video-components/gradient-mesh-field): a title sits on a living ground: four soft colour pools drift on seeded paths in one fragment shader, with grain against banding; the copy keeps 4.5:1
- [Pan stations](https://vawe.dev/video-components/pan-stations): several steps or features as one continuous place: the camera pans between stations on one wide canvas and holds at each, a rail and a parallax dot grid carrying the space between them
- [Crash zoom](https://vawe.dev/video-components/crash-zoom): one detail hits on a beat: a 0.13 s ease-in slam to 2.6x with real zoom blur from 16 stacked exposures, a 5 percent overshoot and a short recoil

## Rules that come with this group

- The camera holds still by default. camera-moves wraps a whole world so a push makes the ground scale less than the layers, and the layers separate.
- rack-focus is for one use per film. exposure-flash uses at most 3 flashes a second.
- crash-zoom gets its blur from 16 stacked exposures, so the smear is real and not a CSS filter.
- A held frame never sits dead: drift-hold moves only the ground so the line stays readable.

## More video components

- [Reveal a title](https://vawe.dev/video-components/group/reveal-a-title)
- [Change between shots](https://vawe.dev/video-components/group/change-between-shots)
- [Point the eye](https://vawe.dev/video-components/group/point-the-eye)
- [End a film](https://vawe.dev/video-components/group/end-a-film)
- [Product moments](https://vawe.dev/video-components/group/product-moments)
- [Grounds](https://vawe.dev/video-components/group/grounds)

## Related

- [Lens and effects](https://vawe.dev/docs/lens-and-effects)
- [Why vawe films the screen as a real lens](https://vawe.dev/blog/real-lens)
- [Motion blur](https://vawe.dev/docs/motion-blur)
- [All 130 video components](https://vawe.dev/video-components)
