The most common indicator for short, unpredictable waits — a chat reply, search-as-you-type, right after a button submit. It only says "something is happening," with no number or percentage, so once a task can report real progress (a file upload or download), switch to a progress bar instead.
Built by giving each dot the same keyframe and offsetting animation-delay by 0.2s per dot. A single blinking dot reads as broken; three in sequence create a rhythm that reads as "still working."
For a wait that covers the whole screen, a skeleton usually feels faster than three dots. For people who've asked for less motion, consider swapping the blink for static "Loading…" text under prefers-reduced-motion in production. Give the wrapper role="status" and aria-live="polite", and hide the dots themselves with aria-hidden="true" since they're purely decorative.