ARIA state
aria-selected
Whether an option, tab or row is the chosen one.
It marks the chosen item, and its absence means something too. True is selected. False is selectable and not currently selected. Leaving it off altogether means not selectable at all.
Which roles may carry aria-selected
- Value
- true/false/undefined
- Filed as
- A state, which is how ARIA files it and not a rule about how often it changes.
- Roles that inherit it
columnheader,rowheader,treeitem
Those lists are not advice. Browsers are required to ignore a non-global attribute sitting on a role that does not support it, so aria-selected on the wrong element is not weak, it is absent. You can read it in the DOM and nobody using a screen reader can.
Every role above comes from the specification's own list for this attribute, checked name for name. The normative definition stays with the W3C, in the aria-selected section of the ARIA specification.
Keeping aria-selected true
So it has to move across two elements on every change, off the old one and on to the new one, and the half that gets forgotten is nearly always the first. Two tabs both claiming to be selected is what that looks like from the outside. In a multiselectable widget the job is bigger, because the spec asks that every selectable descendant carries false so that absence keeps meaning something. And where a widget genuinely has selection, this is the attribute for it rather than aria-current, which the spec says should not stand in for it.
How aria-selected gets checked
There are test rules that check an ARIA attribute is one that exists, is allowed on the role underneath it, and carries a value of the right type. What they map to is ARIA's own author requirements rather than any WCAG criterion, so a misplaced attribute breaks ARIA without being a WCAG failure by itself. It becomes one under 4.1.2 Name, Role, Value the moment the missing or wrong value means the control's state cannot be worked out programmatically, which is what usually happens next.
Nothing automated catches the failure this page is about. A stale value is a valid value, on a permitted role, with the right type. It is only wrong about the world.
Attributes you will meet alongside aria-selected
- aria-checked Whether a checkbox, radio or switch is on, off, or partly on.
- aria-colindex Which column a cell is in, counting from the real table rather than what is shown.
- aria-disabled Says a control is present but not available. Unlike the disabled attribute, it stays focusable, so people can still find out it is there.
- aria-errormessage Points at the message explaining why this field is invalid. Only meaningful while aria-invalid is set.
- aria-expanded Whether the thing this control opens is currently open.
- aria-haspopup Says this control opens something, and what kind of thing it opens. A menu, a dialog, a listbox.
- aria-invalid Says a field's value has failed validation.
- aria-level The depth of a heading or a tree item, counting from one.
Every ARIA state and property · Every ARIA role · ARIA explained