The many lives of a notification
Notifications: a field guide
Your guide:
- herds cats at Microsoft
- web developer
- looks at lots and lots of products
Human Interaction
Classifications and terms
What is a “Live Region”?
aria-live
assertive vs. polite
ARIA Roles
ARIA attributes
aria-atomic
: what is read?
aria-relevant
: when is it read?
aria-busy
: maybe don't read this.
The <output> element
The output element represents the result of a calculation performed by the application, or the result of a user action.
(Also, just read Scott's article)
Domestic Notifications
Type |
Assertive or polite |
Habitat |
What sort of UI does it commonly occur in |
Rarity |
How common is this type of notification |
Risk |
How likely is it for this live region to fail if used? How high are the consequences if it does? |
Loading...
Type |
Polite |
Habitat |
Wide-ranging; can be found almost anywhere. |
Rarity |
Common |
Risk |
Low |
- aria-live="polite"
- aria-busy="true"
Form errors
Type |
Polite for inline errors, assertive after submit |
Habitat |
Found exclusively within forms |
Rarity |
Common |
Risk |
Medium |
- role="alert"
- aria-live="polite"
- aria-live="assertive"
Search results
Type |
Polite and concise |
Habitat |
Any search or filter interface |
Rarity |
Common |
Risk |
Medium |
- role="status"
- aria-live="polite"
Progress indicators
Type |
Polite / progressbar |
Habitat |
Wide-ranging; often found with upload and download UI |
Rarity |
Common |
Risk |
Low |
Toasts
Type |
Assertive / alert (or depending on the message) |
Habitat |
Primarily confined to application-style interfaces |
Rarity |
Uncommon |
Risk |
High |

NOAP.
- role="alert"
- role="status"
Feeds and Chat messages
Type |
Log + assertive or polite |
Habitat |
Within application-style interfaces, usually where they are the main feature |
Rarity |
Uncommon |
Risk |
High |
- role="log"
- aria-live="assertive/polite"
- aria-atomic="false"
Live charts and data
e.g. a stock ticker or CPU usage graph
Type |
marquee (unsupported) |
Habitat |
Specialized scenarios, primarily within applications |
Rarity |
Rare |
Risk |
High |
Timers
Type |
timer (unsupported) |
Habitat |
Booking sites, tests, specialized cases |
Rarity |
Rare |
Risk |
High |
Feral Notifications
How to recognize and avoid dangerous live regions in the wild
Control hints
Habitat |
Non-standard controls, or ARIA patterns with poor support |
Rarity |
Medium |
Defense |
Use standard, supported HTML and ARIA, simplify UI, write static instructions |
Context changes
e.g. popups opening, SPA navigation with focus management
Habitat |
Dropdowns, dialogs, single page apps, and complex controls |
Rarity |
Common |
Defense |
Drop the live region, and let the focus change do the work |
ARIA state changes
Habitat |
Accordions, menus, toggle buttons, and any widget that changes state |
Rarity |
Uncommon |
Defense |
ARIA state attributes |
The quick wrap
i.e. <ul class="search-results" aria-live="assertive"> ... </ul>
Habitat |
Primarily found in application interfaces with many content changes |
Rarity |
Uncommon |
Defense |
Custom live regions with tailored, concise text |
Tips for getting along with your new notification
So you've decided to implement a new notification, but things aren't going well; now what?
1. Keep it concise
2. Don't use special characters or non-text content
3. Set a timeout to remove notification text
4. Handle insertion vs. updates wisely
An empty aria-live element
Update 1
Update 2
6. Create a notifications center
7. Debug with a mutation observer
function observeElement(element) {
const onMutuate = function(mutationsList, observer) {
for(let mutation of mutationsList) {
if (mutation.type === 'childList') {
console.log('A child node has been added or removed.');
}
else if (mutation.type === 'attributes') {
console.log(`${mutation.attributeName} was modified.`);
}
}
};
const observer = new MutationObserver(onMutuate);
observer.observe(element, config);
}
8. Don't use a live region!
Instead:
- Move focus
- Write clear UI instructions
The future of notifications
Image credit: Lisette Murphy
File support issues
Get involved in standards!
Let them know what you think
marquee, timer, or something new, could enable UI like this:
Push for browsers, screen readers, and specs to handle common use cases for you
at forums like the Web We Want
And finally, use your powers wisely
Links