Eliminierung technischer Schulden mit PHPStan, Rector PHP und PHPUnit. Über 20 Jahre Praxiserfahrung in skalierbaren Backends.
- Erstellt:
- Aktualisiert:
- Autor:
- Roland Golla
Was ist das Document Object Model (DOM)?
DOM und Barrierefreiheit mit NCA: Schnelle Hilfe vom Experten
Gesetzliche Konformität & Inklusion. Optimierung von Performance und Conversion durch radikal nutzerzentriertes, universelles Design.
Skalierbare KI-Systeme mit echtem Code Ownership. CI/CD, Backup-Strategien und Infrastruktur, die mit deinem Team wächst.
Vom DOM zum Accessibility Tree
- Rolle: Was ist das Element? Button, Link, Überschrift, Checkbox, Liste.
- Name: Wofür ist es da? Der Text im Button, das Label am Feld, der Alternativtext am Bild.
- Zustand: Ist die Checkbox aktiviert, ist das Menü aufgeklappt, ist das Feld ungültig?
- Beziehungen: Welches Label gehört zu welchem Feld, welche Fehlermeldung beschreibt welche Eingabe?
Semantisches HTML: Das DOM richtig füttern
<!-- Nicht barrierefrei: keine Rolle, kein Fokus, keine Tastatur -->
<div class="btn" onclick="save()">Speichern</div>
<!-- Barrierefrei: Rolle, Fokus und Tastatur kommen vom Browser -->
<button type="button" onclick="save()">Speichern</button>
- Überschriften: saubere Hierarchie ohne Sprünge, siehe Barrierefreie Headlines.
- Formulare: jedes Feld mit sichtbarem Label, siehe Accessible Forms.
- Bilder und Icons: Alternativtext oder bewusst leer, siehe Alternativtext und Barrierefreie Icons.
Dynamische DOM Änderungen: Live Regions und Fokus
<!-- Die Region steht schon beim Laden im DOM, zunächst leer -->
<div id="cart-status" role="status"></div>
<script>
const status = document.getElementById('cart-status');
function addToCart(count) {
status.textContent = `${count} Artikel im Warenkorb`;
}
</script>
const dialog = document.querySelector('#settings-dialog');
const opener = document.querySelector('#open-settings');
opener.addEventListener('click', () => dialog.showModal());
// Fokus zur Sicherheit explizit zurück zum Auslöser
dialog.addEventListener('close', () => opener.focus());
DOM Reihenfolge, Lesereihenfolge und Tastatur
- CSS order und flex-direction: row-reverse: Die Optik zeigt A, B, C, das DOM liefert C, B, A.
- Grid mit expliziter Platzierung: Kacheln wandern optisch nach oben, im DOM stehen sie am Ende.
- Absolute Positionierung: Ein Button erscheint oben rechts, steht im DOM aber hinter dem Footer.
- Positiver tabindex: Werte über 0 zerstören die natürliche Fokus Reihenfolge fast immer.
Typische DOM Fehler und ihre Wirkung auf Screenreader
DOM Barrierefreiheit testen mit DevTools, axe-core und Cypress
describe('DOM und Barrierefreiheit', () => {
it('hat keine axe Verstöße nach WCAG AA', () => {
cy.visit('/');
cy.injectAxe();
cy.checkA11y(null, {
runOnly: { type: 'tag', values: ['wcag2a', 'wcag2aa', 'wcag22aa'] },
});
});
it('meldet den Warenkorb über eine Live Region', () => {
cy.visit('/produkt');
cy.get('[data-cy=add-to-cart]').click();
cy.get('[role=status]').should('contain.text', 'im Warenkorb');
});
it('setzt den Fokus in den Dialog', () => {
cy.get('#open-settings').click();
cy.focused().closest('dialog').should('exist');
});
});
Frameworks, Shadow DOM und Web Components
- Fragment und Wrapper: Ein zusätzliches div zwischen ul und li bricht die Listenstruktur. Fragments in React und Vue verhindern das.
- IDs in wiederverwendeten Komponenten: Doppelte IDs lassen label for und aria-describedby ins Leere laufen. Generierte IDs, etwa mit useId in React, lösen das.
- Client Rendering ohne Fallback: Solange JavaScript lädt, ist das DOM leer oder unvollständig. Serverseitiges Rendering, wie Astro es standardmäßig macht, liefert sofort einen vollständigen Baum.
Think 'what does this expose to the accessibility tree?'
Semantic HTML 2026: Landmarks, Überschriften, Buttons statt div, Code Beispiele und Tests mit Cypress. Die Basis für WCAG 2.2, Screenreader und SEO.
Mehr erfahrenDOM und Barrierefreiheit in NCA Projekten
Wir sind hier, um Ihnen zu helfen. Gemeinsam meistern wir Ihre digitalen Herausforderungen und fördern die Inklusion im Internet. Lassen Sie uns Ihre Projekte mit barrierefreiem Webdesign erfolgreich machen.
Häufige Fragen zum DOM und zur Barrierefreiheit
Das Document Object Model ist die Baumstruktur, in die der Browser eine HTML Seite übersetzt. Jedes Element, jedes Attribut und jeder Text wird darin zu einem Knoten. JavaScript liest und ändert diese Knoten, Frameworks wie React, Vue oder Astro erzeugen sie. Gepflegt wird das DOM als Living Standard von der WHATWG.
Aus dem DOM baut der Browser den Accessibility Tree. Genau diesen Baum lesen Screenreader, Sprachsteuerung und andere assistive Technologien aus. Fehlt im DOM eine Rolle, ein Name oder ein Zustand, fehlt diese Information auch für den Nutzer. Die WCAG 2.2 Kriterien, die über das BFSG verbindlich sind, prüfen deshalb vor allem das DOM.
Das DOM enthält alle Knoten einer Seite. Der Accessibility Tree ist eine gefilterte Sicht darauf mit Rolle, Name, Zustand und Beziehungen jedes bedeutungstragenden Elements. Dekorative Elemente fehlen dort. Der Browser erzeugt den Accessibility Tree automatisch aus dem DOM, ARIA Attribute können ihn ergänzen oder überschreiben.
Vor allem 1.3.1 Info und Beziehungen, 1.3.2 Bedeutungstragende Reihenfolge, 2.4.3 Fokus Reihenfolge, 4.1.2 Name, Rolle, Wert und 4.1.3 Statusmeldungen. Sie verlangen semantisches Markup, eine sinnvolle Reihenfolge, korrekte Namen und Rollen sowie angesagte Änderungen. Das frühere Kriterium 4.1.1 Syntaxanalyse ist in WCAG 2.2 gestrichen.
Erst im Browser: Accessibility Tree in den Chrome DevTools oder im Firefox Accessibility Inspector ansehen. Dann automatisiert mit axe-core, etwa über cypress-axe in der CI Pipeline. Dynamisches Verhalten wie Live Regions und Fokus deckt ihr mit eigenen Cypress Tests ab. Zum Schluss folgt der manuelle Test mit Tastatur und Screenreader.
Eine Live Region ist ein Bereich im DOM, dessen Änderungen Screenreader automatisch ansagen. Ihr markiert ihn mit role status, aria-live polite oder für dringende Meldungen mit role alert. Wichtig ist, dass die Region schon beim Laden im DOM steht und erst danach Inhalt bekommt. Sonst melden viele Screenreader nichts.
Ein natives button Element bringt Rolle, Fokus und Tastatursteuerung automatisch mit. Ein div mit Klick Handler hat nichts davon: Es erscheint im Accessibility Tree nicht als Button, ist per Tab nicht erreichbar und reagiert nicht auf Enter oder Leertaste. Das alles nachzubauen kostet Zeit und ist fehleranfällig.
Nein. CSS verschiebt Elemente nur optisch, etwa mit order, row-reverse, Grid Platzierung oder absoluter Positionierung. Screenreader und die Tab Taste folgen weiter der DOM Reihenfolge. Weicht die Optik davon ab, springt der Fokus quer über die Seite. Deshalb gehört die Lesereihenfolge ins DOM und nicht ins Stylesheet.
Nicht grundsätzlich. Das virtuelle DOM ist nur ein Zwischenschritt, am Ende entsteht echtes DOM im Browser. Probleme entstehen durch die Komponenten selbst, etwa durch überflüssige Wrapper, doppelte IDs oder fehlendes Fokusmanagement bei Seitenwechseln. Deshalb prüft ihr immer das gerenderte Ergebnis und nicht den Quellcode.
Der Accessibility Tree schaut durch die Shadow Grenze hindurch, Rollen und Namen innerhalb einer Web Component werden also erkannt. ID Referenzen wie aria-labelledby oder label for funktionieren aber nicht über die Grenze hinweg. Label, Beschreibung und Feld sollten deshalb innerhalb derselben Shadow Root liegen.
aria-hidden true entfernt ein Element samt Kindern aus dem Accessibility Tree. Im DOM und auf dem Bildschirm bleibt es erhalten. Das ist sinnvoll für dekorative Icons. Gefährlich wird es bei fokussierbaren Elementen: Sie bekommen weiter den Fokus, sind für Screenreader aber leer. Für ganze Bereiche ist das inert Attribut die bessere Wahl.
Nein. Automatisierte Tools finden fehlende Namen, falsche Rollen und ungültige ARIA Attribute zuverlässig. Ob die Reihenfolge Sinn ergibt, ob ein Name verständlich ist oder ob eine Änderung zur richtigen Zeit angesagt wird, erkennen sie nicht. Dafür braucht es den manuellen Test mit Tastatur und Screenreader zusätzlich zur Pipeline.