Once shown, keep it long enough to avoid flicker
Aliases: spinner min time · anti-flicker · linger
What it is
Once an indicator has crossed the show threshold and actually appeared, it must not be taken down on the next frame. A minimum display duration makes the spinner a perceptible event rather than a flash. It is the complement of “don’t show for a very short load”: what never appeared should not be forced on; what has appeared should not vanish as a blink. Without a minimum, the threshold only moves the flash from “request start” to “just after the threshold.” The flash remains.
Why it happens
Perceiving a new object requires it to sit still in view. If the request ends as the spinner is drawn, appearance and disappearance stack inside one glance; people log “something blinked,” not “the system worked.” Worse, the flash often sits next to the frame where content is about to replace it, so indicator and content fight for the same attention—like a fault. A minimum duration makes “working” a readable state, then cuts to the result. Some already-finished requests will appear to wait a little longer on the surface. That wait is deliberate: it buys a readable state, not extra compute. Treat that leftover as a performance bug and “optimize it away,” and flicker returns at the threshold’s edge.
Where it stops holding
The minimum must not be so long it feels like stalling on purpose. It covers perceptual stability, not pretend busyness. A burst of short requests each given their own minimum will glue the indicator on; they should share one showing, and only the last ending should run the minimum tail. A determinate bar already in motion does not need a spinner’s minimum; the bar is already a readable state. For assistive live regions, a minimum reduces how often show/hide is spoken, which is a good side effect; but if the minimum keeps a failed request looking like a load, speech will be wrong—failure should be allowed to break the minimum.
Applying it
- When the indicator is actually inserted, start a minimum visible interval; remove it only when that interval has elapsed and the request has ended.
- Ship show-delay and minimum duration as a pair, not as a single knob. Delay alone piles the flash just after the threshold.
- Consecutive requests in the same region should share one indicator instance, not each run a full minimum.
- Verify by tuning request time to sit just past the show delay: does the spinner complete a readable turn, or flash a frame. A flash means the minimum never attached.