A broken skip link is a skip navigation link that exists in the DOM but does
not correctly move keyboard focus to the main content area when activated.
This is distinct from a missing skip link — the link is present and satisfies
automated accessibility checks, but fails in practice for keyboard users.
[1]
Skip links fail for several common reasons:
The target element is not focusable. Clicking an anchor link scrolls the
page to the target element, but for keyboard users focus must also move there.
If the target element — typically main — does not naturally receive focus and
does not have tabindex="-1", keyboard focus stays on the skip link while the
page scrolls. The next Tab press lands on the first link in the navigation,
not in the main content.
[2]
The target id does not exist. The skip link href references an id that
does not exist in the DOM, or the id has been changed by a CMS or framework
rendering the link inoperable.
The skip link is display: none. The link has been hidden using display:
none or visibility: hidden, removing it from the accessibility tree entirely.
Sighted keyboard users cannot see it and screen reader users cannot reach it.
The skip link is not the first focusable element. Another element receives
Tab focus before the skip link, requiring the user to Tab past it to reach
the skip link — defeating the purpose.
Automated scanners detect the presence of a skip link but cannot verify it
works. To test manually:
[3]
The complete correct implementation:
Step 1: Place the skip link as the first element inside body
Step 2: Point it at the main content id
Step 3: Add tabindex="-1" to the target element
Step 4: Use off-screen CSS to hide it visually until focused
Never use display: none or visibility: hidden on a skip link.
[1]
Last edited Apr 5, 2026, 7:27 PM · P**** J****