Accessibility beyond the basics (ARIA, focus, contrast) — Scaling Strategies — Practical Guide (Jul 13, 2026)
body { font-family: Arial, sans-serif; line-height: 1.6; max-width: 750px; margin: 1rem auto; padding: 0 1rem; colour: #222; }
h2, h3 { margin-top: 1.5rem; }
p.audience { font-weight: bold; color: #555; }
pre { background: #f4f4f4; padding: 0.75rem; border-radius: 4px; overflow-x: auto; }
code { font-family: Consolas, Monaco, ‘Courier New’, monospace; }
p.social { margin-top: 2rem; font-style: italic; colour: #666; }
Accessibility beyond the basics (ARIA, focus, contrast) — Scaling Strategies
Level: Experienced
As of July 13, 2026
Prerequisites
This article assumes you are already familiar with basic accessibility concepts—semantic HTML, keyboard navigation, ARIA roles, states, and properties, and WCAG contrast guidelines (versions 2.1 and 3.0 where applicable). You should have hands-on experience working with assistive technology (AT) such as screen readers and understand core focus management techniques.
We will focus here on scaling accessibility beyond foundational techniques, specifically targeting large, complex web applications or multi-team projects where consistency, maintenance, and performance become concerns.
Hands-on steps — Scaling accessibility effectively
1. Establish and enforce design-token-driven contrast and colour usage
While WCAG 2.1 Level AA minimum contrast ratios (4.5:1 for normal text, 3:1 for large text) are widely known, enforcing contrast through static checks only becomes impractical at scale. Instead, use design tokens or theming systems to centralise colour decisions.
Example with CSS custom properties:
:root {
--colour-text-primary: #1a1a1a;
--colour-bg-primary: #ffffff;
}
body {
color: var(--colour-text-primary);
background-color: var(--colour-bg-primary);
}
These tokens should be audited for compliance and integrated into design systems and component libraries. Automation (e.g., stylelint accessibility plugins, contrast checkers in CI pipelines) complements manual testing.
2. Use ARIA pragmatically and consistently via shared component libraries
ARIA exists to fill semantic gaps and enhance interactive behaviours for AT users — but misuse or redundancy causes confusion and maintenance overhead. As your project scales, standardise ARIA usage through component libraries or UI frameworks.
Example: a button component abstracting correct roles and states:
function AccessibleButton({ children, pressed, ...props }) {
return (
<button
role="button"
aria-pressed={pressed ? 'true' : 'false'}
{...props}
>
{children}
</button>
);
}
By centralising ARIA roles and attributes, you reduce the risk of duplicate, incorrect, or missing roles while easing updates (e.g., when the ARIA spec changes).
3. Implement robust, scalable focus management
Focus control often becomes brittle in interactive applications with dynamic UI elements such as modals, dropdowns, or single-page app (SPA) navigations.
Use established libraries that manage keyboard focus according to updated ARIA authoring practices, or implement focus-trap patterns that shift and restore focus appropriately.
Minimal focus trap example (React):
import { useEffect, useRef } from 'react';
function FocusTrap({ children }) {
const trapRef = useRef(null);
useEffect(() => {
const container = trapRef.current;
const focusableElements = container.querySelectorAll('a, button, input, textarea, select, [tabindex]:not([tabindex="-1"])');
const first = focusableElements[0];
const last = focusableElements[focusableElements.length - 1];
function handleKeyDown(e) {
if (e.key !== 'Tab') return;
if (e.shiftKey) { // shift + tab
if (document.activeElement === first) {
e.preventDefault();
last.focus();
}
} else { // tab
if (document.activeElement === last) {
e.preventDefault();
first.focus();
}
}
}
container.addEventListener('keydown', handleKeyDown);
return () => container.removeEventListener('keydown', handleKeyDown);
}, []);
return <div ref={trapRef} tabIndex="-1">{children}</div>;
}
When choosing between custom solutions and libraries, select mature, widely adopted options (like focus-trap or react-aria primitives) to reduce maintenance and cross-browser focus quirks.
4. Structure semantic landmarks and ARIA regions to improve navigation at scale
Large applications often have complex, nested UI. Use HTML5 landmarks (<main>, <nav>, <aside>, <header>, <footer>) and ARIA landmarks (role="banner", role="complementary") consistently to facilitate screen reader navigation.
Document an explicit standard for your team to follow, e.g. “Only one <main> per page”, “Use role='region' with appropriate aria-label to name major sections”.
Common pitfalls
- Overusing ARIA: Prefer native HTML semantics; ARIA should supplement, not replace elements.
- Ignoring browser and AT differences: Test across major screen readers (NVDA, JAWS, VoiceOver) and browsers to identify inconsistencies early.
- Poor focus management during updates: SPA route changes or UI changes without explicit focus resets confuse keyboard users.
- Non-scalable manual testing: The larger the project, the less feasible manual-only testing becomes—leverage automated tools.
Validation
Validating scaled accessibility requires both automated tools coupled with manual and assistive technology testing:
- Automated tools: Lighthouse (Chrome), Axe, WAVE, ARC – integrate into development pipelines.
- Keyboard testing: Regularly test critical flows purely by keyboard.
- Screen reader testing: Schedule routine sessions with different screen readers and on multiple OSes.
- Use ARIA validators and linters: These help catch invalid or misused ARIA roles and attributes early.
Note: Automated tools often catch only 30–40% of accessibility issues, manual testing remains crucial.
Checklist / TL;DR
- Centralise and automate contrast and theming decisions with design tokens.
- Standardise ARIA usage through shared, documented component libraries.
- Implement or adopt robust focus management patterns or libraries to handle dynamic UI.
- Enforce semantic landmarks and ARIA regions consistently to aid AT navigation.
- Combine automated validation with manual and screen reader testing across platforms.
- Educate teams about common ARIA misuses and focus pitfalls to avoid regressions.