Web accessibility
135 rules the scanning engine runs against web pages (WCAG 2.1 / 2.2).
Images & non-text content
| Rule | WCAG | Impact | Mode | Standards |
|---|---|---|---|---|
| img-alt — Images must have alternative text | 1.1.1 (A) | critical | static | WCAG A EN 301 549 Section 508 Trusted Tester ACT |
| input-image-alt — Image buttons must have alternative text | 1.1.1 (A), 4.1.2 (A) | critical | static | WCAG A EN 301 549 Section 508 Trusted Tester ACT |
| area-alt — Image-map areas must have alternative text | 1.1.1 (A), 2.4.4 (A) | serious | static | WCAG A EN 301 549 Section 508 Trusted Tester ACT |
| svg-img-name — Meaningful SVGs must have an accessible name | 1.1.1 (A) | serious | static | WCAG A EN 301 549 Section 508 Trusted Tester ACT |
| object-alt — Embedded objects must have a text alternative | 1.1.1 (A) | serious | static | WCAG A EN 301 549 Section 508 |
| role-img-name — Elements with role="img" must have a name | 1.1.1 (A) | serious | static | WCAG A EN 301 549 Section 508 Trusted Tester ACT |
| img-redundant-alt — Alt text should not be a file name or duplicate adjacent text | 1.1.1 (A) | minor | static | WCAG A EN 301 549 Best practice |
Forms
| Rule | WCAG | Impact | Mode | Standards |
|---|---|---|---|---|
| label-control — Form inputs must have a label | 4.1.2 (A), 3.3.2 (A) | critical | static | WCAG A EN 301 549 Section 508 Trusted Tester ACT |
| select-name — Select elements must have a label | 4.1.2 (A) | critical | static | WCAG A EN 301 549 Section 508 Trusted Tester ACT |
| button-name — Buttons must have discernible text | 4.1.2 (A) | critical | static | WCAG A EN 301 549 Section 508 Trusted Tester ACT |
| widget-name — Custom interactive widgets must have an accessible name | 4.1.2 (A) | critical | static | WCAG A EN 301 549 |
| form-field-multiple-labels — A form field should not have multiple label elements | 3.3.2 (A) | moderate | static | WCAG A EN 301 549 Trusted Tester |
| fieldset-legend — Radio and checkbox groups need a fieldset and legend | 1.3.1 (A), 3.3.2 (A) | moderate | static | WCAG A EN 301 549 |
| autocomplete-valid — autocomplete attributes must use valid tokens | 1.3.5 (AA) | moderate | static | WCAG AA EN 301 549 ACT |
| label-content-name-mismatch — Accessible name must contain the visible label text | 2.5.3 (A) | serious | static | WCAG A EN 301 549 |
| optgroup-label — Option groups must have a label | 1.3.1 (A), 4.1.2 (A) | serious | static | WCAG A EN 301 549 |
| input-button-name — Input buttons must have discernible text | 4.1.2 (A) | critical | static | WCAG A EN 301 549 Section 508 Trusted Tester ACT |
| on-input-context-change — Changing a control must not auto-submit or navigate | 3.2.2 (A) | serious | static | WCAG A EN 301 549 Section 508 Trusted Tester |
| on-focus-context-change — Receiving focus must not trigger a change of context | 3.2.1 (A) | serious | static | WCAG A EN 301 549 Section 508 Trusted Tester |
| form-error-association — Invalid fields must expose their error message | 3.3.1 (A) | serious | static | WCAG A EN 301 549 Section 508 Trusted Tester |
| form-error-visible — Failed form validation must surface a visible or programmatic error | 3.3.1 (A) | moderate | live | WCAG A EN 301 549 |
| label-title-only — Don’t rely on title or placeholder as the only label | 3.3.2 (A) | minor | static | WCAG A EN 301 549 Best practice |
| accessible-authentication — Authentication must not depend on a cognitive-function test | 3.3.8 (AA) | serious | static | WCAG AA EN 301 549 |
Structure & semantics
| Rule | WCAG | Impact | Mode | Standards |
|---|---|---|---|---|
| heading-order — Heading levels must not skip | 1.3.1 (A) | moderate | static | WCAG A EN 301 549 Best practice |
| empty-heading — Headings must not be empty | 1.3.1 (A), 2.4.6 (AA) | serious | static | WCAG A WCAG AA EN 301 549 Best practice |
| page-has-heading-one — Page should contain a level-one heading | 1.3.1 (A) | moderate | static | WCAG A EN 301 549 Best practice |
| landmark-one-main — Page should have exactly one main landmark | 1.3.1 (A) | moderate | static | WCAG A EN 301 549 Best practice |
| landmark-unique — Landmarks of the same role must be distinguishable | 1.3.1 (A) | moderate | static | WCAG A EN 301 549 Best practice |
| landmark-toplevel — Banner and contentinfo must be top-level landmarks | 1.3.1 (A) | moderate | static | WCAG A EN 301 549 Best practice |
| list-structure — Lists must be structured correctly | 1.3.1 (A) | moderate | static | WCAG A EN 301 549 |
| dl-structure — Definition lists must be structured correctly | 1.3.1 (A) | moderate | static | WCAG A EN 301 549 |
| table-headers — Data tables must have header cells | 1.3.1 (A) | serious | static | WCAG A EN 301 549 Section 508 Trusted Tester |
| table-scope-valid — scope attributes must be valid and on header cells | 1.3.1 (A) | moderate | static | WCAG A EN 301 549 Best practice |
| section-headings — Long content should be organized with section headings | 2.4.10 (AAA) | minor | static | WCAG AAA |
ARIA
| Rule | WCAG | Impact | Mode | Standards |
|---|---|---|---|---|
| aria-valid-role — role must be a valid, non-abstract ARIA role | 4.1.2 (A) | serious | static | WCAG A EN 301 549 |
| aria-valid-attr — aria-* attributes must be valid names with valid values | 4.1.2 (A) | serious | static | WCAG A EN 301 549 |
| aria-allowed-attr — aria-* attributes must be allowed for the element’s role | 4.1.2 (A) | serious | static | WCAG A EN 301 549 |
| aria-required-attr — Roles must declare their required states | 4.1.2 (A) | serious | static | WCAG A EN 301 549 |
| aria-required-children — Container roles must own the required child roles | 1.3.1 (A) | serious | static | WCAG A EN 301 549 |
| aria-required-parent — Roles must be contained by their required context role | 1.3.1 (A) | serious | static | WCAG A EN 301 549 |
| aria-hidden-focusable — aria-hidden elements must not contain focusable content | 4.1.2 (A), 1.3.1 (A) | serious | static | WCAG A EN 301 549 Trusted Tester |
| aria-hidden-body — aria-hidden must not be on the document body | 4.1.2 (A) | critical | static | WCAG A EN 301 549 |
| presentation-role-conflict — role="presentation" must not be on focusable or labelled elements | 4.1.2 (A) | moderate | static | WCAG A EN 301 549 ACT Best practice |
| aria-idref-integrity — ARIA ID references must resolve unambiguously | 1.3.1 (A), 4.1.2 (A) | serious | static | WCAG A EN 301 549 |
| orphan-aria-reference — Named-required elements should not be left without a name | 4.1.2 (A) | minor | static | WCAG A EN 301 549 |
| status-messages — Live regions must be able to announce status messages | 4.1.3 (AA) | serious | static | WCAG AA EN 301 549 |
| nested-interactive — Interactive controls must not be nested | 4.1.2 (A) | serious | static | WCAG A EN 301 549 Trusted Tester |
Document, language & navigation
| Rule | WCAG | Impact | Mode | Standards |
|---|---|---|---|---|
| html-lang — The page must declare its language | 3.1.1 (A) | serious | static | WCAG A EN 301 549 Trusted Tester ACT |
| html-lang-valid — The page language must be a valid BCP-47 tag | 3.1.1 (A) | serious | static | WCAG A EN 301 549 Trusted Tester ACT |
| valid-lang — lang on inline content must be a valid tag | 3.1.2 (AA) | moderate | static | WCAG AA EN 301 549 Trusted Tester ACT |
| document-title — The page must have a non-empty title | 2.4.2 (A) | serious | static | WCAG A EN 301 549 Trusted Tester ACT |
| duplicate-id — id attributes must be unique | 4.1.1 (A), 1.3.1 (A) | moderate | static | WCAG A EN 301 549 |
| meta-viewport — The viewport must allow zooming | 1.4.4 (AA) | serious | static | WCAG AA EN 301 549 ACT |
| bypass-blocks — Page must offer a way to skip to content | 2.4.1 (A) | serious | static | WCAG A EN 301 549 Section 508 Trusted Tester |
| tabindex-positive — Avoid positive tabindex values | 2.4.3 (A) | moderate | static | WCAG A EN 301 549 Best practice |
| accesskeys-unique — accesskey values must be unique | 2.1.1 (A) | minor | static | WCAG A EN 301 549 Best practice |
| frame-title — Frames must have a descriptive title | 4.1.2 (A), 2.4.1 (A) | serious | static | WCAG A EN 301 549 Section 508 Trusted Tester |
| orientation-lock — Content must not lock the display orientation | 1.3.4 (AA) | moderate | static | WCAG AA EN 301 549 |
| audio-transcript — Audio-only content needs a transcript | 1.2.1 (A) | moderate | static | WCAG A EN 301 549 |
| scripted-timeout — Scripted timers must not impose an unannounced time limit | 2.2.1 (A) | serious | live | WCAG A EN 301 549 |
| meta-refresh — Don’t auto-refresh or redirect the page on a timer | 2.2.1 (A) | serious | static | WCAG A EN 301 549 Section 508 Trusted Tester |
| no-blink-marquee — Don’t use | 2.2.2 (A) | serious | static | WCAG A EN 301 549 Section 508 Trusted Tester |
| no-autoplay-audio — Don’t autoplay sound the user can’t stop | 1.4.2 (A) | serious | static | WCAG A EN 301 549 Section 508 Trusted Tester |
| media-captions — Prerecorded video should provide captions | 1.2.2 (A) | serious | static | WCAG A EN 301 549 Section 508 Trusted Tester |
| media-audio-description — Prerecorded video should provide an audio description | 1.2.5 (AA) | moderate | static | WCAG AA EN 301 549 Section 508 |
| media-alternative — Prerecorded video needs an audio description or media alternative | 1.2.3 (A) | moderate | static | WCAG A EN 301 549 Section 508 |
| visual-presentation — Blocks of text should be easy to read (spacing, line length, justification) | 1.4.8 (AAA) | minor | live | WCAG AAA |
| reading-level — Body text should not require post-secondary reading ability | 3.1.5 (AAA) | minor | static | WCAG AAA |
Links & buttons
| Rule | WCAG | Impact | Mode | Standards |
|---|---|---|---|---|
| link-name — Links must have discernible text | 2.4.4 (A), 4.1.2 (A) | serious | static | WCAG A EN 301 549 Section 508 Trusted Tester ACT |
| link-generic-text — Link text should describe its destination | 2.4.4 (A) | minor | static | WCAG A EN 301 549 |
| anchor-is-button — Anchors used as buttons need button semantics and keyboard support | 4.1.2 (A) | moderate | static | WCAG A EN 301 549 |
| button-type — Buttons in forms should declare a type | 3.2.2 (A) | minor | static | WCAG A EN 301 549 Best practice |
| identical-links-same-purpose — Links with the same name should go to the same place | 2.4.4 (A) | minor | static | WCAG A EN 301 549 |
Color & contrast
| Rule | WCAG | Impact | Mode | Standards |
|---|---|---|---|---|
| text-contrast — Text must meet minimum contrast (4.5:1) | 1.4.3 (AA) | serious | live | WCAG AA EN 301 549 Trusted Tester ACT |
| text-contrast-enhanced — Text should meet enhanced contrast (7:1) | 1.4.6 (AAA) | moderate | live | WCAG AAA ACT |
| non-text-contrast — UI components and graphics need 3:1 contrast | 1.4.11 (AA) | moderate | live | WCAG AA EN 301 549 |
| use-of-color — Don’t distinguish links by color alone | 1.4.1 (A) | serious | static | WCAG A EN 301 549 Section 508 Trusted Tester |
Deeper checks
| Rule | WCAG | Impact | Mode | Standards |
|---|---|---|---|---|
| accessible-name-quality — Interactive elements need a high-quality accessible name | 4.1.2 (A), 2.4.6 (AA), 1.1.1 (A) | moderate | static | WCAG A WCAG AA EN 301 549 |
| reading-order — Visual order should match DOM (focus) order | 1.3.2 (A), 2.4.3 (A) | serious | live | WCAG A EN 301 549 |
| target-size — Pointer targets must be large enough | 2.5.8 (AA) | serious | live | WCAG AA EN 301 549 |
| reflow — Content must reflow without horizontal scrolling | 1.4.10 (AA) | serious | live | WCAG AA EN 301 549 |
| text-spacing — Content must survive increased text spacing | 1.4.12 (AA) | moderate | live | WCAG AA EN 301 549 |
| link-opens-new-tab — Links that open a new tab or window must warn users | 3.2.5 (AAA) | minor | static | WCAG AAA |
| scrollable-region-focusable — Scrollable regions must be keyboard-accessible | 2.1.1 (A) | serious | live | WCAG A EN 301 549 |
| empty-table-header — Table header cells must not be empty | 1.3.1 (A), 4.1.2 (A) | serious | static | WCAG A EN 301 549 |
| missing-autocomplete — Personal-data inputs should declare an autocomplete token | 1.3.5 (AA) | minor | static | WCAG AA EN 301 549 |
| abbr-no-title — Abbreviations should have a title with their expanded form | 3.1.4 (AAA) | minor | static | WCAG AAA |
| infinite-animation — Auto-playing animation must be pausable | 2.2.2 (A) | moderate | live | WCAG A EN 301 549 Section 508 Trusted Tester |
| flash-rate — Content must not flash more than 3 times per second | 2.3.1 (A) | serious | live | WCAG A EN 301 549 Section 508 Trusted Tester |
| respects-reduced-motion — Motion must respect prefers-reduced-motion | 2.2.2 (A) | moderate | live | WCAG A EN 301 549 |
| link-purpose-link-only — Link text alone should describe the link’s purpose | 2.4.9 (AAA) | minor | static | WCAG AAA |
Component patterns (best practice)
| Rule | WCAG | Impact | Mode | Standards |
|---|---|---|---|---|
| tab-selected-state — A tablist must have exactly one selected tab | 4.1.2 (A) | serious | static | WCAG A EN 301 549 Best practice |
| tab-controls-panel — A tab should point to its tabpanel | 1.3.1 (A), 4.1.2 (A) | serious | static | WCAG A EN 301 549 Best practice |
| tabpanel-labelled — A tabpanel should be labelled by its tab | 1.3.1 (A) | moderate | static | WCAG A EN 301 549 Best practice |
| tablist-roving-tabindex — Tabs should use roving tabindex | 2.1.1 (A) | moderate | static | WCAG A EN 301 549 Best practice |
| menu-roving-tabindex — Menus should expose one focusable item (roving tabindex) | 2.1.1 (A) | moderate | static | WCAG A EN 301 549 Best practice |
| menuitem-haspopup-expanded — A submenu trigger must expose aria-expanded | 4.1.2 (A) | serious | static | WCAG A EN 301 549 Best practice |
| dialog-name — A dialog must have an accessible name | 4.1.2 (A) | serious | static | WCAG A EN 301 549 Best practice |
| dialog-modal — A modal dialog should declare aria-modal | 4.1.2 (A) | minor | static | WCAG A EN 301 549 Best practice |
| dialog-focusable-content — An open dialog must contain focusable content | 2.1.1 (A) | serious | static | WCAG A EN 301 549 Best practice |
| disclosure-trigger-operable — A disclosure trigger must be keyboard operable | 2.1.1 (A) | serious | static | WCAG A EN 301 549 Best practice |
| disclosure-state-match — aria-expanded must match the controlled region | 4.1.2 (A) | serious | static | WCAG A EN 301 549 Best practice |
| combobox-popup — A combobox must declare its popup | 1.3.1 (A), 4.1.2 (A) | serious | static | WCAG A EN 301 549 Best practice |
| combobox-activedescendant — aria-activedescendant must resolve when a combobox is open | 4.1.2 (A) | moderate | static | WCAG A EN 301 549 Best practice |
| listbox-single-select — A single-select listbox must not have multiple selected options | 4.1.2 (A) | serious | static | WCAG A EN 301 549 Best practice |
| tree-roving-tabindex — A tree should expose exactly one focusable item | 2.1.1 (A) | moderate | static | WCAG A EN 301 549 Best practice |
| treeitem-expanded — A parent treeitem must expose aria-expanded | 4.1.2 (A) | serious | static | WCAG A EN 301 549 Best practice |
| range-value-in-bounds — A range widget value must be within its min and max | 4.1.2 (A) | serious | static | WCAG A EN 301 549 Best practice |
| switch-state-valid — A switch must have a valid aria-checked | 4.1.2 (A) | serious | static | WCAG A EN 301 549 Best practice |
| single-current-page — Only one element should be the current page | 4.1.2 (A) | minor | static | WCAG A EN 301 549 Best practice |
| link-group-semantics — Groups of links should use list semantics | 1.3.1 (A) | minor | static | WCAG A EN 301 549 Best practice |
| breadcrumb-structure — A breadcrumb should be a list that marks the current page | 1.3.1 (A) | minor | static | WCAG A EN 301 549 Best practice |
| carousel-controls — A carousel needs controls | 2.2.2 (A), 2.1.1 (A) | moderate | static | WCAG A EN 301 549 Best practice |
| tooltip-referenced — A tooltip must be referenced by the element it describes | 4.1.2 (A) | moderate | static | WCAG A EN 301 549 Best practice |
| toolbar-roving-tabindex — A toolbar should use roving tabindex | 2.1.1 (A) | moderate | static | WCAG A EN 301 549 |
| radiogroup-single-selected — A radiogroup must have at most one checked radio | 4.1.2 (A) | serious | static | WCAG A EN 301 549 |
| grid-roving-tabindex — A grid should use roving tabindex | 2.1.1 (A) | moderate | static | WCAG A EN 301 549 |
| skip-link-target-valid — A same-page link must point at a real target | 2.4.1 (A) | serious | static | WCAG A EN 301 549 |
| interactive-role-focusable — An element with an interactive role must be keyboard focusable | 2.1.1 (A) | serious | static | WCAG A EN 301 549 |
| role-application-misuse — role="application" should wrap a widget, not browse-mode content | 4.1.2 (A), 1.3.1 (A) | serious | static | WCAG A EN 301 549 |
| data-table-caption — A data table should have an accessible name | 1.3.1 (A) | moderate | static | WCAG A EN 301 549 |
| slider-spinbutton-range-complete — A slider/spinbutton must expose a coherent value range | 4.1.2 (A), 1.3.1 (A) | serious | static | WCAG A EN 301 549 |
| combobox-aria-autocomplete — aria-autocomplete on a combobox must be a valid token | 4.1.2 (A) | moderate | static | WCAG A EN 301 549 |
| accordion-heading-structure — Accordion headers should sit inside a heading | 1.3.1 (A) | minor | static | WCAG A EN 301 549 |
| feed-structure — A feed must contain articles with position information | 1.3.1 (A) | minor | static | WCAG A EN 301 549 |
| keyboard-trap — Keyboard focus must not be trapped | 2.1.2 (A) | critical | live | WCAG A EN 301 549 Best practice |
| keyboard-reachable — Interactive elements must be reachable by keyboard | 2.1.1 (A) | serious | live | WCAG A EN 301 549 Best practice |
| focus-order — Tab order should follow the visual order | 2.4.3 (A) | moderate | live | WCAG A EN 301 549 Best practice |
| focus-visible-live — Focused elements must show a visible focus indicator | 2.4.7 (AA) | serious | live | WCAG AA EN 301 549 Best practice |
| focus-appearance — The focus indicator must be large enough (2.4.13) | 2.4.13 (AAA) | minor | live | WCAG AAA |
| on-focus-navigation — Receiving focus must not trigger a page navigation | 3.2.1 (A) | serious | live | WCAG A EN 301 549 Section 508 Trusted Tester |
| widget-keyboard-operable — A composite widget must respond to arrow-key navigation | 2.1.1 (A) | serious | live | WCAG A EN 301 549 |
| focus-not-obscured — A focused control must not be hidden by a sticky or fixed overlay | 2.4.11 (AA) | serious | live | WCAG AA EN 301 549 |
| dialog-focus-return — Closing a dialog must return focus to its opener | 2.4.3 (A) | serious | live | WCAG A EN 301 549 |
| content-on-hover — Hover-revealed content must be hoverable and dismissable | 1.4.13 (AA) | moderate | live | WCAG AA EN 301 549 |