Skip to main content
Browse documentation

Skip Link Audit

A skip link is an in-page anchor near the start of the tab order, usually something like “Skip to content”, that lets keyboard users jump past repeated navigation. WCAG 2.4.1 Bypass Blocks can be met with skip links, landmarks, or headings. When a skip-link-like anchor is present in the first few tab stops, this audit checks that it actually works.

Pages that rely on landmarks or headings alone, with no skip link, are not flagged. axe-core already covers whether a bypass mechanism exists.

Turning it on

This audit is experimental: it is off by default while we validate it against more real-world sites. To enable it, open a site’s Settings, and switch on Include experimental audits under Scan settings. The setting is per-site, and applies to every scheduled and manual scan of that site from the moment you save it.

How the audit works

After the page has loaded, the audit tabs through the first three focusable elements looking for in-page fragment anchors (href="#main", not a bare # or #top, and not hash-router paths like #/home). For each candidate it:

  1. Checks that the fragment target exists in the page.
  2. Focuses the link and presses Enter.
  3. Checks whether keyboard focus moved into the target, either immediately or on the next Tab press.

If no skip-link candidate is found, the audit stays silent.

Reading the results

Failed skip links are reported as violations. Passing skip links are reported as passes. Both include a CSS selector and a sample of the element’s HTML.

Two failure reasons appear in the result:

  • Target missing: the href fragment does not match any element id or name.
  • Activation had no effect: the target exists, but pressing Enter did not move keyboard focus into it. A common cause is a click handler that calls preventDefault() without managing focus.

You can ignore individual elements you have reviewed and accepted using the same ignore feature you use for other issues.

Limitations

The audit only looks at in-page fragment anchors in the first three tab stops. Skip controls implemented as buttons, JavaScript-only focus movers, and skip links later in the tab order are not detected. Closed shadow roots are opaque to the scan.

A missing tabindex="-1" on the target is not a failure by itself. Modern browsers set a sequential focus starting point on fragment navigation, so the next Tab landing inside the target still counts as a pass.