Your solution adds complexity to the page content with very little, if any, payoff. It requires the user to be aware of the precise time, to be aware of whether a very small region of the page has changed ever so slightly, and does not provide any additional value beyond acting as a poor proxy for whether the user’s attempt to refresh did anything.
A short loading animation is easily visible to the user (we’re great at seeing motion), it’s immediately obvious what it means, and it vanishes as soon as it’s no longer relevant. It communicates exactly the necessary information, no more, no less.
I find a small acknowledgement that the thing works is better than just having an arbitrarily long loading indicator.
For greater guidance on this, the Nielsen Norman Group says thusly:
> Use a progress indicator for any action that takes longer than about 1.0 second.
> [A looped loading animation] should be reserved for actions that take between 2-10 seconds. For anything that takes less than 1 second to load, it is distracting to use a looped animation, because users cannot keep up with what happened and might feel anxious about whatever flashed on the screen
> Generally, percent-done progress indicators should be used for longer processes that take 10 or more seconds.
Spinners are typically used for "indeterminate" operations while progress bars are typically used for "determinate" operations¹.
"Progressive" is a less useful adjective here because indeterminate operations progress too, and it's just that their total duration can't be usefully estimated.
And as you note these aren't hard-and-fast rules, and a spinner is generally a perfectly fine choice for short determinate operations.
¹ Progress bar controls typically have an indeterminate flavor too, and these can be mixed. For example, you'll typically see an indeterminate form of a progress bar until a total duration can be estimated, at which point the progress bar will change to its determinate form.
Good point - I was simplifying by referring to all progressive animations as "progress bars" and all non-progressive animations as "spinners".
>indeterminate operations progress too
I normally think of "non-progressive" and "indeterminate" as synonymous in this context. If the UI can't tell what fraction of the whole has been completed by any metric (which could even include best guesses based on historical data), I refer to that as non-progressive or indeterminate, interchangeably.
I thought it was fairly well accepted that small deliberate UI delays (for things like loading spinners and animations) can in many cases result in a better user experience. Of course, that would depend on how long this animation is that you're talking about.
Like hard bristle toothbrushes. Hard bristle toothbrushes are not good for your gums. So why do they make them? Because customers like hearing the sound of the toothbrush brushing. They like hearing it do something.
Maybe this would be a useful way to look at it: if the average disorientation caused by instant change (which also depends on whether the change is predictable, makes other things change position, etc.) takes longer to recover from than the shortest animation/fade you could come up with, have a transition.
(but even then it doesn't hurt to gate all of that behind a global configuration option, IMO, and if you want to be really fancy make it a float, not a boolean)
In the software world, designers need to be engineers (or work very closely with engineers, very early in the process). We recently had designers give us a nice looking progressive indicator for a non-progressive operation that happened to take a somewhat predictable amount of time. Business loved the look and visual feedback. Then we got use cases where the operation could be instantaneous. They didn't want to skip the progress animation because they liked how it made the app feel like it was doing something, and also if the user got the result instantly, it was "jarring". So now, even if the operation finishes instantly, we show the animation, wasting the user's time.