Rules catalog
Explore the checks behind a scan.
A11y Scan combines axe-core with custom heuristic checks. Its configuration chooses the WCAG version, level, and enabled rules. The page and selected modes determine which checks apply; a listed rule does not run or find a problem on every page.
73
Custom checks: 72 page, 1 site crawl
69
axe-core rules eligible at WCAG 2.2 A and AA
72
axe-core rules eligible through AAA
A rule can flag a potential issue that needs human review. Automated results alone cannot establish WCAG conformance. Criterion links open the official W3C text.
Showing 145 of 145 rules.
Custom heuristic checks (73)
Decorative symbols without aria-hidden
Symbol-only spans (›, •, →, etc.) exposed to screen readers.
heuristic-decorative-symbols4.1.2 ↗Icon fonts without text alternatives
Font Awesome / Material icons rendered without aria-label or visible text.
heuristic-icon-font-alt1.1.1 ↗CSS pseudo-element content with meaning
::before/::after content carrying meaningful text screen readers may miss.
heuristic-pseudo-content1.1.1 ↗Generic link text
Links with vague text ("click here", "read more", "learn more").
heuristic-generic-link-text2.4.4 ↗Visual order vs DOM order mismatch
CSS flexbox/grid `order` or absolute positioning that diverges from DOM/tab order.
heuristic-visual-dom-order-mismatch1.3.2 ↗Small touch targets
Interactive elements smaller than 24×24 px.
heuristic-small-touch-target2.5.8 ↗Scroll container without keyboard access
Element with overflow:auto/scroll but no tabindex — keyboard users can't scroll.
heuristic-scroll-no-keyboard2.1.1 ↗Missing autocomplete on common inputs
Email/name/phone/address fields without autocomplete attributes.
heuristic-missing-autocomplete1.3.5 ↗No visible focus indicator
:focus styles that don't produce a visible change.
heuristic-focus-indicator2.4.7 ↗!important on text styling
font-size/line-height/letter-spacing locked with !important blocks user spacing overrides.
heuristic-important-text-styling1.4.12 ↗Non-text contrast
UI component borders/backgrounds with insufficient contrast against the surrounding background.
heuristic-non-text-contrast1.4.11 ↗Placeholder as the only label
<input> with placeholder but no <label>, aria-label, or aria-labelledby.
Visual headings without semantic markup
Large/bold text styled like a heading but not in <h1>–<h6>.
Heading tags used for styling only
<h1>–<h6> used inline or with smaller fonts than surrounding text.
heuristic-heading-for-styling1.3.1 ↗Links indistinguishable from surrounding text
Inline links with no underline AND <3:1 contrast against surrounding text AND no bold/italic.
heuristic-link-indistinguishable1.4.1 ↗Focus outline removed without replacement
:focus { outline: none/0 } without an alternative focus indicator.
heuristic-focus-outline-none2.4.7 ↗Broken ARIA references
aria-labelledby / aria-describedby / aria-controls / aria-owns pointing at non-existent IDs.
heuristic-broken-aria-ref4.1.2 ↗Focus obscured by sticky elements
Focused element behind position:fixed/sticky overlay.
heuristic-focus-obscured2.4.11 ↗Inconsistent link identification across pages
Site-crawl-only: same href reached by different accessible names on different pages.
heuristic-inconsistent-link-id3.2.4 ↗Password field without show-password toggle
<input type="password"> without an adjacent reveal control.
heuristic-show-password-toggle3.3.8 ↗Carousel accessibility
Carousel without prev/next labels, missing pagination semantics, or auto-advance with no pause.
Auto-playing infinite animation
CSS animation with iteration-count: infinite and no pause control. Also <marquee>.
heuristic-auto-play-animation2.2.2 ↗New-tab links without warning
<a target="_blank"> without visible indicator or aria-label noting the new-tab behavior.
heuristic-new-tab-no-warning3.2.5 ↗Reflow at 320px
Horizontal scroll required at 320px viewport width (only fires when innerWidth ≤ 320).
heuristic-reflow-320px1.4.10 ↗SPA route changes without focus management
history.pushState / hashchange without programmatic focus move.
heuristic-spa-route-focus4.1.3 ↗prefers-reduced-motion not respected
CSS animations without `@media (prefers-reduced-motion: reduce)`.
heuristic-prefers-reduced-motion2.3.3 ↗Target size with overlap
Small interactive element (<24px) whose virtual 24px circle overlaps a neighbor.
heuristic-target-size-overlap2.5.8 ↗Suspicious alt text
Alt text matching filename, containing "image of/photo of", or just the file extension.
heuristic-suspicious-alt1.1.1 ↗Text spacing breaks layout
Probe-injected WCAG 1.4.12 text-spacing styles cause overflow:hidden text containers to clip.
heuristic-text-spacing-breakage1.4.12 ↗Error message not associated
Error-styled element near a form field with no aria-describedby / aria-errormessage link.
heuristic-error-message-assoc3.3.1 ↗pointer-events:none used as disabled
Interactive element with pointer-events:none but no `disabled` / `aria-disabled="true"`.
heuristic-pointer-events-only-disable4.1.2 ↗Modal lacks focus-trap prerequisites
role="dialog"/"alertdialog" with aria-modal="true" but no aria-label/labelledby OR no focusable descendants.
heuristic-modal-no-focus-trap2.1.2 ↗Label-in-name mismatch
aria-label that doesn't include the visible text — voice-control activation fails.
heuristic-label-in-name-mismatch2.5.3 ↗Text over CSS gradient
Element has linear/radial/conic-gradient background AND own text content — contrast may fail at gradient stops.
heuristic-text-over-gradient1.4.3 ↗Color with alpha < 1
Text color uses rgba()/hsla() with alpha < 1 — effective contrast depends on backdrop blend.
heuristic-transparency-contrast1.4.3 ↗Autoplay media without controls
<video autoplay> / <audio autoplay> without `controls` and not muted.
Empty semantic element
Heading / button / link / label / <th> with no text, no aria-label, no resolvable aria-labelledby, no img[alt].
heuristic-empty-semantic4.1.2 ↗Positive tabindex
Any element with tabindex > 0 — reorders the natural focus sequence.
heuristic-positive-tabindex2.4.3 ↗Table likely used for layout
<table> with no <th>, no <caption>, no role=presentation/none, AND block-level cell content.
heuristic-layout-table1.3.1 ↗Possible animated GIF without pause
<img src="*.gif"> — animation can't be detected statically; flagged for manual review.
heuristic-animated-gif-no-controls2.2.2 ↗title attribute as only accessible name
Interactive element relies solely on title= for its accessible name — unreliable on touch.
heuristic-title-as-only-label4.1.2 ↗Draggable without keyboard alternative
[draggable="true"] without aria-grabbed + nearby move buttons or role=button + tabindex.
heuristic-draggable-no-keyboard2.5.7 ↗Page missing main landmark
Page has no <main> and no [role="main"].
Adjacent duplicate links
Two adjacent <a> elements with identical href — produces two tab stops to the same destination.
heuristic-adjacent-duplicate-links2.4.4 ↗Anchor link target does not exist
<a href="#fragment"> where no element with that id (and not name) exists on the page.
heuristic-anchor-target-missing2.4.4 ↗Required field without programmatic indicator
<label> says "*" or "required" but the input has no `required` and no aria-required="true".
heuristic-required-no-indicator3.3.2 ↗Form validation indicated only by color
Input aria-invalid="true" with no programmatic error text and no adjacent error-worded sibling.
Link to document file without format indicator
<a> to .pdf / .doc(x) / .xls(x) / .ppt(x) whose text + aria-label give no format hint.
heuristic-document-link-no-indicator3.2.4 ↗Dynamic-update region without aria-live
Container with id/class matching `(status|error|message|notification|toast|alert)` but no aria-live and no role=status/alert/log.
heuristic-live-region-missing4.1.3 ↗Inline SVG without accessible name
Inline <svg> with shape children (rect/circle/line/polygon/polyline/path/ellipse) and no <title>, aria-label, resolvable aria-labelledby, or <figcaption>.
heuristic-svg-no-acc-name1.1.1 ↗Color-only state indicator
Small element (≤80×80px) with semantic color (red/green/amber) AND no text or only a decorative glyph AND no aria-label.
heuristic-color-only-state1.4.1 ↗iframe without title
<iframe> without a `title` or `aria-label`.
heuristic-iframe-no-title4.1.2 ↗Modal-named element without dialog role
Element class matches `(modal|dialog|drawer|popup|popover|lightbox)` and is visible AND lacks role="dialog"/"alertdialog".
heuristic-modal-class-no-role4.1.2 ↗Heading hierarchy issues
Page missing <h1>, OR heading levels skip (h1→h3), OR multiple <h1> elements.
Data table without header cells
<table> with <td> rows but no <th> and no <caption>.
heuristic-table-missing-headers1.3.1 ↗Table header without scope attribute
<th> without scope="col"/"row"/"colgroup"/"rowgroup" AND not referenced by any `headers=` attribute.
heuristic-th-missing-scope1.3.1 ↗Element looks clickable but isn't
div/span/li/td/p with cursor:pointer AND no role/tabindex/keyboard handler AND not nested in real interactive element.
Decorative emoji not aria-hidden
Standalone emoji (≤4 chars) in inline element (≤100×60px) without aria-hidden="true" and without aria-label.
heuristic-decorative-emoji1.1.1 ↗Visual list not using semantic markup
Paragraph starts with bullet glyph (•/●/✓) outside <ul>/<ol>, OR container has 3+ child <div>s with shared class outside list semantics.
heuristic-visual-list-not-semantic1.3.1 ↗Disclosure trigger without aria-expanded
Button/link/role=button with class or id matching disclosure keyword (accordion/disclosure/toggle/collapsible/expand) AND no aria-expanded.
heuristic-disclosure-missing-aria4.1.2 ↗Form lacks accessible name
Multiple <form>s on the page; one with ≥2 controls but no aria-label/aria-labelledby/title.
Anchor without href
<a> without href (and without legacy `name` and without role override). Not focusable, not announced as link.
onclick attribute on non-interactive element
Element with literal onclick attribute that isn't button/a[href]/input/select/textarea/role=button.
Anti-pattern href values
<a href="javascript:..."> or <a href="#"> / <a href="#!"> placeholder.
axe-core rules (72)
Active <area> elements must have alternative text
Ensure <area> elements of image maps have alternative text
Elements must only use supported ARIA attributes
Ensure an element's role supports its ARIA attributes
aria-braille attributes must have a non-braille equivalent
Ensure aria-braillelabel and aria-brailleroledescription have a non-braille equivalent
ARIA commands must have an accessible name
Ensure every ARIA button, link and menuitem has an accessible name
ARIA attributes must be used as specified for the element's role
Ensure ARIA attributes are used as described in the specification of the element's role
Deprecated ARIA roles must not be used
Ensure elements do not use deprecated roles
ARIA input fields must have an accessible name
Ensure every ARIA input field has an accessible name
ARIA meter nodes must have an accessible name
Ensure every ARIA meter node has an accessible name
ARIA progressbar nodes must have an accessible name
Ensure every ARIA progressbar node has an accessible name
Elements must only use permitted ARIA attributes
Ensure ARIA attributes are not prohibited for an element's role
Required ARIA attributes must be provided
Ensure elements with ARIA roles have all required ARIA attributes
Certain ARIA roles must contain particular children
Ensure elements with an ARIA role that require child roles contain them
Certain ARIA roles must be contained by particular parents
Ensure elements with an ARIA role that require parent roles are contained by them
aria-roledescription must be on elements with a semantic role
Ensure aria-roledescription is only used on elements with an implicit or explicit role
ARIA roles used must conform to valid values
Ensure all elements with a role attribute use a valid value
ARIA toggle fields must have an accessible name
Ensure every ARIA toggle field has an accessible name
ARIA tooltip nodes must have an accessible name
Ensure every ARIA tooltip node has an accessible name
ARIA attributes must conform to valid values
Ensure all ARIA attributes have valid values
ARIA attributes must conform to valid names
Ensure attributes that begin with aria- are valid ARIA attributes
<audio> elements must have a captions track
Ensure <audio> elements have captions
autocomplete attribute must be used correctly
Ensure the autocomplete attribute is correct and suitable for the form field
Inline text spacing must be adjustable with custom stylesheets
Ensure that text spacing set through style attributes can be adjusted with custom stylesheets
<blink> elements are deprecated and must not be used
Ensure <blink> elements are not used
Page must have means to bypass repeated blocks
Ensure each page has at least one mechanism for a user to bypass navigation and jump straight to the content
Elements must meet enhanced color contrast ratio thresholds
Ensure the contrast between foreground and background colors meets WCAG 2 AAA enhanced contrast ratio thresholds
Elements must meet minimum color contrast ratio thresholds
Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds
CSS Media queries must not lock display orientation
Ensure content is not locked to any specific display orientation, and the content is operable in all display orientations
<dl> elements must only directly contain properly-ordered <dt> and <dd> groups, <script>, <template> or <div> elements
Ensure <dl> elements are structured correctly
<dt> and <dd> elements must be contained by a <dl>
Ensure <dt> and <dd> elements are contained by a <dl>
Documents must have <title> element to aid in navigation
Ensure each HTML document contains a non-empty <title> element
IDs used in ARIA and labels must be unique
Ensure every id attribute value used in ARIA and in labels is unique
Form field must not have multiple label elements
Ensure form field does not have multiple label elements
Frames with focusable content must not have tabindex=-1
Ensure <frame> and <iframe> elements with focusable content do not have tabindex=-1
Frames must have a unique title attribute
Ensure <iframe> and <frame> elements contain a unique title attribute
Frames must have an accessible name
Ensure <iframe> and <frame> elements have an accessible name
<html> element must have a lang attribute
Ensure every HTML document has a lang attribute
<html> element must have a valid value for the lang attribute
Ensure the lang attribute of the <html> element has a valid value
HTML elements with lang and xml:lang must have the same base language
Ensure that HTML elements with both valid lang and xml:lang attributes agree on the base language of the page
Links with the same name must have a similar purpose
Ensure that links with the same accessible name serve a similar purpose
Images must have alternative text
Ensure <img> elements have alternative text or a role of none or presentation
Image buttons must have alternative text
Ensure <input type="image"> elements have alternative text
Elements must have their visible text as part of their accessible name
Ensure that elements labelled through their content must have their visible text as part of their accessible name
Form elements must have labels
Ensure every form element has a label
Links must be distinguishable without relying on color
Ensure links are distinguished from surrounding text in a way that does not rely on color
Links must have discernible text
Ensure links have discernible text
<ul> and <ol> must only directly contain <li>, <script> or <template> elements
Ensure that lists are structured correctly
<li> elements must be contained in a <ul> or <ol>
Ensure <li> elements are used semantically
<marquee> elements are deprecated and must not be used
Ensure <marquee> elements are not used
Delayed refresh must not be used
Ensure <meta http-equiv="refresh"> is not used for delayed refresh
Delayed refresh under 20 hours must not be used
Ensure <meta http-equiv="refresh"> is not used for delayed refresh
Zooming and scaling must not be disabled
Ensure <meta name="viewport"> does not disable text scaling and zooming
Interactive controls must not be nested
Ensure interactive controls are not nested as they are not always announced by screen readers or can cause focus problems for assistive technologies
<video> or <audio> elements must not play automatically
Ensure <video> or <audio> elements do not autoplay audio for more than 3 seconds without a control mechanism to stop or mute the audio
<object> elements must have alternative text
Ensure <object> elements have alternative text
Styled <p> elements must not be used as headings
Ensure bold, italic text and font-size is not used to style <p> elements as a heading
[role="img"] elements must have alternative text
Ensure [role="img"] elements have alternative text
Scrollable region must have keyboard access
Ensure elements that have scrollable content are accessible by keyboard in Safari
Select element must have an accessible name
Ensure select element has an accessible name
Server-side image maps must not be used
Ensure that server-side image maps are not used
Summary elements must have discernible text
Ensure summary elements have discernible text
<svg> elements with an img role must have alternative text
Ensure <svg> elements with an img, graphics-document or graphics-symbol role have accessible text
Data or header cells must not be used to give caption to a data table.
Ensure that tables with a caption use the <caption> element.
All touch targets must be 24px large, or leave sufficient space
Ensure touch targets have sufficient size and space
Non-empty <td> elements in larger <table> must have an associated table header
Ensure that each non-empty data cell in a <table> larger than 3 by 3 has one or more table headers
Table cell headers attributes must refer to other <th> elements in the same table
Ensure that each cell in a table that uses the headers attribute refers only to other <th> elements in that table
Table headers in a data table must refer to data cells
Ensure that <th> elements and elements with role=columnheader/rowheader have data cells they describe
lang attribute must have a valid value
Ensure lang attributes have valid values
<video> elements must have captions
Ensure <video> elements have captions