1.4.10 Level AA Guideline 1.4 Distinguishable Added in WCAG 2.1 Not detectable automatically

Reflow

Content can be presented at 320 CSS pixels wide without loss of information or functionality, and without requiring scrolling in two dimensions. Data tables, maps, and code blocks are exempt.

Who this affects

Low-vision users at 400% zoom on a 1280px display see a 320px viewport. Requiring both horizontal and vertical scrolling to read a single line of text makes reading exhausting.

The failure and the fix

Each example below is a self-contained page, loaded in a frame so its markup cannot affect this page. Open either one on its own to test it with a keyboard or screen reader.

Fails 1.4.10

Open the failing example in a new tab

fail.html — the problem

<div class="fixed-shell">
  <h1>Our shops</h1>

  <div class="cols">
    <div class="col"><h2>Riverside</h2><p>12 River Street</p></div>
    <div class="col"><h2>Old Town</h2><p>4 Market Row</p></div>
    <div class="col"><h2>Hillgate</h2><p>88 Hillgate Lane</p></div>
  </div>

  <h2>Notes</h2>
  <div class="clipped">
    <p>Our Riverside shop has step-free access, an accessible toilet, and a hearing
       loop at the counter. Assistance dogs are welcome in all three shops.</p>
  </div>

  <p class="nowrap">Email us at hello@riverlinebooks.example for accessibility enquiries.</p>
</div>

Meets 1.4.10

Open the passing example in a new tab

pass.html — the fix

<div class="shell">
  <h1>Our shops</h1>

  <div class="cols">
    <div class="col"><h2>Riverside</h2><p>12 River Street</p></div>
    <div class="col"><h2>Old Town</h2><p>4 Market Row</p></div>
    <div class="col"><h2>Hillgate</h2><p>88 Hillgate Lane</p></div>
  </div>

  <h2>Notes</h2>
  <div class="notes">
    <p>Our Riverside shop has step-free access, an accessible toilet, and a hearing
       loop at the counter. Assistance dogs are welcome in all three shops.</p>
  </div>

  <p class="wrap">Email us at hello@riverlinebooks.example for accessibility enquiries.</p>

  <h2>Opening hours by shop</h2>
  <div class="table-scroll" tabindex="0" role="region" aria-labelledby="hours-cap">
    <table>
      <caption id="hours-cap">Opening hours by shop and day</caption>
      <thead>
        <tr><th scope="col">Shop</th><th scope="col">Mon–Fri</th><th scope="col">Sat</th><th scope="col">Sun</th></tr>
      </thead>
      <tbody>
        <tr><th scope="row">Riverside</th><td>9–6</td><td>10–4</td><td>Closed</td></tr>
        <tr><th scope="row">Old Town</th><td>9–5</td><td>10–4</td><td>Closed</td></tr>
      </tbody>
    </table>
  </div>
</div>

<!-- The target: 320 CSS pixels wide with no loss of content or functionality,
     and no scrolling in two directions. 320px is not arbitrary - it is what a
     1280px display shows at 400% zoom, which is the magnification many
     low-vision users work at every day.

     Exempt from the no-horizontal-scroll rule: data tables, maps, diagrams,
     code blocks, and video - content that genuinely needs two dimensions.
     Your page layout is never exempt. -->

The bug that breaks reflow most often

Almost every reflow failure in a modern layout comes from one CSS rule that nobody wrote. Grid and flex items default to min-width: auto, which means they refuse to shrink below the intrinsic minimum width of their content. One long unbreakable string — a code sample, a URL, a wide table — and the whole column stops shrinking, taking the page with it.

The fix

.grid-item {
  min-width: 0;   /* allow this item to be narrower than its content */
}

What makes it hard to spot is that the offending child is usually behaving perfectly. A <pre> with overflow-x: auto scrolls its own content correctly and looks fine in isolation. It still reports its full content width as its intrinsic size, and that number propagates up through every grid and flex ancestor until something has a min-width that stops it.

This suite failed its own test on exactly this

Every criterion page on this site puts the failing and passing examples in a CSS grid, and each panel contains a code block. At 320 px those panels would not shrink, and all 87 demo pages scrolled horizontally — while passing every axe check, because no automated accessibility rule detects this.

It was caught by npm run test:reflow, which renders each page at 320 × 256 and measures the actual overflow. The fix was min-width: 0 on the grid items, and it is commented in assets/css/demo.css so it does not get "tidied away" later.

Where else this bites

  • A flex row containing a long email address or a file path.
  • A card grid where one card holds a wide data table.
  • A sidebar layout where the main column holds a code sample.
  • Anything using white-space: nowrap inside a grid or flex child.

The companion fix for text is overflow-wrap: break-word, which lets long words break rather than forcing the container wider.

Testing this properly

  1. Set the browser window to 1280 px wide and zoom to 400%. That gives you a 320 px viewport — which is why 320 is the number, not an arbitrary phone width.
  2. Check for a horizontal scrollbar on the page itself. Content that scrolls inside its own container is fine; the page must not.
  3. Confirm nothing is cut off or unreachable — overflow is only the mechanical half of this criterion.
  4. Remember the exemptions: data tables, maps, diagrams, code blocks and video may require two dimensions. Your page layout never does.

To check a whole site at once, see tools/check-reflow.mjs in this repository — it renders every page at 320 × 256, applies the 1.4.12 text-spacing overrides, and names the widest offending element when it finds overflow.

How to test it

Set the browser to 1280px wide and zoom to 400%, or set the viewport to 320×256 CSS pixels. Nothing may be cut off, and the page must not scroll horizontally except for exempt content.

  • Automated

    Requires rendering at the target viewport and inspecting for horizontal overflow and lost content.

    No axe rule maps to this criterion. It has to be checked by a person.

  • Keyboard

    Unplug the mouse. Move through the page with Tab, Shift+Tab, Enter, Space and the arrow keys. See the keyboard testing script.

  • Screen reader

    Listen to both examples with NVDA, JAWS, VoiceOver or TalkBack and compare what is announced. See the screen reader cheat sheets.

  • Visual

    Zoom to 200% and 400%, narrow the viewport to 320 px, and apply the text-spacing overrides. See the visual testing procedures.

In the specification