Building an accordion component (Part 2)

Accordeons mit ARIA und JavaScript

Das name-Attribut funktioniert nicht bei custom disclosure widgets!

Teste dein Wissen

Mit den ARIA »group« und »region«-Rollen.
Mit aria-labelledby, das auf ein sichtbares oder unsichtbares Label weist, oder aria-label, wenn es gar nicht anders geht.
Mit aria-labelledby, das auf ein sichtbares oder unsichtbares Label weist, oder aria-label, wenn es gar nicht anders geht.
xxx
Es kommt drauf an, was man erreichen möchte. Man kann mit HTML5 ein wunderbar funktionierendes Accordeon machen, aber für bestimmte Funktionen benötigt man trotzdem noch JavaScript.

Accordeons mit JavaScript-Fallback

Was passiert, wenn JavaScript nicht funktioniert? Dann funktionieren auch die Accordeons nicht. Eine Lösung dafür wäre, eine mehrere <section>-Elemente (die zunächst alle ausgeklappt sind), mit JavaScript zu interaktiven Widgets zu machen. Das stellt sicher, dass der Inhalt der Panels immer zugänglich ist (wie z.B. in Reader Modes). Buttons und ARIA-Attribute werden mit JavaScript hinzugefügt und gemanaged.
Das HTML-Markup kann auf mehrere Arten gelöst werden. Wichtig ist das Endergebnis: es soll eine semantisch bedeutsame Gruppierung von zugänglichen Disclosure Widgets sein.

Accordeons mit interaktiven Überschriften

Accordeons sollten mit Überschriften gegliedert sein, damit Screenreader eine Gliederung erkennen können. Die Überschriften sollten aber auch klickbar sein. Problem: Überschriften sind keine interaktiven Elemente und können daher auch nicht aktiviert werden.

Man könnte die Überschriften in das <summary>-Element verpacken. Dann wird bei einem Klick auf die Überschrift das Panel geöffnet. Allerdings hat diese Variante einen großen Haken: Das <summary>-Element wird von den meisten AAPIs auf role="button" gemappt, und ein Element mit einer impliziten oder expliziten button-role unterdrückt die Semantik ihrer Kindelemente d.h., die Semantik der Überschrift geht verloren.

Dreht man die Sache um und wrappt das <summary>-Element in die Überschrift, geht die Funktion des <summary>-Elements verloren, weil es nicht mehr das erste, direkte Kind von <details> ist, es funktioniert daher nicht mehr als Trigger.

Wir brauchen also custom disclosure widgets, die die Semantik der Überschriften erhalten!

[ Live-Demonstration of the progressively-enhanced custom accordion with headings in the text-version of the chapter! ]

Inhalte in Accordeons für die Browsersuche auf der Seite zugänglich machen

Mit strg + F können Inhalte in einem nativen Accordeon - <details> und <summary> - gefunden werden. Bei custom accordeon widgets geht das nicht mehr, weil der Inhalt des Panels für alle User unsichtbar ist.
Lösung: verstecken mit hidden="until-found". Das macht die Inhalte für find-in-page und fragment-navigation und sogar für Suchmaschinen sichtbar. Vorsicht! kann mit CSS überschrieben werden! Daher sollte dieser Code rein:

[hidden]:not(:is([hidden="until-found"])) {
  display: none !important;
}

Relevante Success Criteria

SC 2.1.1 Keyboard (Level A) – Regel 3
xxx

Links