Designers rarely think about ARIA until an accessibility audit lands on their desk with a line like “custom dropdown missing role and state.” At that point, the fix often means rebuilding a component that looked perfect in the design file.
ARIA does not have to be a developer-only mystery. A little knowledge helps designers make better component decisions, write clearer handoff notes and avoid creating patterns that are hard to make accessible. This guide explains what ARIA is, the handful of concepts worth knowing and the mistakes to avoid.
What Is ARIA?
ARIA stands for Accessible Rich Internet Applications. It is a set of attributes, defined by the W3C’s WAI-ARIA specification, that you add to HTML elements to give assistive technologies extra information about what an element is, what state it is in and how it relates to other elements.
Screen readers do not see visuals. They read the page’s underlying structure. A standard button tells a screen reader “this is a button.” A custom control built from generic elements tells it nothing. ARIA fills that gap by adding the missing information.
Think of ARIA as labels and annotations for assistive technology. It changes what is announced, but it does not change how an element looks or behaves. It adds no keyboard support and no focus handling. Those still have to be built.
Why Designers Should Care
- Design choices create the need for ARIA. Custom tabs, comboboxes, accordions, tooltips and carousels are the usual places where ARIA is required, and designers decide whether those patterns exist.
- Behavior is part of the design. How a menu opens, where focus goes and what is announced are design decisions, not implementation details.
- Clear specs prevent rework. When designers describe roles, states and announcements in handoff, developers build the right thing the first time.
- It supports inclusion. For the wider context, read our guide to inclusivity and accessibility in experience design.
The First Rule of ARIA
The most important principle is this: if a native HTML element already does the job, use it instead of ARIA.
A real button element comes with a role, keyboard activation, focus behavior and screen reader announcements built in. A styled div with role=”button” needs all of that rebuilt manually, and it is easy to get wrong.
Large-scale analyses of home pages have found that pages using ARIA tend to have more detected accessibility errors than pages without it. This is not because ARIA is bad. It is because incorrect ARIA misleads users with confident but wrong information. No ARIA is better than bad ARIA.
So the practical order of preference is:
- Use a native element
- Use a native element plus a small amount of ARIA for extra state
- Use ARIA on a custom component only when there is truly no alternative
The Three Building Blocks of ARIA
1. Roles: what is it?
A role tells assistive technology what type of thing an element is. Examples include button, dialog, tablist, tab, tabpanel, menu, alert and navigation. Many roles map to native elements, which is why you rarely need to add them manually.
2. Properties: what are its characteristics?
Properties describe relationships and features that tend not to change often. Examples include:
- aria-label: provides an accessible name when no visible text exists
- aria-labelledby: points to another element that contains the name
- aria-describedby: points to extra help text or an error message
- aria-controls: indicates which element this control affects
- aria-required: marks a field as required
3. States: what is it doing right now?
States describe conditions that change as users interact. Examples include:
- aria-expanded: whether a collapsible section is open or closed
- aria-selected: whether a tab or option is selected
- aria-checked: the state of a custom checkbox or toggle
- aria-pressed: whether a toggle button is on
- aria-current: the current page, step or item
- aria-invalid: whether a field has an error
- aria-disabled: whether a control is unavailable
States must be updated in real time to match what is shown on screen. A menu that looks open but still announces “collapsed” is worse than no state at all.
ARIA Attributes Designers Should Know
Accessible names: aria-label and aria-labelledby
Every interactive element needs a name that is announced. An icon-only button, such as a magnifying glass, needs a text name like “Search.” Use visible text where possible, because it helps everyone. When it is not visible, ARIA provides the name.
Keep one rule in mind: the accessible name should include the visible label text. If a button says “Buy now” on screen, an aria-label of “Purchase” breaks speech-control users who say “click Buy now.” Clear, consistent UX writing pays off here.
Landmarks
Roles such as banner, navigation, main, search and contentinfo (and their native elements: header, nav, main, footer) let screen reader users jump between regions. If a page has several navigation regions, give each a distinct label, such as “Main” and “Footer,” so users can tell them apart.
Live regions
Dynamic updates, such as toasts, form errors, cart changes and search results, often appear without moving focus, so screen reader users miss them. A live region announces changes automatically:
- aria-live=”polite” waits for a pause before announcing, suitable for most updates
- aria-live=”assertive” interrupts, so reserve it for urgent messages
- role=”status” and role=”alert” are shortcuts for polite and assertive behavior
Overusing live regions floods users with noise, so announce only what matters.
Hiding content: aria-hidden
aria-hidden=”true” removes an element from the accessibility tree, which is useful for purely decorative icons. But never apply it to something focusable, because keyboard users can still land on an element that screen readers pretend does not exist.
Examples: ARIA in Common Components
Icon button. A hamburger icon with no visible text needs an accessible name such as “Open menu,” and aria-expanded to show whether the menu is open.
Accordion. Each heading contains a button. The button uses aria-expanded to show open or closed and aria-controls to point to its panel.
Tabs. A tab list contains tabs with aria-selected, and each tab is linked to a tab panel. Arrow keys move between tabs, and the selected tab is announced.
Modal dialog. The dialog has a role, a name from its heading and aria-modal to signal that background content is inert. Focus moves in on open and returns to the trigger on close.
Form error. A field with a problem sets aria-invalid, and its error message is linked with aria-describedby, so the message is announced alongside the field. For more on form patterns, see our guide to accessible forms and related inclusive design principles.
How Designers Can Help in Handoff
You do not need to write code to contribute. For each component, document:
- Purpose and name: what is it, and what should be announced?
- Role or native element: button, link, dialog, tab list?
- States and when they change: expanded, selected, disabled, error, loading
- Keyboard behavior: which keys do what, and where does focus go?
- Focus management: what happens to focus on open, close, delete or route change?
- Announcements: what, if anything, should a screen reader say when content updates?
Recording this in your design system and component library means each accessible pattern is designed, built and tested once, then reused everywhere. Established patterns, such as the WAI-ARIA Authoring Practices Guide, give you proven keyboard and ARIA behavior to reference instead of inventing your own.
Common ARIA Mistakes
- Using ARIA when a native element would do, such as role=”button” on a div
- Adding ARIA without keyboard support, since ARIA never adds behavior
- Redundant or conflicting roles, such as role=”button” on a link that navigates
- aria-label that differs from visible text, breaking speech control
- aria-hidden on focusable elements
- States that never update, leaving aria-expanded stuck on “false”
- Overusing aria-live, creating constant interruptions
- Putting aria-label on non-interactive elements, where many screen readers ignore it
- Inventing custom patterns instead of following established ones
- Treating ARIA as a final-stage patch instead of designing accessible components from the start
How to Test ARIA
- Run automated checks with tools such as axe or Lighthouse to catch invalid roles and missing names.
- Inspect the accessibility tree in browser developer tools to see what assistive technology actually receives.
- Test with real screen readers: NVDA, JAWS, VoiceOver and TalkBack can behave differently.
- Navigate with the keyboard only, checking that states and focus match what is announced.
- Include assistive technology users in research. A structured approach to usability testing and feedback loops makes this a regular practice.
A Quick Checklist
- Is there a native element that could replace the custom component?
- Does every interactive element have a clear accessible name?
- Do states such as expanded, selected and invalid update in sync with the visuals?
- Is keyboard support and focus management designed alongside the ARIA?
- Are live regions used sparingly and only for meaningful updates?
- Has it been tested with a screen reader and real users?
Bringing It All Together
ARIA is a powerful tool, but a sharp one. For designers, the essentials are simple: prefer native elements, give every control a name, keep states honest and specify behavior in handoff. You do not need to memorize every attribute. You need to know when a pattern is custom enough to need extra care, and to bring that up early.
Pick one custom component in your product this week, such as a dropdown, tab set or modal, and write down its role, states, keyboard behavior and announcements. If you cannot, you have found a spec gap worth closing.
If you want help designing accessible, consistent products, work with a trusted UI UX design company in Bangalore that can help you design, test and refine experiences that work for every user.