Skip to main content
Operable WCAG 2.4.1

2.4.1 Bypass Blocks

A mechanism is available to bypass blocks of content that are repeated on multiple web pages.

Level A Serious WCAG 2.0 (new) WCAG 2.1 WCAG 2.2
bypass skip-link frame-title frame-title-unique

What this rule means

WCAG 2.4.1 requires that pages provide a way for users to skip past repeated blocks of content — such as navigation menus, headers, and sidebars — and go directly to the main content. This is most commonly achieved through "skip navigation" links and ARIA landmark regions.

Keyboard users and screen reader users navigate pages sequentially. Without a bypass mechanism, they must tab or arrow through dozens or hundreds of repeated links on every single page load before reaching the unique content they came for.

Why it matters

Imagine having to listen to an entire restaurant menu read aloud every time you open a new page on a website. That is the experience of a screen reader user on a site without skip links. For users with motor impairments who navigate by keyboard alone, tabbing through 50+ navigation links to reach the main content is physically exhausting and time-consuming.

Bypass mechanisms dramatically improve efficiency for keyboard and assistive technology users. They also benefit power users who prefer keyboard navigation and users of alternative input devices such as switch controls and sip-and-puff systems.

Related axe-core rules

  • bypass — Ensures each page has at least one mechanism for a user to bypass navigation and jump to the main content.
  • skip-link — Ensures skip links target an element that exists on the page and is focusable.
  • frame-title — Ensures <iframe> and <frame> elements have an accessible title attribute.
  • frame-title-unique — Ensures that <iframe> and <frame> elements have unique title values.

How to test

  1. Load the page and press Tab. The first focusable element should be a visible "Skip to main content" link.
  2. Activate the skip link by pressing Enter and verify that focus moves to the main content area.
  3. Run axe-core and check for bypass, skip-link, frame-title, and frame-title-unique violations.
  4. Verify that ARIA landmark roles (banner, navigation, main, contentinfo) are present and properly used.
  5. Check that all iframes have descriptive title attributes.
  • Use a screen reader to confirm landmark regions are announced and allow quick navigation.

How to fix

The most reliable approach combines a skip navigation link with proper ARIA landmarks.

Skip link — HTML pattern

<!-- Skip link as the very first element in <body> -->
<body>
  <a href="#main-content" class="skip-link">
    Skip to main content
  </a>

  <header role="banner">
    <nav role="navigation" aria-label="Main navigation">
      <!-- Navigation links -->
    </nav>
  </header>

  <main id="main-content" role="main" tabindex="-1">
    <h1>Page Title</h1>
    <!-- Unique page content -->
  </main>

  <footer role="contentinfo">
    <!-- Footer content -->
  </footer>
</body>

Skip link — CSS

.skip-link {
  position: absolute;
  top: -100%;
  left: 0;
  z-index: 1000;
  padding: 0.75rem 1.5rem;
  background: #1a1a2e;
  color: #ffffff;
  font-weight: 600;
  text-decoration: none;
  border-radius: 0 0 4px 0;
}

.skip-link:focus {
  top: 0;
  outline: 3px solid #4a90d9;
  outline-offset: 2px;
}

Focus management with JavaScript

// Ensure skip link target receives focus reliably
const skipLink = document.querySelector('.skip-link');
skipLink.addEventListener('click', (e) => {
  e.preventDefault();
  const target = document.querySelector(e.target.getAttribute('href'));
  if (target) {
    target.setAttribute('tabindex', '-1');
    target.focus();
    target.addEventListener('blur', () => {
      target.removeAttribute('tabindex');
    }, { önce: true });
  }
});

Iframe titles

<!-- Bad: iframe without title -->
<iframe src="https://maps.example.com/embed"></iframe>

<!-- Good: iframe with descriptive title -->
<iframe src="https://maps.example.com/embed" title="Office location map"></iframe>

Common mistakes

  • Skip link exists in the DOM but is permanently hidden with display:none or visibility:hidden, making it unreachable by keyboard.
  • Skip link points to an id that does not exist on the page, so activating it does nothing.
  • The target element of the skip link is not focusable — the main element needs tabindex="-1" in some browsers.
  • Using only ARIA landmarks without a skip link — older assistive technologies may not support landmark navigation.
  • Having multiple iframes with identical or missing title attributes, making them indistinguishable to screen reader users.
  • Placing the skip link after the navigation instead of before it, defeating its purpose.

Resources