By · Updated

WCAG Checker

Success Criteria Mapped to Errors, Warnings and Notices From Pasted Markup

No ratings yet

OneTask is free, with no sign-up, and built by one person.
If this tool saved you time, a coffee helps keep new ones coming.

How the WCAG Checker works

This WCAG checker tests HTML against common success criteria. Paste a full page or a fragment of HTML and it is checked against the parts of WCAG 2.2 that can be tested from markup alone. Each finding names the element, says what is wrong, and gives the success criterion — 1.1.1, 2.4.4, 4.1.2 — so you can look up the rule or cite it in a report. Errors are definite failures, warnings are almost certainly failures, notices are things to look at.

WCAG checker: what it can and cannot check

About a third of WCAG can be checked by a machine reading the HTML. This tool does that third, thoroughly and locally, and is honest that the other two thirds — is the alt text actually accurate, does the page make sense when zoomed, can every task be completed by keyboard — still need a person. Use it as the first pass that clears out the mechanical faults so the manual review can concentrate on judgement.

Images (1.1.1). Every img needs an alt attribute. A missing one is an error: the screen reader will read the file name instead. alt="" is correct for decorative images and passes. Alt text that is just image, photo or logo fails because it describes nothing; text that looks like a file name fails for the same reason; text starting "image of" gets a notice because the screen reader already says "image". Image buttons and image-map areas need alt text too.

Form fields (1.3.1, 4.1.2). Every text input, select and textarea must have a label that assistive technology can associate with it: a label for= pointing at its id, a wrapping label, or aria-label, aria-labelledby or title. A placeholder is not a label — it vanishes as soon as the user types and is frequently too faint to read — so a field with only a placeholder is reported. Fieldsets without a legend are flagged because the group has no name.

Links and buttons (2.4.4, 4.1.2, 2.1.1). A button with nothing in it and no aria-label reads as "button" and nothing else. A link whose only content is an image with empty alt is announced as its URL. Link text of "click here", "read more" or "here" is flagged because screen reader users navigate by pulling up a list of links, and a list of "read more" is useless. A link with no href is not focusable by keyboard, and href="javascript:…" is a button in disguise. A div or span with an onclick and no role and tabindex is unreachable by keyboard entirely.

Structure (1.3.1, 2.4.2, 2.4.6, 3.1.1). When a full document is pasted, the html element must carry a valid lang, there must be a title, and there should be an h1 and a main landmark. Heading levels should not skip — an h1 followed by an h3 breaks the outline that screen reader users navigate by. Empty headings are errors. Data tables need th cells and ideally a caption. Duplicate ids are errors because label for and every aria-* reference depend on ids being unique.

Focus and keyboard (2.4.3, 2.4.7, 2.1.1). A positive tabindex reorders the tab sequence away from the reading order and is nearly always a mistake. Inline outline: none hides the focus ring so keyboard users cannot see where they are. aria-hidden="true" wrapped around a button or link produces a control that is in the tab order but silent. accesskey gets a notice because it collides with assistive technology shortcuts.

Motion, media and zoom (1.4.4, 1.4.2, 1.2.2, 2.2.2). A viewport meta with user-scalable=no or a maximum-scale under 2 stops low-vision users from zooming and is an outright failure. Media that autoplays with sound and no controls fails; a video with no track element is noted because captions are required for pre-recorded video. marquee and blink fail because they move and cannot be paused.

What it cannot check. Colour contrast needs the computed styles — use the contrast checker with your actual colours. Whether alt text is truthful, whether focus order makes sense, whether error messages are helpful, whether the page works at 400% zoom, whether custom widgets respond to arrow keys: all of these need a human and, ideally, a screen reader. A clean result here means the mechanical faults are gone, not that the page is accessible.

FAQ

Do I need to paste the whole page?

No. A fragment is checked on its own for everything that applies to elements — images, forms, links, headings, tables. The document-level checks for lang, title, h1 and main only run when the pasted HTML contains an html element, so a fragment is not penalised for lacking a title.

What is the difference between an error, a warning and a notice?

An error is a definite failure of a success criterion that no context can excuse, such as an image with no alt attribute. A warning is a pattern that is almost always a failure but could in a rare case be intentional, such as "click here" link text. A notice is a best practice rather than a requirement, such as adding a caption to a table.

Which WCAG level does this check against?

The criteria cited are all Level A or AA, which is what most legal and procurement requirements mean by "WCAG compliant". Nothing here is AAA-only. The numbering is the same in WCAG 2.0, 2.1 and 2.2, so the references work whichever version your policy names.

Will a clean result mean the page is accessible?

No. Automated checks find roughly a third of accessibility problems. The rest need someone to use the page with a keyboard only, with a screen reader, and at high zoom, and to judge whether the text alternatives and instructions actually make sense. This tool clears the mechanical faults so that review time is spent on the parts that need judgement.

Why is a placeholder not enough as a label?

Because it disappears the moment the user starts typing, so someone who is interrupted or who tabs back to check a field has no idea what it is for. It is also usually rendered in a grey that fails contrast, and some screen readers do not announce it at all. A visible label plus, if you like, a placeholder as an example value, is the accessible pattern.

See also: all SEO tools, Dev Utilities, Formatters & Validators, Data & Encoding, Security & Identifiers, Accessibility, AI.

Related tools