Rules reference

All 69 checks A11yMate runs. Each one maps to a WCAG 2.2 success criterion and says why it matters and how to fix it. 53 are automated, and the rest say plainly that a person needs to decide.

Showing 69 of 69 rules

  1. Image has no alt attribute

    • WCAG 1.1.1 Non-text Content, level A
    • Critical
    • Images
    • Automated
    • Server pass

    Screen reader users hear the file name or nothing at all, so they miss whatever the picture was telling everyone else. Search engines miss it too.

    How to fix it

    Add an alt attribute. Describe what the image shows or says, in a short sentence. If the image is purely decorative, use an empty alt (alt="") so screen readers skip it.

    <!-- Before -->
    <img src="team.jpg">
    
    <!-- After: informative -->
    <img src="team.jpg" alt="The four of us outside the studio, laughing at a whiteboard">
    
    <!-- After: decorative -->
    <img src="swirl.svg" alt="">
  2. Alt text looks like a file name

    • WCAG 1.1.1 Non-text Content, level A
    • Serious
    • Images
    • Automated
    • Server pass

    Alt text such as "IMG_4032.jpg" tells a screen reader user nothing about the picture. It is read out letter by letter, which is worse than silence.

    How to fix it

    Replace it with a short description of what the image shows. If it is decorative, use an empty alt instead.

    <!-- Before -->
    <img src="p.jpg" alt="IMG_4032.jpg">
    
    <!-- After -->
    <img src="p.jpg" alt="A baker dusting flour over a tray of loaves">
  3. Alt text starts with "image of" or similar

    • WCAG 1.1.1 Non-text Content, level A
    • Minor
    • Images
    • Automated
    • Server pass

    Screen readers already announce "image" or "graphic" before the alt text, so saying it again makes people hear "image, image of a dog".

    How to fix it

    Drop the opening "image of", "picture of" or "photo of" and describe the content directly.

    <!-- Before -->
    <img src="dog.jpg" alt="Image of a dog on a beach">
    
    <!-- After -->
    <img src="dog.jpg" alt="A spaniel shaking off water on a beach">
  4. Alt text is very long

    • WCAG 1.1.1 Non-text Content, level A
    • Minor
    • Images
    • Automated
    • Server pass

    Alt text over about 150 characters is tiring to listen to and cannot be skipped part-way through. Long descriptions belong in the page itself.

    How to fix it

    Keep the alt text to the point. Put any longer explanation (for a chart or infographic, say) in visible text next to the image and refer to it.

    <!-- Before -->
    <img src="chart.png" alt="A bar chart showing sales by month ... (200 more words)">
    
    <!-- After -->
    <figure>
      <img src="chart.png" alt="Sales by month, rising from March to a peak in November">
      <figcaption>Full figures are in the table below.</figcaption>
    </figure>
  5. SVG marked as an image has no name

    • WCAG 1.1.1 Non-text Content, level A
    • Serious
    • Images
    • Automated
    • Server pass

    An SVG with role="img" is announced as an image. Without a name, people hear "image" and nothing else.

    How to fix it

    Add an aria-label, or a <title> inside the SVG referenced by aria-labelledby. If it is decorative, use aria-hidden="true" and drop the role.

    <!-- Before -->
    <svg role="img" viewBox="0 0 24 24">...</svg>
    
    <!-- After -->
    <svg role="img" aria-label="Warning" viewBox="0 0 24 24">...</svg>
  6. Image button has no alt text

    • WCAG 1.1.1 Non-text Content, level A
    • Critical
    • Images
    • Automated
    • Server pass

    An <input type="image"> is a button made from a picture. Without alt text a screen reader cannot say what the button does.

    How to fix it

    Add an alt attribute that names the action, such as "Search" or "Send message".

    <!-- Before -->
    <input type="image" src="go.png">
    
    <!-- After -->
    <input type="image" src="go.png" alt="Search">
  7. Image map area has no alt text

    • WCAG 1.1.1 Non-text Content, level A
    • Critical
    • Images
    • Automated
    • Server pass

    Each clickable region in an image map is a link. Without alt text, keyboard and screen reader users cannot tell the regions apart.

    How to fix it

    Add alt text to every <area> that has an href, describing where it goes.

    <!-- Before -->
    <area shape="rect" coords="0,0,80,40" href="/north/">
    
    <!-- After -->
    <area shape="rect" coords="0,0,80,40" href="/north/" alt="North office">
  8. Page has no language set

    • WCAG 3.1.1 Language of Page, level A
    • Serious
    • Structure
    • Automated
    • Server pass

    Screen readers choose a voice and pronunciation from the page language. Without it, an English page can be read with the wrong accent, or garbled.

    How to fix it

    Set the lang attribute on the <html> element. WordPress does this from the Site Language setting, so check the theme is calling language_attributes().

    <!-- Before -->
    <html>
    
    <!-- After -->
    <html lang="en-GB">
  9. Page language code is not valid

    • WCAG 3.1.1 Language of Page, level A
    • Serious
    • Structure
    • Automated
    • Server pass

    A language code that does not exist is ignored, so assistive technology falls back to guessing.

    How to fix it

    Use a valid BCP 47 code such as en, en-GB or fr-CA.

    <!-- Before -->
    <html lang="english">
    
    <!-- After -->
    <html lang="en-GB">
  10. Page has no title

    • WCAG 2.4.2 Page Titled, level A
    • Serious
    • Structure
    • Automated
    • Server pass

    The page title is the first thing a screen reader announces and the label on every browser tab. Without one people cannot tell pages apart.

    How to fix it

    Add a <title> that describes this page. WordPress themes should declare title-tag support so core writes it for you.

    <!-- Before -->
    <title></title>
    
    <!-- After -->
    <title>Contact us - Acme Bakery</title>
  11. Several pages share the same title

    • WCAG 2.4.2 Page Titled, level A
    • Moderate
    • Structure
    • Automated
    • Server pass

    If many pages have an identical title, people using tabs, history or a screen reader cannot tell where they are.

    How to fix it

    Make each title say what is unique about the page, with the site name last.

    <!-- Before -->
    <title>Acme Bakery</title>   <!-- on every page -->
    
    <!-- After -->
    <title>Sourdough classes - Acme Bakery</title>
  12. Page has no main heading (h1)

    • WCAG 2.4.6 Headings and Labels, level AA
    • Moderate
    • Structure
    • Automated
    • Server pass

    The h1 tells everyone what the page is about, and screen reader users often jump straight to it.

    How to fix it

    Add one h1 that names the page. Usually this is the post or page title.

    <!-- Before -->
    <div class="big-title">Opening times</div>
    
    <!-- After -->
    <h1>Opening times</h1>
  13. Heading levels are skipped

    • WCAG 1.3.1 Info and Relationships, level A
    • Moderate
    • Structure
    • Automated
    • Server pass

    Headings are a table of contents for people who navigate by them. Jumping from h2 to h4 suggests something is missing, and makes the outline confusing.

    How to fix it

    Use heading levels in order, without gaps. Choose the level for the structure, then style it with CSS to get the size you want.

    <!-- Before -->
    <h2>Services</h2>
    <h4>Web design</h4>
    
    <!-- After -->
    <h2>Services</h2>
    <h3>Web design</h3>
  14. Heading is empty

    • WCAG 1.3.1 Info and Relationships, level A
    • Serious
    • Structure
    • Automated
    • Server pass

    An empty heading is announced as "heading" with nothing after it, and shows up as a blank entry in the heading list.

    How to fix it

    Add text, or remove the heading. If it was only there for spacing, use CSS margin instead.

    <!-- Before -->
    <h3></h3>
    
    <!-- After -->
    <h3>Opening times</h3>
  15. Page has no main landmark

    • WCAG 2.4.1 Bypass Blocks, level A
    • Moderate
    • Structure
    • Automated
    • Server pass

    The main landmark lets keyboard and screen reader users jump straight past the header and menu to the content.

    How to fix it

    Wrap the page's primary content in a single <main> element.

    <!-- After -->
    <header>...</header>
    <main id="content">
      ...page content...
    </main>
    <footer>...</footer>
  16. Several navigation areas share no labels

    • WCAG 1.3.1 Info and Relationships, level A
    • Minor
    • Structure
    • Automated
    • Server pass

    When a page has more than one <nav>, screen reader users hear "navigation" repeatedly with no way to tell them apart.

    How to fix it

    Give each extra <nav> an aria-label that says what it is, such as "Primary", "Footer" or "Breadcrumb".

    <nav aria-label="Primary">...</nav>
    <nav aria-label="Footer">...</nav>
  17. List item is outside a list

    • WCAG 1.3.1 Info and Relationships, level A
    • Moderate
    • Structure
    • Automated
    • Server pass

    A <li> that is not inside a <ul> or <ol> is not announced as part of a list, so the grouping is lost.

    How to fix it

    Wrap list items in <ul> or <ol>. If you only want the look, use a different element.

    <!-- Before -->
    <li>Tea</li><li>Coffee</li>
    
    <!-- After -->
    <ul><li>Tea</li><li>Coffee</li></ul>
  18. Data table has no header cells

    • WCAG 1.3.1 Info and Relationships, level A
    • Serious
    • Structure
    • Automated
    • Server pass

    Screen readers announce the column and row heading as you move around a table. Without header cells, every number is read out with no context.

    How to fix it

    Mark the header cells with <th>, and add scope="col" or scope="row". Use tables for data only, not layout.

    <table>
      <tr><th scope="col">Plan</th><th scope="col">Price</th></tr>
      <tr><td>Pro</td><td>£59</td></tr>
    </table>
  19. Frame has no title

    • WCAG 4.1.2 Name, Role, Value, level A
    • Serious
    • Structure
    • Automated
    • Server pass

    Screen readers list frames by title. An untitled embed is announced as just "frame", so people cannot tell a map from an advert.

    How to fix it

    Add a title attribute that says what the embed is.

    <iframe src="https://www.youtube.com/embed/abc" title="Video: how we bake sourdough"></iframe>
  20. Pinch zoom is switched off

    • WCAG 1.4.4 Resize Text, level AA
    • Serious
    • Structure
    • Automated
    • Server pass

    Setting user-scalable=no or a low maximum-scale stops people with low vision from zooming in on a phone.

    How to fix it

    Remove user-scalable=no and maximum-scale from the viewport meta tag. The Safe Fixes module can do this for you.

    <!-- Before -->
    <meta name="viewport" content="width=device-width, user-scalable=no">
    
    <!-- After -->
    <meta name="viewport" content="width=device-width, initial-scale=1">
  21. Page refreshes or redirects on a timer

    • WCAG 2.2.1 Timing Adjustable, level A
    • Serious
    • Structure
    • Automated
    • Server pass

    A timed refresh can move people away before they have finished reading, which is especially hard for screen reader and switch users.

    How to fix it

    Remove the meta refresh. Use a server-side redirect, or let the user choose when to move on.

    <!-- Remove -->
    <meta http-equiv="refresh" content="5; url=/next/">
  22. Label points at an element that does not exist

    • WCAG 4.1.2 Name, Role, Value, level A
    • Serious
    • Structure
    • Automated
    • Server pass

    aria-labelledby, aria-describedby and for can only work if the id they mention exists. A broken reference silently leaves the control without a name.

    How to fix it

    Fix the id so it matches an element on the page, or remove the attribute.

    <!-- Before -->
    <input aria-labelledby="nme">
    <label id="name-label">Name</label>
    
    <!-- After -->
    <input aria-labelledby="name-label">
    <label id="name-label">Name</label>
  23. Duplicate id is used by a label or ARIA attribute

    • WCAG 4.1.2 Name, Role, Value, level A
    • Moderate
    • Structure
    • Automated
    • Server pass

    Browsers pick the first element with a given id, so a label or aria-describedby can end up attached to the wrong thing. (WCAG 2.2 dropped the old parsing rule, so duplicates only matter when something refers to them.)

    How to fix it

    Make every id that is referenced unique on the page.

    <!-- Before -->
    <input id="email"> ... <input id="email">
    
    <!-- After -->
    <input id="header-email"> ... <input id="footer-email">
  24. Button has no name

    • WCAG 4.1.2 Name, Role, Value, level A
    • Critical
    • Links and buttons
    • Automated
    • Server pass

    A button without a name is announced as just "button". Screen reader and voice control users cannot find or use it.

    How to fix it

    Add visible text, or an aria-label for icon buttons.

    <!-- Before -->
    <button class="menu-toggle"><svg>...</svg></button>
    
    <!-- After -->
    <button class="menu-toggle" aria-label="Open menu"><svg aria-hidden="true">...</svg></button>
  25. Form field has no label

    • WCAG 1.3.1 Info and Relationships, level A
    • Critical
    • Forms
    • Automated
    • Server pass

    Without a label, a screen reader says "edit text" and the person has to guess what to type. Voice control users cannot name the field. A label also makes the click target larger.

    How to fix it

    Connect a visible <label> to the field using for and id. If the design truly has no room for a visible label, use aria-label as a last resort.

    <!-- Before -->
    <input type="email" name="email">
    
    <!-- After -->
    <label for="email">Email address</label>
    <input type="email" id="email" name="email">
  26. Placeholder is the only label

    • WCAG 3.3.2 Labels or Instructions, level A
    • Serious
    • Forms
    • Automated
    • Server pass

    Placeholder text disappears as soon as you start typing, is often pale grey, and is not reliably announced. People forget what the field was for.

    How to fix it

    Add a real label. Keep the placeholder only for an example format, if at all.

    <label for="tel">Phone number</label>
    <input id="tel" type="tel" placeholder="e.g. 07700 900123">
  27. Personal details field has no autocomplete

    • WCAG 1.3.5 Identify Input Purpose, level AA
    • Moderate
    • Forms
    • Automated
    • Server pass

    Autocomplete lets browsers and assistive tools fill in names, emails and addresses. It helps people with memory, motor or cognitive difficulties.

    How to fix it

    Add the right autocomplete token (name, email, tel, street-address, postal-code and so on).

    <input type="email" id="email" name="email" autocomplete="email">
  28. Radio or checkbox group has no group label

    • WCAG 1.3.1 Info and Relationships, level A
    • Moderate
    • Forms
    • Automated
    • Server pass

    Each radio button has its own label, but people also need the question. Without a group name a screen reader just says "Yes, radio button".

    How to fix it

    Wrap the group in a <fieldset> with a <legend> that holds the question.

    <fieldset>
      <legend>How should we contact you?</legend>
      <label><input type="radio" name="c" value="email"> Email</label>
      <label><input type="radio" name="c" value="phone"> Phone</label>
    </fieldset>
  29. Required field is only marked visually

    • WCAG 3.3.2 Labels or Instructions, level A
    • Moderate
    • Forms
    • Automated
    • Server pass

    A red asterisk is invisible to a screen reader. People submit the form, hit an error and have to start again.

    How to fix it

    Add the required attribute (or aria-required="true") as well as the visible marker.

    <label for="name">Name <span aria-hidden="true">*</span></label>
    <input id="name" required>
  30. ARIA role is not valid

    • WCAG 4.1.2 Name, Role, Value, level A
    • Serious
    • ARIA
    • Automated
    • Server pass

    An unknown role is ignored, so the element loses the meaning you meant to give it.

    How to fix it

    Use a role from the WAI-ARIA list, or better, use the matching native HTML element.

    <!-- Before -->
    <div role="buton">Save</div>
    
    <!-- After -->
    <button type="button">Save</button>
  31. ARIA attribute is not valid

    • WCAG 4.1.2 Name, Role, Value, level A
    • Serious
    • ARIA
    • Automated
    • Server pass

    A misspelt or made-up aria- attribute does nothing, so the information never reaches assistive technology.

    How to fix it

    Check the spelling against the WAI-ARIA attribute list, or remove the attribute.

    <!-- Before -->
    <button aria-expand="false">
    
    <!-- After -->
    <button aria-expanded="false">
  32. Hidden element can still be focused

    • WCAG 4.1.2 Name, Role, Value, level A
    • Serious
    • ARIA
    • Automated
    • Server pass

    aria-hidden="true" hides an element from screen readers but not from the keyboard. Focus lands on something that is not announced.

    How to fix it

    Remove aria-hidden, or make the element unfocusable (tabindex="-1", the inert attribute, or hide it with display:none).

    <!-- Before -->
    <a href="/x/" aria-hidden="true">Hidden link</a>
    
    <!-- After -->
    <a href="/x/">Visible link</a>
  33. Positive tabindex changes the tab order

    • WCAG 2.4.3 Focus Order, level A
    • Moderate
    • ARIA
    • Automated
    • Server pass

    A tabindex above 0 pulls an element to the front of the tab order and creates a confusing jump around the page.

    How to fix it

    Use tabindex="0" or no tabindex, and put things in the DOM in the order you want them focused.

    <!-- Before -->
    <input tabindex="5">
    
    <!-- After -->
    <input>
  34. Focusable element is marked as presentational

    • WCAG 4.1.2 Name, Role, Value, level A
    • Serious
    • ARIA
    • Automated
    • Server pass

    role="presentation" or "none" strips an element's meaning, but a link or button still takes focus, and the browser ignores the role to avoid hiding it.

    How to fix it

    Remove the role from interactive elements.

    <!-- Before -->
    <button role="presentation">Buy</button>
    
    <!-- After -->
    <button>Buy</button>
  35. Video has no captions

    • WCAG 1.2.2 Captions (Prerecorded), level A
    • Critical
    • Media and motion
    • Automated
    • Server pass

    Deaf and hard-of-hearing people, and anyone watching without sound, cannot follow speech in a video without captions.

    How to fix it

    Add a <track kind="captions"> file. For YouTube or Vimeo embeds, turn on captions in the player settings and check them. (If the captions are burned into the video, ignore this issue.)

    <video controls>
      <source src="intro.mp4">
      <track kind="captions" src="intro.en.vtt" srclang="en" label="English" default>
    </video>
  36. Media plays automatically

    • WCAG 1.4.2 Audio Control, level A
    • Serious
    • Media and motion
    • Automated
    • Server pass

    Sound that starts by itself fights with screen readers and can be impossible to stop. Moving video is also distracting for people with attention or vestibular difficulties.

    How to fix it

    Remove autoplay, or make sure the video is muted, short and has a visible pause button.

    <!-- Before -->
    <video autoplay loop src="hero.mp4"></video>
    
    <!-- After -->
    <video controls muted src="hero.mp4"></video>
  37. Animations ignore the reduced motion setting

    • WCAG 2.3.3 Animation from Interactions, level AAA
    • Minor
    • Media and motion
    • Needs review
    • Rendered pass

    Some people feel ill from parallax, zooms and large movement. Their device has a "reduce motion" setting, and sites are expected to respect it.

    How to fix it

    Wrap non-essential animation in a prefers-reduced-motion query, or switch it off inside one. The Safe Fixes module has a toggle for this.

    @media (prefers-reduced-motion: reduce) {
      *, *::before, *::after {
        animation-duration: 0.01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.01ms !important;
        scroll-behavior: auto !important;
      }
    }
  38. Content moves on its own for more than 5 seconds

    • WCAG 2.2.2 Pause, Stop, Hide, level A
    • Serious
    • Media and motion
    • Needs review
    • Rendered pass

    Carousels, tickers and looping animations are hard to read and distracting. People need a way to pause, stop or hide them.

    How to fix it

    Add a visible pause control, or stop the motion after five seconds.

    <button type="button" aria-pressed="false" id="pause-slider">Pause slideshow</button>
  39. Text does not have enough contrast

    • WCAG 1.4.3 Contrast (Minimum), level AA
    • Serious
    • Colour
    • Automated
    • Rendered pass

    Low-contrast text is hard to read for people with low vision, in sunlight, or on a worn-out screen. AA needs 4.5:1 for normal text and 3:1 for large text (24px, or 19px bold).

    How to fix it

    Darken the text or lighten the background until the ratio passes. The Colour Studio suggests the nearest colour that keeps your hue.

    /* Before: 2.8:1 */
    color: #999999; background: #ffffff;
    
    /* After: 7:1 */
    color: #595959; background: #ffffff;
  40. Text misses the enhanced (AAA) contrast level

    • WCAG 1.4.6 Contrast (Enhanced), level AAA
    • Minor
    • Colour
    • Automated
    • Rendered pass

    AAA asks for 7:1 for normal text and 4.5:1 for large text. It is not required for AA, but it helps many people with low vision.

    How to fix it

    Darken the text a little further if you are aiming for AAA.

    color: #3b3b3b; background: #ffffff; /* 11.6:1 */
  41. Interface component or border has low contrast

    • WCAG 1.4.11 Non-text Contrast, level AA
    • Serious
    • Colour
    • Automated
    • Rendered pass

    Form field borders, icons and other parts you need to see to use the page need at least 3:1 against what is behind them.

    How to fix it

    Darken the border or icon colour to at least 3:1 against its background.

    input { border: 1px solid #767676; } /* 4.5:1 on white */
  42. Text sits over an image or gradient

    • WCAG 1.4.3 Contrast (Minimum), level AA
    • Moderate
    • Colour
    • Needs review
    • Rendered pass

    A tool cannot know how much contrast text has when the background is a photo or gradient. It might be fine in one spot and unreadable in another.

    How to fix it

    Check the text against the lightest and darkest parts it covers. Add a solid or semi-transparent overlay behind the text if in doubt.

    .hero__text { background: rgb(14 17 22 / 0.7); color: #fff; }
  43. Text is smaller than 12px

    • WCAG 1.4.4 Resize Text, level AA
    • Serious
    • Typography
    • Automated
    • Rendered pass

    Very small text is hard to read for everyone, and people zooming in may hit layout limits sooner.

    How to fix it

    Make readable text at least 12px, and body text at least 16px.

    small, .meta { font-size: 0.875rem; } /* 14px */
  44. Body text is smaller than 16px

    • WCAG 1.4.4 Resize Text, level AA
    • Minor
    • Typography
    • Needs review
    • Rendered pass

    16px is the usual comfortable minimum for body copy. Smaller type works for some readers but not for many.

    How to fix it

    Set the base font size to 1rem (16px) or more and scale up from there.

    html { font-size: 100%; }
    body { font-size: 1rem; }
  45. Line spacing is tight

    • WCAG 1.4.12 Text Spacing, level AA
    • Minor
    • Typography
    • Needs review
    • Rendered pass

    Tight lines are hard to track, especially for readers with dyslexia or low vision. WCAG asks that content survives line height of 1.5, and 1.5 is a good default.

    How to fix it

    Set body text line-height to 1.5 or more.

    p { line-height: 1.6; }
  46. Lines of text are very long

    • WCAG 1.4.8 Visual Presentation, level AAA
    • Minor
    • Typography
    • Needs review
    • Rendered pass

    Lines over about 80 characters make it hard to find the start of the next line. This is an AAA suggestion.

    How to fix it

    Limit the text column width to around 45 to 75 characters, for example with max-width: 65ch.

    .entry-content { max-width: 65ch; }
  47. Text is justified

    • WCAG 1.4.8 Visual Presentation, level AAA
    • Minor
    • Typography
    • Needs review
    • Rendered pass

    Justified text creates uneven gaps between words, which are hard for readers with dyslexia.

    How to fix it

    Use left-aligned text (or right-aligned for right-to-left languages).

    p { text-align: left; }
  48. Long passage in capitals

    • WCAG 1.4.8 Visual Presentation, level AAA
    • Minor
    • Typography
    • Needs review
    • Rendered pass

    Long runs of capitals are slower to read, and screen readers can spell out some acronyms or shout.

    How to fix it

    Use sentence case for passages, and keep capitals for short labels.

    h3 { text-transform: none; }
  49. Long passage in italics

    • WCAG 1.4.8 Visual Presentation, level AAA
    • Minor
    • Typography
    • Needs review
    • Rendered pass

    Long stretches of italic text are harder to read, particularly for people with dyslexia.

    How to fix it

    Use italics for emphasis only, not for whole paragraphs.

    blockquote { font-style: normal; border-left: 4px solid currentColor; }
  50. Very thin text at small sizes

    • WCAG 1.4.8 Visual Presentation, level AAA
    • Minor
    • Typography
    • Needs review
    • Rendered pass

    Hairline weights vanish on low-resolution screens and in bright light, especially at small sizes.

    How to fix it

    Use a weight of 300 or heavier for text below 24px.

    body { font-weight: 400; }
  51. Tight letter spacing on body text

    • WCAG 1.4.12 Text Spacing, level AA
    • Moderate
    • Typography
    • Automated
    • Rendered pass

    Negative letter spacing makes letters touch, which blurs words for many readers.

    How to fix it

    Remove negative letter-spacing on body text (small amounts on large headings are fine).

    p { letter-spacing: normal; }
  52. Click target is smaller than 24 by 24 pixels

    • WCAG 2.5.8 Target Size (Minimum), level AA
    • Serious
    • Interaction
    • Automated
    • Rendered pass

    Tiny buttons and links are hard to hit with a finger, a tremor, or a mouse. WCAG 2.2 AA asks for at least 24 by 24 CSS pixels, unless there is spacing around them.

    How to fix it

    Increase the size or padding of the target, or leave 24px of space around it.

    .icon-button { min-width: 24px; min-height: 24px; padding: 8px; }
  53. Click target is smaller than 44 by 44 pixels

    • WCAG 2.5.5 Target Size (Enhanced), level AAA
    • Minor
    • Interaction
    • Automated
    • Rendered pass

    44 by 44 is the comfortable size for touch. It is an AAA recommendation.

    How to fix it

    Increase padding on touch controls to reach about 44px.

    .nav a { display: inline-block; min-height: 44px; padding: 12px; }
  54. No visible focus indicator

    • WCAG 2.4.7 Focus Visible, level AA
    • Serious
    • Interaction
    • Automated
    • Rendered pass

    Keyboard users need to see where they are. If focusing a control changes nothing on screen, they are lost.

    How to fix it

    Never remove the outline without replacing it. Add a clear :focus-visible style. Safe Fixes can add a contrast-checked ring for you.

    :focus-visible { outline: 3px solid #2A3BFF; outline-offset: 2px; }
  55. Focused element is hidden behind a sticky header

    • WCAG 2.4.11 Focus Not Obscured (Minimum), level AA
    • Serious
    • Interaction
    • Automated
    • Rendered pass

    When a fixed header or banner covers an element as you tab to it, you cannot see what is focused.

    How to fix it

    Add scroll-padding-top equal to the height of the sticky element, so focused items scroll into clear view.

    html { scroll-padding-top: 5rem; }
  56. Page scrolls sideways at 320px wide

    • WCAG 1.4.10 Reflow, level AA
    • Serious
    • Interaction
    • Automated
    • Rendered pass

    People who zoom to 400% on a desktop get the equivalent of a 320px-wide screen. If the page scrolls in two directions, reading is a chore.

    How to fix it

    Find the element that is wider than the screen (often a fixed width, table, image or code block) and let it shrink or scroll on its own.

    img, video, iframe { max-width: 100%; height: auto; }
    pre, table { overflow-x: auto; }
  57. Text is cut off when spacing is increased

    • WCAG 1.4.12 Text Spacing, level AA
    • Moderate
    • Interaction
    • Automated
    • Rendered pass

    Some people need wider letter, word and line spacing. If your layout has fixed heights, their text is clipped or overlaps.

    How to fix it

    Avoid fixed heights on text containers. Use min-height and let the box grow.

    .card { min-height: 12rem; } /* not height */
  58. Text is hard to read

    • WCAG 3.1.5 Reading Level, level AAA
    • Minor
    • Content
    • Needs review
    • Server pass

    Plain writing helps everyone, and is essential for many people with cognitive or learning disabilities. The Flesch reading ease score for this page is low (English only).

    How to fix it

    Use shorter sentences and everyday words, and explain jargon. Aim for a score of 60 or more.

    <!-- Before -->
    <p>Utilisation of the facility is contingent upon prior authorisation.</p>
    
    <!-- After -->
    <p>You need to book before you use the room.</p>
  59. Paragraph is very long

    • WCAG 3.1.5 Reading Level, level AAA
    • Minor
    • Content
    • Needs review
    • Server pass

    Walls of text are daunting. Short paragraphs and clear headings make a page easier to scan and to follow.

    How to fix it

    Break long paragraphs into shorter ones, and add subheadings.

    <p>One idea per paragraph.</p>
    <p>The next idea starts a new one.</p>
  60. Page relies on PDF documents

    • WCAG 1.3.1 Info and Relationships, level A
    • Minor
    • Content
    • Needs review
    • Server pass

    PDFs are often not accessible: missing tags, reading order, alt text. They are also harder to read on phones.

    How to fix it

    Publish the same content as a web page, and make sure any PDF you keep is tagged and tested.

    <a href="/prices/">Our prices</a> (also available as a <a href="/prices.pdf">PDF</a>)