Skip to main content

Notes

Accessible Tooltips and Info Icons: What WCAG 1.4.13 Requires

Quietramp ·

Accessible Tooltips and Info Icons: What WCAG 1.4.13 Requires

Quick answer: WCAG 1.4.13 Content on Hover or Focus (Level AA, WCAG 2.1) applies whenever hovering or focusing an element makes extra content appear and disappear — the exact shape of a “?” or ⓘ info-icon tooltip. It requires that content be dismissible (closeable without moving the pointer or focus), hoverable (the pointer can move onto the tooltip without it vanishing), and persistent (stays visible until dismissed or the trigger is removed, not on a fixed timer). A tooltip built only on the native HTML title attribute meets none of these reliably — the most common failure mode on e-commerce sites.

This article is general accessibility information, not legal advice. Meeting WCAG 2.1 AA is a technical-practice standard, not a legal determination — consult qualified counsel for legal risk questions.

What the success criterion actually says

SC 1.4.13’s own text, quoted directly from the Understanding doc: “Where receiving and then removing pointer hover or keyboard focus triggers additional content to become visible and then hidden, the following are true.” Three conditions follow:

  1. Dismissible — “A mechanism is available to dismiss the additional content without moving pointer hover or keyboard focus, unless the additional content communicates an input error or does not obscure or replace other content.” In practice: an Escape-key handler that doesn’t require the user to move away from what they were doing.
  2. Hoverable — “If pointer hover can trigger the additional content, then the pointer can be moved over the additional content without the additional content disappearing.” A tooltip that vanishes the instant the mouse crosses from the icon toward the popup text fails this.
  3. Persistent — “The additional content remains visible until the hover or focus trigger is removed, the user dismisses it, or its information is no longer valid.” A tooltip that auto-hides after a fixed two- or three-second timer, regardless of whether the user is still reading it, fails this condition specifically.

There’s one exception, also quoted directly: “The visual presentation of the additional content is controlled by the user agent and is not modified by the author.” That’s what exempts a plain browser-rendered title tooltip from the criterion itself — the browser controls its timing and appearance, not the site. It isn’t a statement that native title tooltips are a good accessible pattern, which is a separate problem covered below.

The Understanding doc names the covered content directly: “custom tooltips, sub-menus, and other nonmodal popups” that “may obscure other content when they are displayed.” Its Intent section ties the rule to low-vision users at high screen-magnification zoom, who lose surrounding context when a hover popup covers part of the page and disappears before they can pan to read it, and to users with limited fine motor control who can’t hold a mouse perfectly still over a small trigger.

Why the title attribute alone doesn’t solve this

The most common tooltip pattern on e-commerce sites is still <span title="Sizes run small — order one size up">, relying on the browser’s native title tooltip. It’s exempt from SC 1.4.13’s own scope, but it independently fails a more basic bar: it’s often not usable at all. Per MDN’s own documentation for the title global attribute, the attribute is “highly problematic” for people using touch-only devices, people navigating with keyboards, and people using assistive technology, “due to inconsistent browser support, compounded by the additional assistive technology parsing of the browser-rendered page.” MDN’s own recommendation is direct: “If a tooltip effect is desired, it is better to use a more accessible technique” than title.

On a touchscreen there’s usually no hover state at all, so a title tooltip may never appear no matter how long a shopper presses the icon. On desktop, a keyboard user tabbing through the page gets no guarantee the browser shows the title text on focus the way it does on hover — behavior varies by browser. And a screen reader that does announce a title value typically reads it once, with no way to “re-open” it or interact with a link inside it.

The accessible pattern: WAI-ARIA’s Tooltip role

The WAI-ARIA Authoring Practices Guide’s Tooltip pattern lays out the structure that satisfies 1.4.13. The trigger is a real, focusable element (a <button>, not a <span>/<div> with a click handler bolted on) referencing the tooltip’s id via aria-describedby. The tooltip container uses role="tooltip" and is not focusable itself — per the pattern, “focus stays on the triggering element while the tooltip is displayed.”

The tooltip appears “when the element receives keyboard focus or the mouse hovers over it,” typically after a short delay. Escape dismisses it — satisfying the dismissible condition without forcing a keyboard user to tab away. A focus-triggered tooltip closes on blur; a hover-triggered one “remains open as long as the cursor is over the trigger or the tooltip itself” — satisfying the hoverable condition.

Worth flagging: the APG’s own tooltip page states, “This design pattern is work in progress; it does not yet have task force consensus” — treat it as the best current documented baseline, and manually test dismiss/hover/persist behavior yourself rather than assuming a component library’s “Tooltip” export already gets it right. Plenty of UI-library tooltips predate 1.4.13 (published with WCAG 2.1 in 2018) and were built purely as a visual hover effect.

