Skip links are essential navigation aids that allow keyboard users to bypass repetitive navigation elements and jump directly to the main content or other important sections of a page. They’re especially important for users who rely on keyboard navigation.
Why Skip Links Matter
Many websites have extensive navigation menus, headers, and other repetitive elements that keyboard users must tab through before reaching the main content. Skip links provide a shortcut that:
- Reduces navigation time for keyboard users
- Improves the user experience for screen reader users
- Helps users with motor impairments navigate more efficiently
- Makes websites more accessible to all users
Basic Skip Link Implementation
The foundation of skip links starts with proper HTML structure:
<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
<nav>
<!-- Navigation content -->
</nav>
</header>
<main id="main-content">
<!-- Main page content -->
</main>
Key Points:
- Place skip links at the very beginning of the page
- Use descriptive text that explains the destination
- Ensure the target has a matching ID
Multiple Skip Links
For complex pages, you might need multiple skip links:
<a href="#main-content" class="skip-link">Skip to main content</a>
<a href="#navigation" class="skip-link">Skip to navigation</a>
<a href="#footer" class="skip-link">Skip to footer</a>
<header>
<nav id="navigation">
<!-- Navigation content -->
</nav>
</header>
<main id="main-content">
<!-- Main page content -->
</main>
<footer id="footer">
<!-- Footer content -->
</footer>
CSS for Skip Links
Proper styling ensures skip links are accessible but not visually intrusive:
.skip-link {
position: absolute;
top: -100px;
left: 50%;
transform: translateX(-50%);
background: var(--color-white);
color: var(--color-black);
padding: 12px 20px;
text-decoration: none;
border-radius: var(--radius-md);
font-size: var(--text-sm);
z-index: 1000;
transition: top 0.3s ease;
}
.skip-link:focus {
background: var(--color-white);
color: var(--color-black);
top: 6px;
outline: 3px solid var(--accent-primary);
}
/* Alternative positioning */
.skip-link {
position: absolute;
top: -40px;
left: 6px;
background: var(--color-white);
color: var(--color-black);
padding: 8px 16px;
text-decoration: none;
border-radius: 4px;
font-size: 14px;
z-index: 1000;
transition: top 0.3s ease;
}
.skip-link:focus {
top: 6px;
outline: 2px solid var(--accent-primary);
outline-offset: 2px;
}
Skip Links for Different Page Types
Blog Post Page
<a href="#article-content" class="skip-link">Skip to article</a>
<a href="#comments" class="skip-link">Skip to comments</a>
<header>
<nav>
<!-- Site navigation -->
</nav>
</header>
<article id="article-content">
<h1>Article Title</h1>
<!-- Article content -->
</article>
<section id="comments">
<h2>Comments</h2>
<!-- Comments section -->
</section>
E-commerce Product Page
<a href="#product-info" class="skip-link">Skip to product information</a>
<a href="#reviews" class="skip-link">Skip to reviews</a>
<a href="#related-products" class="skip-link">Skip to related products</a>
<header>
<nav>
<!-- Site navigation -->
</nav>
</header>
<section id="product-info">
<h1>Product Name</h1>
<!-- Product details -->
</section>
<section id="reviews">
<h2>Customer Reviews</h2>
<!-- Reviews -->
</section>
<section id="related-products">
<h2>Related Products</h2>
<!-- Related products -->
</section>
Form Page
<a href="#form-content" class="skip-link">Skip to form</a>
<a href="#help-text" class="skip-link">Skip to help</a>
<header>
<nav>
<!-- Site navigation -->
</nav>
</header>
<form id="form-content">
<h1>Contact Form</h1>
<!-- Form fields -->
</form>
<section id="help-text">
<h2>Need Help?</h2>
<!-- Help content -->
</section>
Advanced Skip Link Patterns
Skip to Search
<a href="#search" class="skip-link">Skip to search</a>
<header>
<nav>
<!-- Navigation -->
</nav>
<form role="search" id="search">
<label for="search-input">Search</label>
<input type="search" id="search-input" name="q" />
<button type="submit">Search</button>
</form>
</header>
Skip to Table of Contents
<a href="#toc" class="skip-link">Skip to table of contents</a>
<nav id="toc" aria-label="Table of contents">
<h2>Table of Contents</h2>
<ul>
<li><a href="#section1">Introduction</a></li>
<li><a href="#section2">Getting Started</a></li>
<li><a href="#section3">Advanced Topics</a></li>
</ul>
</nav>
Skip to Footer Links
<a href="#footer-links" class="skip-link">Skip to footer links</a>
<footer>
<nav id="footer-links" aria-label="Footer navigation">
<ul>
<li><a href="/about">About</a></li>
<li><a href="/contact">Contact</a></li>
<li><a href="/privacy">Privacy</a></li>
</ul>
</nav>
</footer>
Common Skip Link Mistakes
❌ Bad: Skip links that don’t work
<a href="#main" class="skip-link">Skip to main content</a>
<!-- No element with id="main" exists -->
<div class="main-content">
<!-- Content -->
</div>
Problems:
- Skip link has nowhere to go
- Users get confused when nothing happens
❌ Bad: Skip links that aren’t visible when focused
<a href="#main-content" class="skip-link" style="display: none;">Skip to main content</a>
Problems:
- Keyboard users can’t see the skip link
- Screen readers can’t access it
❌ Bad: Skip links positioned incorrectly
<header>
<nav>
<a href="#main-content" class="skip-link">Skip to main content</a>
<!-- Navigation items -->
</nav>
</header>
Problems:
- Skip link isn’t the first focusable element
- Users must tab through navigation to reach it
❌ Bad: Generic skip link text
<a href="#content" class="skip-link">Skip</a>
Problems:
- Users don’t know where they’ll end up
- Not descriptive enough
Testing Skip Links
- Keyboard Navigation: Tab to the skip link and press Enter
- Focus Visibility: Ensure skip link is visible when focused
- Screen Reader: Use NVDA, JAWS, or VoiceOver to test
- Destination: Verify focus moves to the correct element
- All Pages: Test skip links on every page of your site
Skip Link Guidelines
Use Descriptive Text
<!-- Good -->
<a href="#main-content" class="skip-link">Skip to main content</a>
<!-- Bad -->
<a href="#content" class="skip-link">Skip</a>
Position Correctly
<!-- Good: First element in body -->
<body>
<a href="#main-content" class="skip-link">Skip to main content</a>
<header>...</header>
<main id="main-content">...</main>
</body>
<!-- Bad: Inside header -->
<body>
<header>
<a href="#main-content" class="skip-link">Skip to main content</a>
<!-- Navigation -->
</header>
</body>
Ensure Targets Exist
<!-- Good -->
<a href="#main-content" class="skip-link">Skip to main content</a>
<main id="main-content">...</main>
<!-- Bad -->
<a href="#main-content" class="skip-link">Skip to main content</a>
<main>...</main>
JavaScript Enhancement
For dynamic content, you might need JavaScript to handle skip links:
// Handle skip links for dynamically loaded content
document.addEventListener('DOMContentLoaded', function() {
const skipLinks = document.querySelectorAll('.skip-link');
skipLinks.forEach(link => {
link.addEventListener('click', function(e) {
const targetId = this.getAttribute('href').substring(1);
const target = document.getElementById(targetId);
if (target) {
e.preventDefault();
target.focus();
target.scrollIntoView({ behavior: 'smooth' });
}
});
});
});
Remember: Skip links are a simple but powerful accessibility feature that can significantly improve the user experience for keyboard and screen reader users. Always test them thoroughly and ensure they work on all pages of your website.