Overview
Typed halftone drift turns a procedural dot field into an animatable surface. The key is that the dots are not a bitmap and the animation is not swapping entire gradient declarations. radial-gradient() layers define the halftone, while @property exposes numeric controls for offset, radius, density, or angle.
When to use it
Use it for editorial headers, poster-like cards, small branded backgrounds, and data-adjacent surfaces where the dot structure is part of the visual language. It is strongest when the viewer should notice the printing or screen pattern itself. Avoid it behind long text, dense controls, or small numeric labels unless a stable overlay preserves contrast.
How it works
The background is made from repeated radial gradients whose positions and sizes are driven by custom properties. @property registers values with syntax such as <length>, <percentage>, or <angle>, allowing keyframes to move numeric controls instead of a whole gradient string.
Production gotchas
A new showcase example should change the expression method: offset drift, density shimmer, scale pulse, and duotone phase are distinct. Merely recoloring the same dot drift for another domain is not enough. Also watch paint cost at large sizes; procedural backgrounds can still repaint if the animated properties affect the gradient surface every frame.
Accessibility
The halftone is decorative. Keep text outside the moving dot contrast or behind a stable surface, and test the highest-density frame as well as the rest frame. Reduced motion should stop both dot drift and density shimmer while leaving a static halftone that still fits the design.
References