| name | accessibility |
| description | Web accessibility (WCAG 2.2) for Next.js applications — semantic HTML, ARIA, keyboard navigation, screen reader support, and automated testing. Use when building new pages, reviewing component accessibility, or fixing accessibility issues. |
| trigger | 需要提升网站可访问性 |
| input | 网站代码 |
| output | 可访问性优化建议 |
| next | 无 |
| dependencies | 无 |
Frontend Accessibility (WCAG 2.2)
Practical accessibility for Next.js applications.
Baseline Standards (WCAG 2.2 Level AA)
1. Semantic HTML
Use native HTML elements before ARIA. Correct semantics solve most accessibility issues.
<div onClick={...} role="button" tabIndex={0}>Click me</div>
<button onClick={...}>Click me</button>
<div className="nav"><a href="/">Home</a></div>
<nav aria-label="Main"><a href="/">Home</a></nav>
2. Keyboard Navigation
Every interactive element must be reachable and operable via keyboard.
const focusRing = 'focus-visible:outline-2 focus-visible:outline-blue-500'
3. ARIA Labels
Every interactive element needs an accessible name.
<button aria-label="Search">
<SearchIcon />
</button>
<nav aria-label="Footer navigation">...</nav>
<aside aria-label="Related articles">...</aside>
Next.js Specific Considerations
Link Components
<Link href="/articles/1" aria-label="Read article: How to build accessible apps">
Read more
</Link>
Image alt Text
<Image src="/bg.jpg" alt="" role="presentation" />
<Image src="/chart.png" alt="Revenue chart: Q1 $10K, Q2 $15K, Q3 $12K" />
Form Validation
<label htmlFor="email">Email</label>
<input
id="email"
aria-invalid={!!errors.email}
aria-describedby={errors.email ? 'email-error' : undefined}
/>
{errors.email && <p id="email-error" role="alert">{errors.email}</p>}
Automated Testing
npm install -D @axe-core/playwright
import { injectAxe, checkA11y } from 'axe-playwright'
test('homepage has no violations', async ({ page }) => {
await page.goto('/')
await injectAxe(page)
await checkA11y(page, null, {
includedImpacts: ['critical', 'serious']
})
})
Manual Testing Checklist
Resources