Loading
Loading is the wait between asking for something and having it. Show the shape of what is coming at once, and say in words when the wait runs long.
Choosing the indicator
Tie the indicator to what is waiting and keep the rest of the page working. A panel that loads does not block the page, and a page that loads does not hide behind a spinner.
A page or a panel opens
Its skeleton, from the first frame.
A button starts work
The button stops taking presses at once. Its spinner appears after a second.
A list loads more rows
A 20 px spinner in the list footer.
- Sita Gurung
- Ram Thapa
Work of known size
A progress bar with counts, where the work started.
Importing candidates41%
candidates.xlsx1,240 of 3,000 candidates
Work that outlasts the page
The bar where it started, then a toast or a notification when it ends.
As the wait grows
Each step keeps what you already see. The skeleton stays in place, and a message that arrives late sits above the content, not over it.
Up to a second
A button waits disabled. A page already shows its skeleton.
Up to ten seconds
The skeleton, or the spinner of the button.
After ten seconds
A neutral inline message above the content says what is still loading.
When the request fails
The error in place, with Try again.
The board is still loading. Your connection may be slow.
| Name | Status | Owner | Country |
|---|
Offline
When the connection drops, the page keeps what it has and says so in a neutral band. Actions that need the network wait and run when it returns, or say that they cannot.
You are offline. Some actions wait until the connection is back.
- Sita Gurung
- Ram Thapa
- Bikash Rai
When part of it arrives
Show what arrived, and name what did not in a warning band at the top of the list, with Try again: “Some notifications did not load.” The rows that loaded stay where they are.
Notifications
Some notifications did not load.
- Ana Horvat9:42
- Marko Babić9:15
What a screen reader hears
The loading region is marked busy and says one sentence, such as “Loading candidates”. A wait you started with a button is carried by the button's busy state. When the content arrives, focus stays where it was.
<section aria-busy="true">
<p role="status" class="visually-hidden">Loading candidates</p>
<div aria-hidden="true"><!-- the skeleton rows --></div>
</section>