Reference guide · html-css-js · Published 2026-08-16 · 4 min read

ARIA accessibility basics

ARIA accessibility basics: what ARIA does, roles, states and properties, common patterns (tabs, modal, live regions), and what not to add.

The first rule: prefer native HTML

ARIA (Accessible Rich Internet Applications) is a bridge used when native HTML cannot express a widget or a state. The governing principle is: use the native element before ARIA. A <button> is a button; a <div role="button"> needs all the keyboard, focus and semantics a native button gets for free.

The practical consequence: before writing ARIA, ask whether the HTML already says it: a <nav>, a <main>, an <input>, a <dialog>. If the native element exists, changing it to ARIA usually removes accessibility by accident of losing the built-in keyboard/focus handling. The semantic HTML article is the natural prerequisite.

The three-way split

ARIA splits into three tracked categories across its spec:

  1. Roles: say what an element does (role="navigation", role="dialog", role="alert", role="tab"). Prefer native semantic for most; ARIA roles are for when no native element fits (a rich widget, a live region).
  2. States: aria-disabled, aria-expanded, aria-pressed, aria-haspopup, aria-busy. These reflect current widget state that visual-only cues hide from a screen-reader user.
  3. Properties: aria-label, aria-labelledby, aria-describedby, aria-controls, aria-live, aria-hidden. These relate to how the assistive tech interprets the element.

The honest rule of thumb is a table, and the rule errs on the side of "no ARIA unless the native element does not exist":

IntentNative firstARIA when needed
Navigation<nav>role="navigation" only for a wrapper that <nav> cannot name
Button<button>only for a clickable non-native that cannot be a button
Heading<h1-h6>role="heading" aria-level="N" (rare)
Live region (chat, toast, ticker)-- no nativerole="status" / aria-live="polite" or role="alert"

The two label properties that matter

Never put aria-label on an element whose text content already equals the label (violates the label-principle), and never on a <div> that cannot take focus unless the widget also has the keyboard handler.

Live regions, done right

A live region is the ARIA pattern with the most user-visible value: it announces content inserted into the page without focus. The two common verbs:

<div role="status" aria-live="polite">2 new messages</div>

Load the entire replacement string at once; injecting each character or word separately makes a screen-reader vocalize letter by letter. The accessible-forms article has the form-error pattern that complements it.

The two anti-patterns that hurt

Validate

When you are done

ARIA is a discipline of subtraction: the correct markup removes the need for most ARIA. A page that uses semantic HTML plus visible labels plus a single aria-label on an icon button belongs to the minority where ARIA is doing real work. The rule set above is the whole basis of "ARIA basics": prefer native, use the label pair correctly, and keep live regions precise. For keyboard and interaction design beyond the basics, accessible forms and the broader HTML line are the next stop.

Need a website built, fixed, optimised, migrated or replaced?

This technical resource is written by CSMBAC, a small design and development studio. If you would rather hand the problem to a professional, the website service page explains how we build enquiry-ready websites.

Explore website services