The Frontend Developer’s Accessibility Checklist
As frontend developers, we obsess over performance, smooth animations, and pixel-perfect UI. But here’s the thing: if a user can’t navigate your site with a keyboard, or your text blends into the background, it doesn’t matter how pretty it looks -it’s broken for them.
Accessibility isn’t just about complying with WCAG or ticking legal boxes. It’s about making sure everyone can use what we build, whether they’re using a screen reader, navigating by keyboard, or just trying to read content under sunlight on their phone.
So, how do we actually build accessible frontends in practice? Here’s the checklist I run through on every project.
1. Start with Semantic HTML
HTML already gives us a ton of accessibility “for free” if we use it properly.
- Use headings in order (
h1 → h2 → h3) to give screen readers structure. - Reach for
<button>instead of a clickable<div>. Same for<a>vs. a styled<span>. - Add descriptive
alttext to images—or leave it empty (alt="") if the image is decorative. - Label your form fields with
<label>so users don’t have to guess what an input does.
Think of semantic HTML as the foundation. If this part is solid, everything else gets easier.
2. Make It Keyboard-Friendly
If you can’t use your site with just a keyboard, it’s not accessible. Period.
- Every interactive element should be reachable with
Tab. - The focus order should follow the reading flow.
- Keep visible focus styles (don’t just remove that blue outline without replacing it).
- Dropdowns, modals, and menus should open/close with
Enter,Esc, and arrow keys.
Pro tip: Put your mouse away for 5 minutes and try navigating your app with just the keyboard. You’ll catch issues immediately.
3. Watch Your Colours & Contrast
Design systems can look gorgeous, but fail if text fades into the background.
- Aim for a minimum 4.5:1 contrast ratio (3:1 for large text).
- Add hover/focus states that are clearly visible.
- Don’t rely on colour alone—if “errors” are red, add an icon or text cue too.
- Check both light and dark themes if you support them.
There are free contrast checkers (like Stark or Contrast Ratio) that make this painless.
4. Use ARIA Wisely
ARIA is powerful, but also dangerous if misused. The rule of thumb: native HTML first, ARIA second.
- Define landmarks with
<header>,<main>,<nav>,<footer>. - Update
aria-expanded,aria-pressed, andaria-hiddendynamically when UI changes. - Don’t add
role="button"to an actual<button>—it’s redundant.
If you feel like you’re sprinkling ARIA everywhere, take a step back and ask: “Could semantic HTML solve this?” Often the answer is yes.
5. Don’t Forget About Forms
Forms are where accessibility issues hit hardest.
- Every input needs a label.
- Group related inputs with
<fieldset>and<legend>. - Show clear, specific error messages (“Password must be at least 8 characters” beats “Invalid input”).
- Use
aria-describedbyto link inputs to help text or errors. - Add autocomplete attributes (
autocomplete="email",autocomplete="street-address", etc.).
Accessible forms aren’t just about inclusion—they reduce friction for all users.
6. Handle Media & Motion
Not everyone experiences media the same way.
- Add captions or transcripts for video/audio.
- Don’t autoplay media with sound (seriously, just don’t).
- Respect the
prefers-reduced-motionsetting in CSS for animations. - Avoid flashing elements that could trigger seizures.
Accessibility here overlaps with good UX: nobody likes surprise audio blasting in their headphones.
7. Test Like a User
Tools help, but nothing beats hands-on testing.
- Run Lighthouse or axe for automated checks.
- Use a screen reader like NVDA (Windows) or VoiceOver (Mac).
- Navigate your app with just the keyboard.
- Check your colour contrast in multiple environments.
These steps don’t take long, but they reveal a ton of hidden issues.
8. Mind Your Content
Accessibility isn’t just technical—it’s also about language.
- Give every page a
langattribute. - Keep text clear and concise.
- Use headings that actually summarize the section.
- Write link text that describes the destination (skip “click here”).
Good content design and accessibility go hand in hand.
Final Thoughts
Accessibility isn’t a feature you tack on at the end—it’s part of the craft of frontend development. By running through this checklist, you’ll catch most of the common pitfalls before they ship.
And here’s the bonus: accessible websites aren’t just better for people with disabilities. They’re better for everyone. Clearer navigation, better forms, keyboard shortcuts—all of these improve the user experience across the board.
So the next time you’re polishing that shiny UI, ask yourself: Can everyone use this? If the answer’s yes, you’re doing it right.
🎁 Bonus Content: Accessibility + Performance Wins
Some improvements don’t just help with accessibility—they also boost your Lighthouse score (performance, SEO, and best practices). Here are a few worth adding:
1. Smarter Images
- Use the
loading="lazy"attribute to defer offscreen images and reduce initial page load. - Prioritize above-the-fold images with
fetchpriority="high"(usually for the hero image). - Always specify
widthandheight(or useaspect-ratio) to avoid layout shifts. - Consider
srcsetandsizesto serve responsive images for different devices.
👉 These tweaks improve Core Web Vitals, especially Largest Contentful Paint (LCP).
2. Font Loading
- Use
font-display: swap;in your@font-faceCSS so text stays readable while custom fonts load. - Consider system fonts for faster rendering where branding allows.
- Preload critical fonts with
<link rel="preload">for even faster text rendering.
👉 This improves First Contentful Paint (FCP) and avoids invisible text issues (“flash of invisible text”).
3. Preload & Preconnect
- Use
<link rel="preconnect">for third-party domains (e.g., Google Fonts, APIs). - Preload critical assets like CSS or hero images with
<link rel="preload">. - Bundle or defer non-critical scripts so they don’t block rendering.
👉 This helps reduce Time to Interactive (TTI).
4. Reduce Cumulative Layout Shift (CLS)
- Reserve space for ads, embeds, and images to prevent shifting content.
- Use
aspect-ratioin CSS for consistent placeholders. - Avoid injecting DOM elements above the fold after page load.
👉 Google loves sites with a stable layout.
5. Accessible + Performant Media
- Provide multiple formats for video (
mp4,webm) for better compatibility. - Add captions/transcripts for accessibility.
- Use
loading="lazy"for iframes (like YouTube embeds). - Compress media with modern codecs (AVIF, WebP).
🚀 Wrapping Up the Bonus
These aren’t strictly “accessibility” requirements, but they’re in the same spirit: building fast, reliable, and inclusive websites. They’ll make your pages lighter, your users happier, and your Lighthouse audits greener.
Accessibility + performance = a win-win.