Where this shows up on e-commerce pages

The info-icon tooltip is one of the most common small components on a product or checkout page, attached to whatever doesn’t fit in the main copy: a size-guide icon next to a size selector (“sizes run small, order one size up”), a material/ingredient call-out on an apparel or cosmetics page, a financing explainer next to a “4 payments of $X” line at checkout, a gift-wrap/personalization detail, or a shipping-estimate caveat next to a delivery date. It’s the same underlying pattern — compact trigger, popup with more detail — repeated across a page, which makes it worth fixing once as a shared component rather than five slightly different ad-hoc ways.

A minimal accessible implementation

<button type="button" class="info-trigger" aria-describedby="size-tooltip">
  <span class="visually-hidden">More information about sizing</span>
  <svg aria-hidden="true" focusable="false"><!-- "i" icon --></svg>
</button>
<div role="tooltip" id="size-tooltip" class="tooltip" hidden>
  Sizes run small on this style — we recommend ordering one size up.
</div>
const trigger = document.querySelector('.info-trigger');
const tooltip = document.getElementById('size-tooltip');

const show = () => tooltip.hidden = false;
const hide = () => tooltip.hidden = true;

trigger.addEventListener('mouseenter', show);
trigger.addEventListener('focus', show);
trigger.addEventListener('mouseleave', (e) => {
  if (!tooltip.contains(e.relatedTarget)) hide();
});
trigger.addEventListener('blur', hide);
tooltip.addEventListener('mouseleave', hide);
document.addEventListener('keydown', (e) => {
  if (e.key === 'Escape' && !tooltip.hidden) hide();
});

Three details in that snippet do the actual work: the trigger is a real <button> with its own accessible name (the visually-hidden span) independent of the tooltip content, satisfying SC 4.1.2 Name, Role, Value — a screen reader user needs to know what the button does before activating it, not just what the tooltip says afterward. The mouseleave check against relatedTarget keeps the tooltip open if the pointer moves from the trigger onto the tooltip box, instead of hiding it the instant the cursor leaves the icon (the hoverable condition). And the Escape handler provides dismissal without forcing the pointer or focus to move first (the dismissible condition).

Can an automated scanner catch this?

Only partially. A rule engine can flag a role="tooltip" element with no accessible relationship to its trigger, or an icon-only button with no accessible name — both structural checks. What it can’t do is drive a mouse from the trigger onto the tooltip and confirm the content doesn’t disappear mid-move, hold focus and check Escape actually closes it, or catch a fixed-timeout auto-hide. All three of SC 1.4.13’s conditions are behavioral — exactly the category that needs a person testing keyboard and hover interaction directly, not just a scanner report.

FAQ

Does SC 1.4.13 apply to a plain browser title tooltip? No — the Understanding doc’s own exception covers content “controlled by the user agent and not modified by the author,” which describes a native title tooltip. That doesn’t make title a good mechanism, though; see above on why MDN calls it “highly problematic” for touch, keyboard, and assistive-tech users, independent of this criterion.

Does this still apply if the tooltip is just plain text, no links? Yes — a screen-magnifier user at high zoom still needs time to read plain text before it disappears, and a keyboard user still needs a way to dismiss it without tabbing past it. Simpler content reduces how much can go wrong in the build, not the requirement itself.

Is title ever an acceptable fallback if a proper tooltip is too much to build? Only as a non-essential, mouse-only hint — never as the sole path to information a shopper needs to complete a purchase decision (sizing, financing terms). If the content gates a buying decision, it needs a keyboard- and touch-reachable path; even a simple expand/collapse disclosure next to the icon is more robust than a hover-only title.

Get a human-reviewed audit, not just a scan

A scanner can catch a missing accessible name on a tooltip trigger. It can’t verify the tooltip stays open when a mouse moves onto it, or that Escape dismisses it — manual, interaction-level checks. Quietramp’s audits pair an automated scan with exactly that kind of manual review, delivered as a prioritized, developer-actionable PDF report. See a real sample report or check pricing — $890 one-time, $99/month for ongoing re-checks after fixes ship.


This article is general accessibility information, not legal advice. Meeting WCAG 2.1 AA does not resolve ADA or any other legal compliance question, and nothing here should be read as a compliance guarantee. Consult qualified counsel for legal risk questions.

This article was drafted with AI assistance and reviewed by a person for accuracy before publication.

← Back to Notes