Same job as three dots — a short, indeterminate wait — but position moves instead of brightness, which reads as livelier and more attention-grabbing. It suits playful products like games or messengers; it can feel out of place in a serious dashboard or checkout flow.
Built with a keyframe that oscillates translateY between 0 and a negative value, using ease-in-out (or a bouncier custom cubic-bezier), with animation-delay offset per dot. Because the dots move vertically, leave at least 1.5× the dot height of clearance above and below or they'll clip.
If the task can report real progress, switch to a progress bar or a determinate ring like progress-ring instead. Give the wrapper role="status" and aria-live="polite", hide the dots with aria-hidden="true", and for motion-sensitive users consider reducing the amplitude or falling back to static text under prefers-reduced-motion.