React Accessibility Checker

Was der Prüfer im JSX findet

Feldnamen, Icon-Buttons, doppelte IDs: drei Befunde in Komponenten.

Website prüfen
Beispiel im Prüfbericht Markierter Befund
Markierter Befund · Kritisch · WCAG 4.1.2Regler ohne zugänglichen Namen

React-Prüfstrategie

Prüfen Sie den Zustand, nicht nur die Komponente

Ein Checker ist keine einzelne Bibliothek. Er verbindet statische JSX-Regeln mit echten Browserzuständen und einer kurzen manuellen Prüfung.

Konzeptionelle PrüfansichtSuchfeld · vier Zustände · drei Prüfebenen
01JSXeslint-plugin-jsx-a11yvor dem Rendern
02Browser-DOMPlaywright + axepro sichtbarem Zustand
03NutzungTastatur + VorleseprogrammBedeutung und Ablauf
Testmatrix

Jeder neue UI-Zustand ist ein neuer Prüfpunkt

4 Zustände
01

Grundzustand

SuchbegriffSuche …
  • LintLabel-Verbindungprüfbar
  • AxeName und IDprüfbar
  • ManuellFokus sichtbaroffen
02

Fehler sichtbar

SuchbegriffEingabe fehlt
  • LintQuellcodebegrenzt
  • Axearia-describedbyprüfbar
  • ManuellFehleransageoffen
03

Vorschläge offen

BerlinBernBergen
  • LintRollen im JSXteilweise
  • Axesichtbarer Dialogprüfbar
  • ManuellPfeiltastenoffen
04

Ergebnis geladen

12 TrefferListe aktualisiert
  • LintLive-Regionbegrenzt
  • Axefertiger DOMprüfbar
  • ManuellÄnderung bemerktoffen
Warum vier Scans?Axe prüft keine versteckten Menüs oder inaktiven Dialoge. Öffnen oder rendern Sie den Zustand zuerst.

Instanzsichere Beziehungen

useId verbindet Name, Feld und Hinweis

Eine feste ID kollidiert, sobald dieselbe Komponente zweimal erscheint. Ein gemeinsamer Präfix aus useId() hält alle Verweise innerhalb der Instanz zusammen.

Nicht verwenden für: Listenschlüssel oder IDs aus Ihren Fachdaten.

labelhtmlFor={queryId}
inputid={queryId}
Hinweisid={hintId}

aria-describedby={hintId} führt vom Feld zum Hinweis zurück.

Zwei automatische Netze

Kopierbarer Start für Lint und Browser-Test

Der Linter läuft bei jeder Änderung. Der Browser-Test prüft, was React tatsächlich rendert.

eslint.config.jsQuelle
import jsxA11y from 'eslint-plugin-jsx-a11y';

export default [
  {
    files: ['src/**/*.{js,jsx}'],
    ...jsxA11y.flatConfigs.recommended,
  },
];

Eigene Komponenten brauchen gegebenenfalls ein Mapping auf ihr gerendertes HTML-Element. Der Linter kann Laufzeitzustände und ID-Kollisionen im fertigen Dokument nicht sehen.

search.a11y.spec.jsBrowser
import { test, expect } from '@playwright/test';
import AxeBuilder from '@axe-core/playwright';

async function expectNoAxeFindings(page) {
  const result = await new AxeBuilder({ page }).analyze();
  expect(result.violations).toEqual([]);
}

test('Suche: Start und Fehler', async ({ page }) => {
  await page.goto('/suche');
  await expectNoAxeFindings(page);

  await page.getByRole('button', { name: 'Suchen' }).click();
  await expect(page.getByText('Suchbegriff fehlt')).toBeVisible();
  await expectNoAxeFindings(page);
});

Für Vorschlagsliste, Dialog und Erfolg schreiben Sie eigene Zustandswege. Ein grüner Scan gilt nur für den DOM, der im Moment von analyze() sichtbar ist.

Grenze der Automatik

Ein leerer Befundbericht ist der Beginn der Prüfung

Tab Erreiche ich alle Aktionen?Enter / Leertaste Funktionieren native Erwartungen?200 % Bleibt Inhalt nutzbar und sichtbar?Vorleseprogramm Sind Name, Zustand und Änderung verständlich?

Aus dem Prüfbericht

Drei Stellen, drei Befunde

Zum Mitnehmen

Die React-Komponente, korrigiert

htmlFor statt for, ein Name am Icon-Button, useId gegen Kollisionen.

Korrektur in 3 Schritten ansehen
  1. Label und Feld mit useId verbinden

    useId erzeugt je Instanz eine eigene ID. Das Feld behält seinen Namen, auch wenn die Komponente mehrfach gerendert wird.

    KorrekturvergleichSchritt 1 · JavaScript

    Vorher

    function Suchfeld() {
      return (
        <>
          <span>Suchbegriff</span>
          <input id="suche" type="search" />
        </>
      );
    }

    Nachher

    function Suchfeld() {
      const id = useId();
      return (
        <>
          <label htmlFor={id}>Suchbegriff</label>
          <input id={id} type="search" />
        </>
      );
    }

    Markierte Zeilen wurden geändert

    So prüfen Sie es Rendern Sie die Komponente zweimal und klicken Sie auf das zweite Label. Der Fokus springt in das zweite Feld.

  2. Dem Icon-Button einen Namen geben

    Das Symbol bleibt für Vorleseprogramme ausgeblendet. aria-label liefert das Wort, das vorgelesen wird.

    KorrekturvergleichSchritt 2 · JavaScript

    Vorher

    <button type="button" onClick={loeschen}>
      <TrashIcon aria-hidden="true" />
    </button>

    Nachher

    <button type="button" onClick={loeschen} aria-label="Eintrag löschen">
      <TrashIcon aria-hidden="true" />
    </button>

    Markierte Zeilen wurden geändert

    So prüfen Sie es Fahren Sie mit der Tab-Taste auf das Symbol. Ein Vorleseprogramm sagt „Eintrag löschen, Schaltfläche“.

  3. Doppelte IDs in ARIA-Verweisen auflösen

    Feste IDs kollidieren, sobald die Komponente zweimal auf der Seite steht. aria-describedby verweist dann auf den falschen Text.

    KorrekturvergleichSchritt 3 · JavaScript

    Vorher

    <input aria-describedby="hinweis" />
    <p id="hinweis">Mindestens acht Zeichen.</p>

    Nachher

    <input aria-describedby={`${id}-hinweis`} />
    <p id={`${id}-hinweis`}>Mindestens acht Zeichen.</p>

    Markierte Zeilen wurden geändert

    So prüfen Sie es Suchen Sie im veröffentlichten HTML nach der ID. Sie kommt genau einmal vor.

Werbung

Kostenloser Website-Barrierefreiheits-Check

Website auf Barrierefreiheit prüfen.

Technische WCAG-Warnsignale erkennen. Kritische Stellen zuerst prüfen.

Der Website-Check ist bereit.

Werbung

Ein letzter Schritt

Prüfen, bevor Sie gehen.

Finden Sie automatisch erkennbare Barrieren auf Ihrer eigenen Website.

Website prüfen

Kostenlos starten · keine Installation

Automatisches Screening. Tastaturbedienung und Screenreader bleiben manuelle Prüfung.