A website can look completely functional while remaining impossible to use without
a mouse. A checkout button may appear clickable but not receive keyboard focus. A
menu may open visually without announcing its state to a screen reader. A form may
display an error that assistive technologies never communicate.
These barriers do more than create accessibility failures. They prevent people from
registering, purchasing, submitting forms, booking services and completing other
important journeys.
Correct semantic HTML, appropriate ARIA and reliable keyboard behavior help ensure
that interactive experiences are understandable and operable for a wider range of
users.
What is ARIA?
ARIA stands for Accessible Rich Internet Applications. It provides attributes that
help assistive technologies understand the role, name, state and relationships of
interface elements.
ARIA can be useful when an interface includes custom components whose purpose or
behavior cannot be communicated through native HTML alone. Examples may include
complex tabs, expandable controls, custom dialogs and dynamic status messages.
ARIA does not automatically make an element accessible. It changes how an element
is exposed to assistive technologies, but it does not provide missing keyboard
behavior, focus management or visual feedback.
Use native HTML before ARIA
The safest starting point is to use the correct native HTML element whenever one
already exists.
- Use a
<button>for an action. - Use an
<a>element with a valid destination for navigation. - Use native form controls for inputs, checkboxes, radio buttons and selects.
- Use headings to represent real content structure.
- Use lists for groups of related items.
Native elements include built-in semantics and expected keyboard behavior. A real
button is focusable, announced as a button and activated with standard keyboard
commands. A styled <div> does not provide those features by itself.
The rule: no ARIA is better than incorrect ARIA
Incorrect ARIA can make a usable interface confusing or unusable. For example, adding
a button role to an element does not automatically make it focusable or respond to
keyboard input.
Before adding ARIA, ask:
- Can a native HTML element provide the required behavior?
- Does the component already have an accessible name?
- Will the ARIA state remain synchronized with the visible interface?
- Has the expected keyboard interaction been implemented?
- Has the component been tested with assistive technologies?
Roles, states and properties
Roles
Roles communicate what an element represents, such as a dialog, tab, status
message or navigation region.
States
States communicate a changing condition, such as whether a control is expanded,
selected, checked or disabled.
Properties
Properties communicate additional relationships or information, such as the
element controlled by a button or the description associated with a field.
These values must accurately match the current interface. If a menu is visually
open but still exposes aria-expanded="false", the screen-reader
experience contradicts the visual experience.
Accessible names matter
Interactive controls need meaningful accessible names so users can understand their
purpose.
A control may receive its accessible name from:
- Visible text inside a button or link.
- A properly associated form label.
aria-labelwhen no suitable visible label exists.aria-labelledbywhen another visible element provides the name.
Visible text is usually preferable because it supports all users. When voice-control
users say the label they can see, the accessible name should contain the same words.
What is keyboard accessibility?
Keyboard accessibility means that users can reach, understand and operate all
interactive functionality without relying on a mouse or touch input.
Keyboard access supports people who use screen readers, people with motor
disabilities, users of switch devices, voice-input users and people experiencing
temporary injuries.
Core keyboard requirements
Every interactive element must be reachable
Links, buttons, form fields and custom controls must receive keyboard focus when
they are available for interaction.
Avoid adding tabindex="0" to noninteractive elements merely to make them
focusable. First determine whether the element should be a native interactive
control.
Focus order must be logical
Keyboard focus should generally follow the visual and reading order of the page.
Users should not be forced to jump unpredictably between unrelated areas.
Avoid positive tabindex values such as tabindex="1" or
tabindex="5". They create a separate focus sequence that is difficult
to maintain.
Focus must be visible
Keyboard users need a clear indicator showing which control currently has focus.
Removing the browser outline without supplying a strong replacement creates a
serious barrier.
- Use a visible outline or equivalent focus indicator.
- Ensure it contrasts against the component and background.
- Do not hide focus behind sticky headers, overlays or dialogs.
- Test focus in default, hover, selected and error states.
Keyboard focus must not become trapped
Users must be able to move into and out of components using standard keyboard
commands, except where a temporary focus trap is intentionally required inside a
modal dialog.
In those cases, the dialog must provide a clear method to close it and return focus
to the control that opened it.
Keyboard activation for buttons and links
Native buttons and links already provide expected behavior. Custom controls require
developers to reproduce that behavior carefully.
- Buttons should respond to Enter and Space.
- Links should navigate when activated with Enter.
- Controls should not require mouse-specific events.
- Click handlers should be attached to the correct semantic element.
A visual element with an onclick handler is not automatically a button.
It may lack focusability, semantics and keyboard activation.
Skip links
Repeated headers and navigation can require many Tab presses before users reach the
main content. A skip link allows keyboard users to bypass repeated blocks.
A useful skip link:
- Appears when it receives keyboard focus.
- Links to the actual main-content container.
- Moves focus to a meaningful destination.
- Remains visible long enough to be understood and activated.
Menus and dropdown navigation
Navigation menus often create barriers when mouse hover is the only way to expose
submenu items.
An accessible submenu trigger should normally:
- Be implemented as a button when it opens or closes content.
- Receive keyboard focus.
- Expose whether the submenu is expanded or collapsed.
- Identify the submenu it controls.
- Support Escape to close the submenu.
- Return focus logically after closing.
- Remain usable at mobile and desktop breakpoints.
Visual hover behavior can remain available for mouse users, but it should not be the
only method of operation.
Dialogs and modal windows
Dialogs require both semantic information and deliberate focus management.
When a dialog opens
- Move focus into the dialog.
- Provide an accessible dialog name.
- Keep background content from receiving focus when appropriate.
- Make the close control easy to find and operate.
While the dialog is open
- Keep focus within a modal dialog.
- Support Escape when closing is allowed.
- Ensure all visible controls are keyboard operable.
- Avoid unexpected focus movement.
When the dialog closes
Focus should normally return to the control that opened the dialog or to another
logical location when the original control no longer exists.
Tabs and accordions
Tabs and accordions may look similar but have different interaction patterns.
Their semantics and keyboard behavior should match the component being presented.
Tabs
- Identify the tab list, tabs and associated panels.
- Expose which tab is selected.
- Associate every tab with its panel.
- Support the expected arrow-key behavior.
- Keep inactive panels hidden appropriately.
Accordions
- Use buttons for accordion headings.
- Communicate expanded and collapsed state.
- Associate each button with its content panel.
- Allow standard Tab navigation between controls.
Forms, errors and validation
Form accessibility requires more than adding labels. Users need to understand field
purpose, requirements, errors and successful submission.
- Associate every field with a visible label.
- Explain required formats before submission.
- Communicate required and invalid states correctly.
- Connect error messages to the relevant fields.
- Move focus to the first invalid field or a clear error summary.
- Announce important submission results.
- Preserve entered information after errors.
ARIA can communicate additional state, but it should not replace visible labels,
instructions or error messages.
Dynamic updates and live regions
Some changes happen without loading a new page, such as adding an item to a cart,
displaying search results or confirming that a form was submitted.
When users need to know that an update occurred, the message may need to be exposed
through an appropriate live region or status mechanism.
Avoid announcing every minor visual change. Excessive announcements can make the
interface difficult to understand. Communicate only changes that are important to
completing the task.
Hidden content and keyboard focus
Content that is visually hidden should generally not remain available in the keyboard
sequence when users cannot see or interact with it.
Common problems include:
- Closed menus whose links remain focusable.
- Inactive carousel slides containing focusable controls.
- Hidden dialog content remaining in the Tab order.
- Off-screen panels receiving focus before they are opened.
The visual state, keyboard state and accessibility-tree state must remain synchronized.
Common ARIA mistakes
- Adding a role without implementing the required behavior.
- Using
aria-labelto replace useful visible text. - Applying contradictory roles to native controls.
- Using invalid or unsupported ARIA attributes.
- Leaving expanded, selected or checked states outdated.
- Referencing IDs that do not exist.
- Creating duplicate IDs.
- Using ARIA to hide important visible content from assistive technologies.
- Assuming ARIA fixes inaccessible keyboard behavior.
How accessibility barriers affect conversion journeys
A user who cannot operate a primary button or complete a form cannot convert,
regardless of how persuasive the page content is.
Keyboard and ARIA problems commonly affect:
- Account registration.
- Product selection and checkout.
- Booking and scheduling.
- Newsletter subscriptions.
- Contact and lead-generation forms.
- Authentication and password recovery.
- Pricing calculators and configuration tools.
Accessibility improvements do not guarantee higher conversion rates, but removing
interaction barriers makes it possible for more users to complete the intended
journey.
Testing keyboard and ARIA behavior
Keyboard-only testing
- Start at the top of the page.
- Use Tab and Shift+Tab to move through all interactive controls.
- Confirm that focus is always visible.
- Activate buttons, links, menus and dialogs using the keyboard.
- Check that focus order matches the interface.
- Verify that no component creates a keyboard dead end.
- Test Escape, arrow keys, Home and End where the component pattern requires them.
Screen-reader testing
- Confirm that controls have meaningful names and roles.
- Check that states are announced accurately.
- Review heading and landmark navigation.
- Test form labels, instructions and errors.
- Verify dynamic status announcements.
- Complete important journeys from beginning to end.
Automated testing
Automated tools can detect some missing names, invalid attributes, duplicate IDs and
structural problems. They cannot confirm whether the full keyboard interaction or
user journey makes sense.
Reliable testing combines automated detection, manual keyboard review, assistive
technology testing and verification of corrected behavior.
Developer checklist
- Use native HTML controls whenever possible.
- Do not add ARIA unless it provides necessary information.
- Implement the expected keyboard interaction for custom widgets.
- Keep ARIA states synchronized with visible states.
- Provide meaningful accessible names.
- Maintain logical focus order.
- Manage focus when dialogs and dynamic components open or close.
- Ensure hidden content is removed from keyboard navigation.
- Test important journeys using only the keyboard.
- Verify behavior with assistive technologies.
How Pluro supports behavioral accessibility testing
Pluro is an accessibility workflow platform that connects automated findings,
manual review, behavior evidence, remediation guidance and verification.
Teams can use Pluro to document keyboard dead ends, modal-focus problems, form-error
behavior and dynamic interface issues that static code checks may not fully explain.
Findings can be assigned to developers with evidence and reproduction steps, then
retested before they are marked as resolved.
Pluro does not replace semantic development or expert review. It provides a structured
process for moving accessibility issues from detection through verified remediation.
Remove barriers from critical user journeys
Start by testing the actions that matter most to users and the business: registration,
login, forms, checkout, search, navigation and account management.
Confirm that every important control is reachable, visible, understandable and
operable without a mouse. Then verify that screen readers receive accurate names,
roles and states throughout the interaction.
Explore Pluro Behavior Evidence
or
start a 14-day free trial
with no credit card required.