a11y-rules: Übernahme aus auditmysite
Belege, Abweichungen und nicht übernommene Prüfungen je Schritt der Regelmigration aus auditmysite.
Ab 0.14.0 zogen die Regeln von auditmysite schrittweise nach a11y-rules
(casoon/barrierlab#13, auditmysite#690). Der
Changelog
nennt je Version die neuen Kennungen; hier steht je Schritt, was sie ersetzen,
worauf sie sich stützen und wo sie bewusst von auditmysite abweichen.
Jeder Abschnitt gibt den Stand des genannten Release wieder. Spätere
Änderungen an Urteil oder WCAG-Bezug, vor allem die
Normative Zuordnung in 0.26.0, stehen im
Changelog. Wo nicht anders vermerkt, setzt a11y-rules keine Obergrenze je
Seite; auditmysite meldete je Regel höchstens 5, 10 oder 20 Befunde.
Die 48 echten Seiten, auf die sich die Belege ab 0.18.0 beziehen, sind auditmysites Referenzseiten und 40 verbreitete deutsche und internationale Seiten, abgerufen am 2026-10-03.
0.14.0: ARIA (B1)
Die ARIA-Regeln aus auditmysite (casoon/barrierlab#14, B1). Norm ist WAI-ARIA 1.2 und ARIA in HTML; die Rollen- und Attributtabellen sind aus der Spezifikation erzeugt, als Bitmasken je Rolle.
Neue Kennungen
| Neue Kennung | Tier | ersetzt in auditmysite |
|---|---|---|
aria/attribute-unknown | 1 | aria-attr-name-invalid (aria_roles) |
aria/attribute-value-invalid | 1 | aria-valid-attr-value (Wertebereiche) |
aria/owns-conflict | 1 | duplicate-id-aria (parsing) |
aria/tab-selected-missing | 1 | aria-tab-selected-state, tab-no-aria-selected (widget_rules) |
aria/tabpanel-missing | 1 | aria-tablist-tabpanel (widget_rules) |
aria/combobox-popup-missing | 1 | aria-combobox-options (widget_rules) |
popover/target-missing, popover/target-invalid | 1 | modern-attribute-misuse (modern_attributes) |
inert/dialog-inert | 1 | modern-attribute-misuse (active_surface_inert) |
aria/attribute-not-allowed | 2 | aria-allowed-attr |
aria/attribute-prohibited | 2 | aria-prohibited-attr |
aria/required-parent-missing | 2 | aria-required-parent |
aria/required-children-missing | 2 | aria-roles (erforderliche Bestandteile) |
Die IDREF-Prüfung von aria-valid-attr-value übernimmt aria/reference-missing.
aria/role-invalid und aria/role-abstract gab es schon; sie ersetzen die
Rollenprüfung von aria-roles.
Kontext und Bestandteile werden am DOM geprüft, nicht am Accessibility-Tree:
Ein <li> in <ul role="tablist"> ist nach ARIA in HTML ein listitem, auch
wenn Chrome es zu generic glättet. Damit meldet der Fall aus
auditmysite#715 (ul[role=tablist] > li > a[role=tab]) wie axe
aria/required-children-missing an der Tabliste und
aria/required-parent-missing an Tabs und Einträgen. generic,
none/presentation und vom Host Ausgeblendetes sind durchlässig
(<tbody> in Chrome, auditmysite#659); aria-owns zählt als Besitz.
Abweichungen
aria/attribute-not-allowedundaria/attribute-prohibitedurteilen über die Rolle des Hosts, explizit oder implizit — auditmysite nur über expliziterole-Angaben (beiprohibitedzusätzlichdiv/span).<div aria-expanded>ist damit ein Befund. Dazu die „MUST NOT”-Fälle aus ARIA in HTML (aria-checkedan nativer Checkbox/Radio,aria-valuemin/-maxnebenmin/max,aria-placeholdernebenplaceholder,aria-disabled/-readonly/-required="false"neben dem nativen Attribut, abweichendesaria-colspan/-rowspan). Leere Werte zählen wie fehlende. Rollen außerhalb von ARIA 1.2 (browserinterne,mark) bleiben ohne Urteil.aria/attribute-value-invalidmeldetaria-currentundaria-invalidnicht: ARIA 1.2 legt fest, dass ein unbekannter Wert dort alstruegilt. Vergleich ohne Groß-/Kleinschreibung, leere Werte ohne Befund.aria/required-children-missingprüft nur Behälter mit expliziter Rolle — native Tabellen und Listen geben ihre Bestandteile per HTML vor (auditmysite#659, #674). Die leere native Tabelle aus dem Korpustable_required_rows_tbody(nur<caption>) ist deshalb kein Befund mehr. Kein Befund ohne jeden besessenen Knoten, unteraria-busy="true"und beiaria-expanded="false".aria/required-parent-missinglässt über ARIA 1.2 hinausgroupfürlistitem(ARIA 1.1),comboboxfüroptionundradiogroupfürmenuitemradiozu. Stößt der Weg nach oben auf eine Rolle, die ARIA 1.2 nicht kennt, entsteht kein Befund.aria/tab-selected-missingistREVIEW(ARIA sagt SHOULD) und steht an der Tabliste, wenn kein Tabaria-selected="true"trägt — nicht an jedem Tab ohne das Attribut; die übrigen haben mit der Vorgabefalseden richtigen Zustand.aria/tabpanel-missingistREVIEW: ARIA beschreibt das Panel nur als üblich.aria/combobox-popup-missingstützt sich auf das MUST füraria-controls(ARIA 1.2); ein Popup im Teilbaum oder peraria-owns(ARIA 1.1) genügt weiterhin.inert/dialog-inertistFAILnur für<dialog open>;role="dialog"wirdREVIEW, sichtbarerole="menu"gar nicht geprüft (ein aus dem Bild geschobenes Menü mitinertist richtig gebaut).
Nicht übernommen
Aus modern_attributes: der fehlende Name offener Dialoge und Popover (gehört
zur Namensprüfung von Dialogen) und „Fokus in einem inerten Teilbaum” (braucht
das aktive Element, das kein Tier liefert).
0.15.0: Namen (B2)
Die Namensregeln aus auditmysite (casoon/barrierlab#15, B2). Norm sind WAI-ARIA 1.2 („Accessible Name Required”), accname 1.2, HTML-AAM und WCAG 2.5.3; alle in Tier 2.
Neue Kennungen
| Neue Kennung | Schwere | ersetzt in auditmysite |
|---|---|---|
names/required-missing | hoch | aria-command-name (ohne button und a[href]), aria-input-field-name, aria-meter-name, aria-progressbar-name, aria-toggle-field-name, aria-treeitem-name (aria_naming_rules); aria-label „kein Name” (accessible_name) |
names/symbol-only | mittel | aria-label „Icon Only” (accessible_name) |
dialog/name-missing | hoch | aria-dialog-name (aria_naming_rules), dialog-name (dialog_rules) |
dialog/modal-unmarked | mittel | dialog-name „Dialog Modal” (dialog_rules) |
summary/name-missing | hoch | summary-name (summary_name) |
status/live-overridden | hoch (alert), mittel (status, log) | aria-live-region-role (status_messages) |
label-in-name/mismatch | mittel | label-content-name-mismatch (label_in_name) |
Unbenannte Buttons, Links (a[href]) und SVGs melden weiter
buttons/name-missing, links/name-missing und svg/name-missing;
names/required-missing meldet sie nicht noch einmal. Ein natives
Formularfeld ganz ohne Beschriftung meldet forms/label-missing;
names/required-missing nur, wenn eine Beschriftung behauptet wird, aber leer
ausgeht (<label for> ohne Text).
Abweichungen
names/required-missingprüftmenuundtabnicht (ARIA 1.2 verlangt dort keinen Namen) und keine native<option>(die leere Platzhalteroption eines<select>ist üblich; Chrome stellt sie nicht alsoptionaus). Unbenannte, nicht fokussierbare Elemente sind ein Verstoß wie inaria_naming_rules, nicht die Warnung ausaccessible_name.dialog/name-missingmeldet einen Fall, für den auditmysite zwei Kennungen hatte. Ein geschlossenes<dialog>(ohneopen) wird nicht geprüft.dialog/modal-unmarkedistREVIEWstatt Verstoß (ARIA verlangtaria-modalnicht; ein nicht modaler Dialog trägt es zu Recht nicht) und prüft nurrole="dialog": Ob ein natives<dialog>pershowModal()geöffnet wurde, liefert kein Tier.summary/name-missingmeldet nur die<summary>, die ihr<details>bedient, nicht zusätzlich das<details>.status/live-overriddenist ein Verstoß nur beiaria-live="off"(die Region wird dann nicht angesagt). Eine andere Dringlichkeit (alertmitpolite,statusmitassertive) istREVIEW: ARIA erlaubt das Überschreiben, angesagt wird weiterhin. Implizite Rollen zählen mit (<output>iststatus).names/symbol-onlyistREVIEWstatt Verstoß — 4.1.2 verlangt einen Namen, über seine Güte sagt es nichts. Buchstaben zählen nach Unicode.label-in-name/mismatchprüft alle Rollen mit Namen aus dem Inhalt (button,link,menuitem*,tab,checkbox,radio,switch,option,treeitem), deren Name ausaria-labeloderaria-labelledbystammt — auditmysite nurbuttonmitaria-label. Verglichen wird der berechnete Name, ohne Groß-/Kleinschreibung, Satzzeichen und Leerraum, mit Buchstaben nach Unicode. Wie in auditmysite: kein Befund, wenn der Name im sichtbaren Text steht;REVIEW, wenn der sichtbare Text mehr als doppelt so lang ist wie der Name (#513). Visuell versteckter Text (.sr-only) ist ohne Stile nicht erkennbar und zählt als sichtbar.
Nicht übernommen
Aus accessible_name: leeres aria-labelledby und aria-describedby an
einem Element, das einen Namen hat — die übrigen Namensquellen greifen, es
schadet nicht (wie schon bei aria/reference-missing). Ebenfalls noch nicht
übernommen: description-duplicates-name (auditmysite#713). Dafür bräuchte
a11y_dom::Semantics die Accessible Description, die es bisher nicht liefert.
0.16.0: Formulare (B3)
Die Formularregeln aus auditmysite (casoon/barrierlab#16, B3). Norm sind
WCAG 2.2 (1.3.1, 1.3.5, 3.2.1, 3.2.2, 3.3.1, 3.3.2, 3.3.7, 3.3.8), der
HTML-Standard („Autofill”, Formulareigentümer) und WAI-ARIA 1.2
(aria-invalid, aria-errormessage, aria-required). Kennungen: forms/*
für Felder und Formulare, context/* für den Kontextwechsel bei Fokus und
Eingabe, auth/* für die Anmeldung.
Neue Kennungen
| Neue Kennung | Tier | Urteil, Schwere | ersetzt in auditmysite |
|---|---|---|---|
forms/autocomplete-invalid | 1 | FAIL, niedrig | autocomplete-valid „Invalid autocomplete value” (input_purpose) |
forms/purpose-missing | 2 | REVIEW, mittel | autocomplete-valid „lacks autocomplete” (input_purpose), identify-purpose (identify_purpose) |
forms/error-unidentified | 1 | FAIL, mittel | input-error-message (form_rules), aria-invalid-without-describedby (error_identification) |
forms/group-missing | 1 | FAIL, mittel | form-field-group (form_rules, AX- und DOM-Teil) |
forms/group-name-missing | 2 | FAIL, mittel | label „Form group has no legend or label” (instructions) |
forms/required-unmarked | 2 | REVIEW, mittel | label „Required field not clearly indicated” (instructions), label „may not indicate required status” (form_rules) |
forms/instructions-missing | 2 | REVIEW, niedrig | label „may require format instructions” (instructions) |
forms/title-only-label | 2 | REVIEW, mittel | label-title-only (label_title_only) |
forms/no-submit | 1 | FAIL, mittel; REVIEW, niedrig ohne action und Textfeld | form-no-submit (form_rules) |
forms/redundant-entry | 1 | REVIEW, mittel | redundant-entry (redundant_entry) |
context/on-input | 1 | FAIL, mittel; REVIEW, niedrig | input-no-context-change, Inline-onchange (on_input) |
context/on-focus | 1 | REVIEW, hoch | focus-no-context-change „onfocus” (on_focus) |
context/autofocus | 1 | REVIEW, mittel | focus-no-context-change „autofocus” (on_focus) |
auth/captcha | 1 | REVIEW, mittel | accessible-auth-captcha (accessible_authentication) |
Mitgebrachte Korrekturen
Als Tests in tests/forms.rs: auditmysite#643 (Anleitung per
aria-describedby zählt gleich welchen Wortlauts; kurze Formatbegriffe nur als
ganzes Wort; ein einzelnes Kontrollkästchen ist keine Gruppe, gleichnamige im
selben Formular schon), #656 (native Datumsfelder, Zahlenfelder nur über die
Beschriftung), #658 (der Name eines Dings ist kein Personenname, auch über id
und name), #728 (Formular nur aus Schaltern: REVIEW, niedrig).
Bleibt im Host
Der Einfüge-Test an Passwort- und Einmalcode-Feldern
(accessible-auth-paste-blocked), das Nachschlagen aufgerufener Funktionen
über window und die Namensvermutung („Language”) aus on_input.
Nicht übernommen
Weil schon abgedeckt: label „no accessible label” und „Placeholder used as
only label” (instructions) sowie labels.rs check_form_control —
forms/label-missing, forms/placeholder-as-label und
names/required-missing melden dieselben Fälle, auch ARIA-Widgets ohne Namen,
leeres oder ins Leere zeigendes aria-labelledby und leeres <label for>.
Ebenso der seitenweite UNTESTED-Vermerk aus identify_purpose (1.3.6 für
Symbole und Bereiche).
Abweichungen
forms/autocomplete-invalidprüft die ganze Grammatik des HTML-Standards ([section-*] [shipping|billing] [Kontakt] Feldname [webauthn]), nicht nur das letzte Token, mit der vollständigen Liste der Feldnamen. Geprüft werdeninput(außerhidden),selectundtextarea.forms/purpose-missingistREVIEWstatt Verstoß: Ob ein Feld die Person betrifft, ist aus Beschriftung,idundnamegeraten. Ein Fall statt zwei (identify-purposemeldete dieselben Felder nachid/name, niedrig). Die Beschriftung ist der Accessible Name des Hosts;email- undtel-Felder zählen immer. Technische Adressen (ip_address) zählen nicht.forms/error-unidentifiedmeldet einen Fall, den auditmysite zweimal meldete. Als Beschreibung zählenaria-describedbyundaria-errormessagemit Text; ein Ziel außerhalb der Sicht (versteckt oder fehlend — das meldetaria/reference-missing) gilt als Beschreibung.forms/group-missingprüft auf Struktur: Als Gruppe zählen<fieldset>,<details>undrole="group"/"radiogroup"als Vorfahre.forms/required-unmarkedistREVIEWstatt Verstoß und meldet den Fall einmal (auditmysite: zweimal, niedrig und mittel): Der Screenreader sagt das Pflichtfeld an; ob es sichtbar gekennzeichnet ist, sieht nur ein Mensch.forms/title-only-labelistREVIEWstatt Verstoß:titleist eine zulässige Technik (H65). Felder mitplaceholdermeldetforms/placeholder-as-label.forms/group-name-missingmeldet keinradiogroup(das tutnames/required-missing).forms/no-submitzählt Felder und Buttons, die perform-Attribut außerhalb des Formulars stehen.context/on-inputliest nur den Handler im Markup; ruft er eine Funktion auf, bleibt esREVIEW. Neu: auch Optionsfelder mitonchange(F37).context/on-focusundcontext/autofocussindREVIEWstatt Verstoß: Ob einonfocusden Kontext wechselt, steht nicht im Markup, undautofocuswechselt ihn für sich genommen nicht. Schweregrade unverändert.
0.17.0: Landmarks, Tastatur, Struktur (B4)
Die Landmark-, Tastatur- und Strukturregeln aus auditmysite
(casoon/barrierlab#17, B4). Norm sind WAI-ARIA 1.2 (Landmark-Rollen,
aria-activedescendant), HTML-AAM (header, footer, aside, section,
form) und WCAG 2.2 (1.3.1, 2.1.1, 2.4.1, 2.4.3, 4.1.2). Alle neuen Regeln
außer headings/none sind Tier 2: Ob <form> und <section> Landmarks sind,
hängt an ihrem Accessible Name, ob ein Element interaktiv ist, an seiner Rolle.
Die Landmark-Rolle bestimmt die Regel selbst aus dem Markup, nicht aus der
Rolle des Hosts — accname und ältere Chrome-Fassungen geben einem <header>
in <main> noch banner.
Neue Kennungen
| Neue Kennung | Tier | Urteil, Schwere | ersetzt in auditmysite |
|---|---|---|---|
landmarks/not-unique | 2 | REVIEW, mittel | landmark-unique (landmark_granular) |
landmarks/not-top-level | 2 | FAIL, mittel | landmark-banner-is-top-level, landmark-contentinfo-is-top-level, landmark-main-is-top-level (landmark_granular) |
landmarks/banner-duplicate | 2 | FAIL, mittel | landmark-no-duplicate-banner (landmark_granular) |
landmarks/contentinfo-duplicate | 2 | FAIL, mittel | landmark-no-duplicate-contentinfo (landmark_granular) |
landmarks/content-outside | 2 | FAIL, mittel | region (region) |
headings/none | 1 | FAIL, mittel; REVIEW, niedrig hinter offenem Dialog | bypass „No headings found” (bypass_blocks) |
keyboard/focusable-no-role | 2 | REVIEW, niedrig | focusable-no-role (keyboard) |
keyboard/interactive-not-focusable | 2 | REVIEW, hoch | keyboard „appears not keyboard-focusable” (keyboard) |
dialog/focusable-missing | 2 | FAIL, mittel (2.4.3) | dialog-no-focusable (patterns/modal_dialog) |
patterns/accordion-controls-missing | 2 | REVIEW, niedrig | accordion-no-controls (patterns/accordion) |
Mitgebrachte Korrekturen
Als Tests in tests/landmarks.rs: auditmysite#639 (<header>/<footer> in
main, article oder unter role="main" sind keine banner/contentinfo), #642
(Sprunglink am Ziel erkannt, nicht am Text), #709 (keine Überschriften hinter
offenem Dialog: Hinweis), #727 (unbenanntes <form>/<section> ist keine
Landmark — weder für die Eindeutigkeit noch als umgebende Landmark). #638 und
#644 betreffen Tabellen und redundant-role, keine Regel dieses Schritts.
Bleibt im Host
keyboard-trap (2.1.2) — der Hinweis je modalem Dialog und der seitenweite
UNTESTED-Vermerk brauchen echte Tastaturbedienung. Aus patterns/ die
Mustererkennung und die Journeys, dazu accordion-trigger-not-button und
aria-expanded-required (siehe unten).
Nicht übernommen
accordion-trigger-not-button— an Rollen, diearia-expandednicht unterstützen, meldet das schonaria/attribute-not-allowed; an Rollen, die es unterstützen (link,menuitem,tab,treeitem, …), erlaubt WAI-ARIA 1.2 den Zustand ausdrücklich, und fehlender Fokus fällt unterkeyboard/interactive-not-focusable.aria-expanded-required— rät eine Aufklappnavigation aus dem Wort „menu”/„Menü” im Namen; sprachabhängig wie der Fehler aus #642, ohne Norm dahinter.tab-no-aria-selectedundaria-dialog-nameliefen schon alsaria/tab-selected-missingunddialog/name-missing(B1, B2), fehlende main- und banner-Landmark sowie doppelte main schon alslandmarks/main-missing,landmarks/banner-missingundlandmarks/main-duplicate(B0).
Abweichungen
landmarks/not-uniqueistREVIEWstatt Verstoß: WAI-ARIA 1.2 und die APG verlangen unterscheidbare Namen nur als SHOULD, WCAG 1.3.1 setzt keine an Landmarks voraus. Wie in auditmysite zählen gleich benannte und gleich unbenannte Landmarks; mehreremain,bannerodercontentinfomelden also zusätzlich zu ihrem Duplikatbefund.<aside>inarticle,aside,navodersectionist nur mit Namencomplementary(HTML-AAM).landmarks/banner-duplicateundlandmarks/contentinfo-duplicatezeigen wielandmarks/main-duplicateauf die zweite Landmark, auditmysite auf die erste.landmarks/content-outsidemeldet das äußerste Element ohne Landmark darin, einmal je Block (wie axeregion), nicht jeden Textknoten und jedes benannte Element einzeln. Steht Text unmittelbar neben einer Landmark, trägt der umgebende Container den Befund. Die Befundzahl je Seite sinkt damit.keyboard/focusable-no-rolezählt nur die Tabfolge (tabindex≥ 0):tabindex="-1", etwa am Ziel eines Sprunglinks, erreicht niemand per Tab. Ein benannter Bereich (region) mittabindex="0"ist das empfohlene Muster für scrollbare Bereiche und zählt nicht.keyboard/interactive-not-focusablenimmt deaktivierte Felder, native<option>(Chrome führt sie nicht alsoption), Elemente unteraria-activedescendantund Inertes aus. Fokussierbar heißt wie Chromefocusable: nativ oder mit irgendeinemtabindex, auch-1(Tabs mit rovingemtabindex).dialog/focusable-missingsucht in allen Nachfahren, auditmysite nur in den direkten Kindern. Ein geschlossenes<dialog>zählt nicht.patterns/accordion-controls-missingistREVIEWstatt Verstoß: WAI-ARIA 1.2 verlangtaria-controlsam Button nicht, die APG nennt es beim Disclosure-Muster optional. Ausgenommen wie in auditmysite: zugeklappte Buttons,<summary>und Buttons innavigation/banner.headings/nonezählt auchrole="heading"; versteckte Überschriften zählen nicht.
0.18.0: Links und Zeiger (B5)
Die Links- und Zeigerregeln aus auditmysite (casoon/barrierlab#18, B5). Norm
sind WCAG 2.2 (2.1.1, 2.4.8, 4.1.2), der HTML-Standard (<a> ohne href ist
ein Platzhalter, kein Link) und WAI-ARIA 1.2 (aria-current). Alle drei
Regeln sind Tier 1: Sie lesen nur Attribute.
Neue Kennungen
| Neue Kennung | Tier | Urteil, Schwere | ersetzt in auditmysite |
|---|---|---|---|
keyboard/click-handler-not-focusable | 1 | FAIL, hoch (2.1.1) | click-events-have-key-events (click_handlers) |
links/used-as-button | 1 | FAIL, niedrig (4.1.2) | link-as-button (fake_navigation_link) |
navigation/location-missing | 1 | REVIEW, niedrig (2.4.8, AAA) | location (location) |
Belege
Der auditmysite-Korpus (keyboard_and_targets, audit_exclude_cap) und die 48
echten Seiten. Dort fand links/used-as-button den Aufruf der
Consent-Einstellungen (<a href="#" onclick="UC_UI_recall();">, wetter.com)
und einen Neu-laden-Link (craigslist.org),
keyboard/click-handler-not-focusable nichts — wetter.com hängt Handler über
data-onclick an, das kein Handler ist. navigation/location-missing meldet
auf 30 der 48 Seiten, fast alle davon Startseiten; daher REVIEW.
Nicht übernommen
pointer_cancellation (2.5.2): Der statische Teil sucht onmousedown und
ontouchstart an Bedienelementen. Auf keiner der 48 Seiten und in keinem
Korpusfall kam das vor — ohne Beleg kommt die Regel nicht hinein. Der
seitenweite UNTESTED-Vermerk gehört zur manuellen Checkliste
(casoon/barrierlab#39).
Abweichungen
<a onclick>ohnehrefmeldetkeyboard/click-handler-not-focusable, nichtlinks/used-as-button: Ohnehrefist das Element kein Link, wird nicht als Link angesagt und ist nicht fokussierbar. auditmysite meldet es als Scheinlink.navigation/location-missingistREVIEWstatt Verstoß: 2.4.8 lässt sich auch mit Titel, Überschriften oder einer Sitemap erfüllen.aria-current="true"zählt wie in auditmysite nicht als Ortsangabe — auf t-online.de markiert es Karussellpunkte.
0.18.0: Bilder und Medien (B6)
Die Bild- und Medienregeln aus auditmysite (casoon/barrierlab#19, B6). Norm
sind WCAG 2.2 (1.1.1, 1.4.2, 2.4.1, 4.1.2) und der HTML-Standard (<area>,
<input type="image">, <object>, ismap, <iframe>). Fünf Regeln lesen
nur Attribute und Text und sind Tier 1; frames/name-missing braucht die
Namensberechnung (aria-labelledby) und ist Tier 2.
Neue Kennungen
| Neue Kennung | Tier | Urteil, Schwere | ersetzt in auditmysite |
|---|---|---|---|
images/area-alt-missing | 1 | FAIL, hoch (1.1.1) | area-alt (image_input_rules) |
images/input-alt-missing | 1 | FAIL, hoch (1.1.1) | input-image-alt (image_input_rules) |
objects/alt-missing | 1 | FAIL, hoch (1.1.1) | object-alt (image_input_rules) |
images/server-side-map | 1 | FAIL, mittel (1.1.1) | server-side-image-map (server_side_image_map) |
media/audio-autoplay | 1 | REVIEW, mittel (1.4.2) | background-audio (background_audio) |
frames/name-missing | 2 | FAIL, hoch (2.4.1, 4.1.2) | frame-title (media_rules) |
Belege
Der auditmysite-Korpus (misc_content_checks, forms_and_misc,
object_no_alt, media_and_visual, frame_missing_title) und die 48 echten
Seiten. Dort meldet nur frames/name-missing: die drei Sportdaten-Rahmen auf
n-tv.de mit title="". Den Sportdaten-Rahmen auf spiegel.de (ohne title)
setzt Alpine erst im Browser aus einem <template> ein; er steht als Fall in
den Tests. <area>, <input type="image">, <object>, ismap und
<audio autoplay> kommen auf keiner der 48 Seiten vor — die Belege dafür sind
die Korpusfälle.
Die Plattformliste für manual/media-alternatives (YouTube, Vimeo,
Dailymotion, Wistia) stammt aus auditmysites video-caption. Ob ein solches
Video Untertitel hat, steuert der Player der Plattform. Beleg: das
YouTube-Video auf w3.org/WAI, das bisher keinen Checklistenpunkt auslöste.
Nicht übernommen
media-alt(media_alternative, 1.2.8): meldet auf jeder Seite einenUNTESTED-Hinweis, auch ohne Medien. Wo Medien sind, sagtmanual/media-alternativesdasselbe (Transkript, Audiodeskription); ohne Medien gibt es nichts zu prüfen. Hosts bildenmedia-altaufmanual/media-alternativesab.video-caption(media_rules, 1.2.2): ohne geprüfte Untertiteldatei bleibt es beimUNTESTED-Hinweis, und den gibtmanual/media-alternatives. Ob eine<track>-Datei tatsächlich lädt, prüft nur der Host über das Netz; dieser Teil bleibt in auditmysite, ebensoframe-tested(ob ein Rahmen fremd ist, weiß nur der Browser).role="application"ohne Namen (media_rules): kein Beleg — weder im Korpus noch auf den 48 Seiten ein unbenanntes.role="img"ohne Namen (media_rules): SVGs decktsvg/name-missing,<img>decktimages/alt-missing; ein unbenanntes anderes Element mitrole="img"kommt weder im Korpus noch auf den 48 Seiten vor.- Benanntes dekoratives Element (
media_rules):aria-labelanrole="presentation"/"none"meldet schonaria/attribute-prohibited. Die einzigen Fälle auf den 48 Seiten (wikipedia.org,titleanrole="presentation") tragenaria-hidden="true"und stehen nicht im Accessibility-Tree. <embed>ausobject-alt: kein Beleg.
Abweichungen
aria-labelledbyzählt an<area>,<input type="image">und<object>als Alternative,aria-labelauch an<area>. auditmysite kennt an<area>nuraltund sonst nuraria-label.media/audio-autoplayistREVIEWund führt 1.4.2 statt 1.4.7: Ob der Ton länger als drei Sekunden läuft und sich anhalten lässt, steht nicht im Markup; selbststartender Ton ist Gegenstand von 1.4.2 (Audio Control), 1.4.7 betrifft Hintergrundgeräusche unter Sprache.frames/name-missingführt 2.4.1 und 4.1.2 (Technik H64), auditmysite nur 2.4.1. Ohne berechnete Stile gilt ein Rahmen mit Inline-display: noneals unsichtbar (craigslist.org), dazu wie in auditmysite einer mit Breite und Höhe 0 oder 1 (duckduckgo.com). Mit Stilen (Tier 3) nimmt die Sicht versteckte Rahmen ohnehin heraus; die Prüfung auf ≤ 1 px gerenderte Größe bleibt beim Host.
0.18.0: Darstellungskonvention (#22)
Die statischen Regeln der Darstellungskonvention (casoon/barrierlab#22,
Entwurf v0): figure[data-viz] mit Text-, Standbild- und Live-Schicht,
html[data-display] mit Umschalter. Die Konvention steht auf der Seite
Darstellungsmodi.
Entscheidung zum Paket: a11y-rules, nicht web-checks. Die Regeln
brauchen den DOM — Vorfahren, Nachfahren, Verweise per aria-describedby —
und lesen dabei nur Attribute und Struktur; alle sieben sind Tier 1 (Modul
viz). Sie melden nur auf Seiten, die die Konvention benutzen, tragen das
Schlagwort best-practice und hängen wie in auditmysite am nächsten
WCAG-Kriterium. Die Kennungen display/* sind dieselben wie in auditmysite
(src/wcag/rules/display_modes.rs); der dort gemessene Teil (berechnete
Sichtbarkeit, Zeitpunkt von data-display, Textmodus) bleibt dort.
Neue Kennungen
| Neue Kennung | Tier | Urteil, Schwere | in auditmysite |
|---|---|---|---|
viz/text-missing | 1 | FAIL, hoch (1.1.1) | — (display/text-not-visible misst den Textmodus) |
display/text-hidden | 1 | FAIL, hoch; REVIEW, niedrig bei Verweis per aria-describedby/aria-details (1.1.1) | display/text-hidden, Attribut-Teil |
viz/caption-missing | 1 | FAIL, niedrig (1.1.1) | — |
viz/static-missing | 1 | FAIL, mittel (2.2.2) | — |
viz/table-missing | 1 | REVIEW, niedrig (1.3.1) | — |
display/toggle-missing | 1 | FAIL, mittel (2.2.2) | display/toggle-missing, statischer Teil |
display/init-missing | 1 | REVIEW, niedrig (2.2.2) | display/init-missing, statischer Teil |
Belege
Die gebauten Seiten der Referenzumsetzung Geographia (371 Seiten,
web-geographia/apps/*/dist, Stand 2026-10-03). viz/text-missing meldet
die Startseite, die ihre Diagramme in .viz-desc ohne [data-viz-text]
beschreibt, und „Build Earth 2.0” (space/solar-system/settlement/), das
auch viz/static-missing auslöst; viz/caption-missing die Klima-Monitor-
und Deutschlandkarten ohne <figcaption>; display/toggle-missing die
Laborseiten ohne Kopfzeile; viz/table-missing 196 Diagramme, vor allem
Sparklines. display/text-hidden folgt dem Fall aus auditmysite#704
(div#layers-home-desc auf geographia.eu/atmosphere/) samt den dort
festgehaltenen Testfällen; im heutigen Build blendet Geographia nur visuell
aus. display/init-missing meldet dort nichts. Auf den 48 echten Seiten ohne
Konvention meldet keine der sieben Regeln.
Grenzen und nicht übernommen
- Die Kernaussage wird nur auf „nicht leer” geprüft, nicht auf Qualität.
viz/orphan-mediaaus dem Entwurf (canvas,video,svg[role=img]außerhalb der Konvention) ist nicht aufgenommen: In Geographia steht jedes solche Medium in[data-viz]oder unteraria-hidden, ein echter Positivfall fehlt.display/init-missingkann nur die Abwesenheit feststellen; ob ein vorhandenes Skript den Modus setzt, zeigt erst die laufende Seite.
Abweichungen
viz/*gibt es in auditmysite nicht; dort prüftdisplay/text-not-visibleden Text erst im gerenderten Textmodus.- Ist die
figureselbst perhiddenausgeblendet, meldetdisplay/text-hiddennichts (wie auditmysite#725);aria-hiddenoderinertan derfiguredagegen bleiben ein Befund, weil die Grafik dann sichtbar ist.
0.18.0: Tabellen, Dokument, Sprache, Rollen (B7)
Die Tabellen-, Dokument-, Sprach- und Rollenregeln aus auditmysite
(casoon/barrierlab#20, B7). Norm sind WCAG 2.2 (1.3.1, 1.4.13, 2.2.1,
2.4.10, 3.1.1, 3.1.2, 3.1.4, 4.1.2), der HTML-Standard (headers,
lang/xml:lang, „shared declarative refresh steps”), ARIA in HTML
(überflüssige Rollen) und WAI-ARIA 1.2. Alle Regeln sind Tier 1: Sie lesen
Tags, Attribute und Text.
Neue Kennungen
| Neue Kennung | Tier | Urteil, Schwere | ersetzt in auditmysite |
|---|---|---|---|
tables/header-without-data | 1 | FAIL, hoch (1.3.1) | th-has-data-cells (table_extended) |
tables/data-undetermined | 1 | UNTESTED, hoch (1.3.1) | th-has-data-cells, incomplete (table_extended) |
tables/headers-attr-invalid | 1 | FAIL, hoch (1.3.1) | td-headers-attr (table_extended) |
document/lang-mismatch | 1 | FAIL, mittel (3.1.1) | html-xml-lang-mismatch (language_extended) |
language/part-unmarked | 1 | REVIEW, mittel (3.1.2) | language-of-parts (language_of_parts) |
language/part-undetermined | 1 | UNTESTED, mittel (3.1.2) | — (auditmysite schweigt auf anderen Sprachen) |
language/abbreviation-unexpanded | 1 | REVIEW, niedrig (3.1.4, AAA) | abbreviations (abbreviations) |
timing/meta-refresh | 1 | FAIL, hoch (2.2.1) | meta-refresh (timing_adjustable) |
headings/section-without-heading | 1 | REVIEW, niedrig (2.4.10, AAA) | heading-order (section_headings, Abschnittszählung) |
aria/role-redundant | 1 | FAIL, niedrig (4.1.2) | redundant-role (redundant_role) |
names/title-only | 1 | REVIEW, mittel (4.1.2) | title-only-description (content_on_hover) |
patterns/tooltip-unreferenced | 1 | FAIL, niedrig (1.4.13) | content-on-hover-focus (content_on_hover) |
Belege
Der auditmysite-Korpus und die 48 echten Seiten. Treffer dort:
aria/role-redundant: 251 Befunde auf 5 Seiten — wetter.com 188 (li[role=menuitem] > a[href][role=link]), lidl.de 39 und sparkasse.de 16 (a[href][role=link]), bahn.de und spiegel.de je 4 (button[role=button]als Akkordeon-Auslöser). Dazu Korpusredundant_role_list_style.names/title-only: 200 Befunde auf 10 Seiten — spiegel.de 163 (Teaser-Links um ein Bild mit leeremalt), focus.de 16 (Symbol-Links), bahn.de 7 (Suchknöpfe), dazu heise.de, tagesschau.de, faz.net, sueddeutsche.de, check24.de, zeit.de und basf.com. Dazu Korpusname_description_best_practice.headings/section-without-heading: ein Hinweis auf 7 Seiten, fast nur Teaser-Karten als<article>(t-online.de 61, faz.net 39, bild.de 25, check24.de 20, basf.com 15, web.de 4, spiegel.de 1).- Auf keiner der 48 Seiten, belegt im Korpus:
tables/header-without-data(table_headers_no_data,table_grid_rows_unrendered),tables/headers-attr-invalid(forms_extended),document/lang-mismatchundlanguage/abbreviation-unexpanded(misc_content_checks),language/part-unmarked(text_and_layout),timing/meta-refresh(meta_refresh_present),patterns/tooltip-unreferenced(forms_and_misc). Der einzige Treffer vonlanguage/part-unmarkedauf echten Seiten war ein Fehlalarm und ist behoben (eingebettetes CSS, siehe Abweichungen).
Mitgebrachte Korrekturen
Aus auditmysite, je als Test:
- auditmysite#638: leere Datenzellen, Zellen mit
aria-hidden-Kind und ein Spaltenkopf über Zeilenköpfen sind kein „Kopf ohne Daten” (korpus_table_headers_tbody_ignored_issue_638,spaltenkopf_ueber_zeilenkoepfen_barrierlab_eu_issue_638). - auditmysite#639: die Tabelle im Kapitel mit
<header>im Artikel (tabelle_im_kapitel_geographia_issue_639; der Landmark-Teil steht seit B4 intests/landmarks.rs). - auditmysite#654: Ein noch nicht dargestellter Zeilenvorrat ist
tables/data-undetermined, nichtFAIL(korpus_table_grid_rows_unrendered_issue_654,native_tabelle_mit_koerper_issue_654). - auditmysite#659:
tbody > trmit Zeilenkopf und Datenzelle (korpus_table_required_rows_tbody_issue_659; die Rollenregel steht seit B1 intests/aria.rs). - auditmysite#644:
role="list"auf<ul>/<ol>wird nicht gemeldet (korpus_redundant_role_list_style_issue_644).
Nicht übernommen
presentation-semantic-children(info_relationships): Nach WAI-ARIA 1.2 nimmtrole="presentation"/"none"nur dem Element selbst die Semantik; Nachfahren behalten ihre, außer den erforderlichen Bestandteilen von Tabellen und Listen. Den Tabellenfall meldet schontables/presentational-with-headers, F92 betrifft das Element selbst. Auf den 48 Seiten hätte die Regel 187<li role="none">um Menülinks gemeldet (t-online.de: das APG-Muster Menüleiste) — durchweg Fehlalarme.section_headings, Lücken in der Gliederung: meldet schonheadings/skip-level.section_headings, „mehr als 10 Absätze, weniger als 3 Überschriften”: kein Beleg — auf keiner der 48 Seiten, in keinem Korpusfall.timing_adjustable: Der seitenweiteUNTESTED-Vermerk für Skript-Fristen undtimeouts(2.2.6) gehören zur Checkliste (manual/timing).redundant_rolefür<ul>/<ol>mitrole="list": Ob die Rolle überflüssig ist, hängt am berechnetenlist-style-type(auditmysite#644), undComputedStyleina11y-domhatte dieses Feld in 0.18.0 nicht. Bis es das gab, wurde das Paar nicht geprüft statt geraten;aria/role-redundantsagt über Listen nichts aus. auditmysite meldeteol#numbered-listim Korpus mit Stil weiterhin selbst, bisa11y-domdas Feld lieferte (seit 0.20.0, siehe unten).
Abweichungen
tables/data-undeterminederkennt ausstehende Zeilen an einer Zeilengruppe ohne Zeile in der Sicht — auch am leeren<tbody>im Markup, das auf seine Daten wartet. Ist die ganze Zeilengruppe ausgeblendet, fehlt sie in der Sicht, und die Kopfzellen meldenFAIL.tables/headers-attr-invalidprüft nur Zellen (td,thund ihre Rollen); nur dort definiert HTML das Attribut.language/part-unmarkedmeldet den innersten Textblock (<li><p>einmal), lässt<script>,<style>und<template>aus — auf sparkasse.de las sich das eingebettete CSS sonst als Englisch — und meldet auf Seiten, die weder Deutsch noch Englisch sind,language/part-undeterminedstatt nichts.language/abbreviation-unexpandedistREVIEWstatt Verstoß: 3.1.4 lässt sich auch mit der Ausschreibung im Text oder einem Glossar erfüllen. Ein leerestitlezählt als fehlend.timing/meta-refreshmeldet0s nicht: Eine sofortige Weiterleitung ist keine Frist (H76, axemeta-refresh); web.de und gmx.net leiten so ohne JavaScript weiter. Eine Anweisung ohne Ziffern führt der Browser nicht aus.headings/section-without-headingzählt Artikel und benannte Abschnitte ohne eigene Überschrift, ohne Navigationen, statt alle Abschnitte gegen alle Überschriften der Seite;REVIEWstatt Verstoß.aria/role-redundantmeldet<li role="listitem">nur in einer Liste ohne eigene Rolle: Inul[role=list]gehört es zur selben WebKit-Abhilfe (lidl.de).names/title-onlyistREVIEWstatt Verstoß, wieforms/title-only-label:titleist eine gültige Namensquelle (H65). Textfelder meldetforms/title-only-label;submitundresethaben einen Vorgabenamen.patterns/tooltip-unreferencedlässt nebenaria-describedbyaucharia-labelledbyals Verweis gelten.
0.19.0: Stylesheets (#21, erster Teil)
Die Regeln über Stylesheets aus auditmysite (casoon/barrierlab#21, erster
Teil). Dort las JavaScript document.styleSheets; hier kommen die Sheets als
Text herein, geparst vom Paket stylesheet-parse. Norm sind WCAG 2.2 (1.3.4,
1.4.8, 2.3.3, 2.4.7), CSS Syntax Level 3 und Selectors Level 4.
Neue Kennungen
| Neue Kennung | Urteil, Schwere | ersetzt in auditmysite |
|---|---|---|
focus/outline-removed | FAIL, hoch (2.4.7) | focus-visible-outline-none (focus_visible_css) |
motion/reduced-motion-ignored | REVIEW, mittel (2.3.3, AAA) | prefers-reduced-motion (reduced_motion) |
orientation/content-hidden | REVIEW, mittel; hoch für html/body/main (1.3.4) | css-orientation-lock (orientation), Stylesheet-Teil |
text/justified | REVIEW, niedrig (1.4.8, AAA) | visual-presentation (visual_presentation), Blocksatz |
text/line-height-tight | REVIEW, niedrig (1.4.8, AAA) | visual-presentation, Zeilenabstand |
Der Selektor-Abgleich gegen das Dokument (Teilmenge von Selectors Level 4,
dreiwertig: Treffer, kein Treffer, unbekannt) sorgt dafür, dass nur zählt,
was auf der Seite vorkommt — wie querySelectorAll in auditmysite (#712).
Belege
Der auditmysite-Korpus (media_and_motion, reduced_motion_transform,
reduced_motion_override, text_and_layout) und die Stylesheets der 48
echten Seiten (337 Sheets, 24 MB, Abruf 2026-10-03). Auf ihnen meldet
motion/reduced-motion-ignored 30 Seiten, text/line-height-tight 21 (etwa
gov.uk mit 1,32 im Fließtext), focus/outline-removed,
orientation/content-hidden und text/justified keine.
Abweichungen
focus/outline-removed: Ein in einer:focus-Regel wieder gesetzter Rahmen zählt als Ersatz. sueddeutsche.de entfernt ihn für alle und setzt ihn für die Tastatur wieder ([data-whatintent='keyboard'] *:focus); auditmysite meldete das als Verstoß.orientation/content-hiddenistREVIEWstatt Verstoß und meldet nur Selektoren, die ein Element der Seite treffen, ohne Pseudo-Elemente. In auditmysites Form schlug die Regel auf vier der 48 Seiten an: zweimal Breakpoint-Marker (body:before, zwei Seiten von bundesregierung.de), ein Schließknopf (n-tv.de) und welt.de. Der echte Fall, ein Dialog, der im Querformat „bitte drehen” zeigt (welt.de), ist erst mit geöffnetem Dialog im Dokument. Die Prüfung vontransform: rotateam berechneten Stil vonbody/htmlbleibt beim Host.text/*: Gemessen wird an den<p>der Seite, nicht an Selektoren, die mitbody,p,div… beginnen. Sonst meldetehtml { line-height: 1.15 }aus normalize.css jede Seite. Zeilenhöhe nur ohne Einheit, inemoder%.REVIEWstatt Verstoß; derUNTESTED-Vermerk für Farbwahl und Spaltenbreite gehört zur Checkliste.motion/reduced-motion-ignored: eine Meldung je Seite wie in auditmysite, aberREVIEWstatt Verstoß. Eine allein stehendetransition-durationist kein Übergang (Tailwind.duration-200).
Danach noch offen
list-style-type (für redundant_role an Listen), Linkfarbe gegen Textfarbe
(use_of_color), Scroll-Ausmaße (scrollable_region) und
non_text_contrast_css. Sie brauchten neue Felder in ComputedStyle/Layout,
die erst ein Host-Lauf gefüllt sehen musste (auditmysite#698). Die ersten drei
kamen mit 0.20.0, non_text_contrast_css mit 0.23.0.
0.20.0: Darstellungswerte (#21, zweiter Teil)
Der zweite Teil von casoon/barrierlab#21: drei Regeln aus auditmysite, die
gemessene Darstellungswerte brauchen. Norm sind WCAG 2.2 (1.4.1, 2.1.1,
4.1.2) und ARIA in HTML. Alle drei sind Tier 3 und urteilen mit FAIL —
was sie lesen, ist gemessen, nicht vermutet. Liefert der Host ein Feld nicht,
steht je Regel und Seite ein UNTESTED im Bericht, kein stiller Nicht-Befund.
Neue Kennungen
| Neue Kennung | Urteil, Schwere | braucht | ersetzt in auditmysite |
|---|---|---|---|
lists/role-redundant | FAIL, niedrig (4.1.2) | ComputedStyle::list_style_type | redundant-role für <ul>/<ol> (redundant_role) |
color/link-indistinct | FAIL, mittel (1.4.1) | text_decoration_line, font_style, font_family, border_bottom_style | link-in-text-block (use_of_color) |
keyboard/scrollable-region-not-focusable | FAIL, hoch (2.1.1) | Rendering::scroll_overflow_px | scrollable-region-focusable (scrollable_region) |
Belege
Belege und mitgebrachte Korrekturen aus dem auditmysite-Korpus
(tests/darstellung.rs): redundant_role_list_style (#644: role="list"
bei list-style: none ist nicht überflüssig), link_in_text_block_context
(#710: nur Links im Fließtext; Navigation, Logo, Listen aus nur einem Link
und Fußzeilen mit Trennern zählen nicht), scrollable_region_focusable
(#717: gov.si div.menus; Bereich mit tabindex, mit Link darin, mit
overflow: hidden oder ohne Überhang bestehen; Puffer 13 px wie axe).
Die neuen Felder hat auditmysite (casoon/auditmysite#698) vor dem Release gegen den unveröffentlichten Stand gefüllt gesehen: auf gov.uk, bundesregierung.de, wetter.com, n-tv.de und spiegel.de jeweils an allen dargestellten Elementen, Farben und Hintergrund dort etwas seltener (Verlauf, Hintergrundbild, transparente Textfüllung). Die drei Korpusfälle melden wie erwartet.
Abweichungen
color/link-indistinctvergleicht wie auditmysite Unterstreichung, Gewicht, Schnitt, Schrift, Unterkante und Hintergrund mit dem Elternelement. Der Hintergrund ist hier der effektive, den der Host über die Vorfahren auflöst (ComputedStyle::background_color), nicht der eigene des Elements.keyboard/scrollable-region-not-focusableprüft nicht selbst, ob Inhalt sichtbar ist — das übernimmt die Sicht der Regel (versteckte Teilbäume fehlen darin).
0.21.0: Kontrast (#47)
Kontrast und Layout nach dem Vergleich mit auditmysites eigener
Kontrastregel (casoon/barrierlab#47, casoon/auditmysite#698).
Neue Kennungen
| Neue Kennung | Urteil, Schwere | Norm |
|---|---|---|
contrast/text-enhanced | FAIL, mittel | WCAG 1.4.6 (AAA): 7:1, bei großem Text 4,5:1 |
Gemeldet wird nur, was 1.4.3 besteht; was schon dort verfehlt, steht nicht doppelt. Beleg: die Linkfarbe von gov.uk, #1d70b8 auf Weiß, 5,17:1.
Belege
Vor dem Release hat auditmysite (casoon/auditmysite#698) die neuen Eingaben
in echten Läufen gefüllt: visually_hidden und obscured auf gov.uk,
bundesregierung.de, wetter.com, n-tv.de und spiegel.de (der Suchknopf von
gov.uk als verborgen erkannt), sampled_backdrop auf berlin.de und in den
Bild-Fixtures, die damit ihre bisherigen Urteile behalten.
- Kontrast über Bildern und Verläufen urteilt wie auditmysite vor der
Umstellung. Belege: auditmysites
tests/fixtures/image_contrast.html(dunkler Verlauf besteht, heller verfehlt, geteilter ist Hinweis). - Optisch verborgener Text: gov.uk,
button.gem-c-search__submit, „Search GOV.UK” pertext-indent: -5000pxversteckt, bisherFAIL3,91:1.
Abweichungen
- Text unter
aria-hiddenwird weiter gemessen. WCAG 1.4.3 gilt für sichtbaren Text, unabhängig vom Accessibility-Tree. auditmysite nahm ihn aus (#395).
0.22.0: Zielgrößen und Heuristiken (#698)
Die Heuristiken nach dem Vergleich mit auditmysites lokalen Regeln (casoon/auditmysite#698, Korpus und sechs echte Seiten, 2026-10-05).
Neue Kennungen
| Neue Kennung | Urteil, Schwere | Norm |
|---|---|---|
targets/size-enhanced | REVIEW, niedrig | WCAG 2.5.5 (AAA): 44 × 44 CSS-px, Ausnahmen „inline” und „Equivalent”, keine Abstandsausnahme |
Gemeldet wird nur, was targets/size nicht schon meldet.
Belege
Vor dem Release hat auditmysite die neuen Felder in echten Läufen gefüllt:
pointer_events_none (bundesregierung.de 114, spiegel.de 120, gov.uk 6,
berlin.de 2) und animating (bundesregierung.de 246, wetter.com 89,
spiegel.de 23, target_size_animation a#slow).
Korpusfälle zu targets/size: target_size_equivalent,
target_size_hidden_neighbours (#705), target_size_animation (#706). Echte
Seiten: Sprunglinks bei −99999 px und Karussellpunkte 10 × 10 px
(#slick-slide-control00) auf bundesregierung.de, 27 Teaserkarten mit
cursor: pointer ebendort (keyboard/pointer-only), 20 Teaserkarten mit
Bild- und Titellink in flex-row-reverse (order/visual-mismatch) und ein
1 × 1 px großer Sprunglink (focus/obscured) auf spiegel.de.
Abweichungen
motion/infinite-animation: Lade-Kreisel mit kurzem Durchlauf bleiben gemeldet, denn 2.2.2 gilt für Bewegung, die insgesamt länger als fünf Sekunden läuft. auditmysite zählte nur Durchläufe über fünf Sekunden.
0.23.0: Prüfhinweise und Kontrast von Bedienelementen
Checkliste
Sieben neue manual/*-Punkte für die Prüfhinweise, die auditmysite bisher
selbst erzeugte (casoon/barrierlab#39, casoon/auditmysite#722). Wie die
übrigen UNTESTED, einmal je Seite und nur mit Anlass. Bisher stand bei
auditmysite jeder dieser Hinweise auf jeder Seite, auch ohne Anlass.
| Kennung | WCAG | Anlass |
|---|---|---|
manual/pointer-gestures | 2.5.1 | draggable, Touch-/Zeiger-Handler im Markup, Karussell- und Kartenbibliotheken (swiper, slick, leaflet …) |
manual/motion-actuation | 2.5.4 | Inline-Skript mit devicemotion/deviceorientation (eigene Regel, Scope::Markup) |
manual/no-timing | 2.2.3 | Felder oder meta refresh |
manual/interruptions | 2.2.4 | Live-Region, role=alert/status/log/marquee/timer, <dialog>, meta refresh |
manual/re-authenticating | 2.2.5 | Anmeldung (Passwortfeld, Captcha) |
manual/unusual-words | 3.1.3 | Text |
manual/help | 3.3.5 | Felder |
Kontrast von Bedienelementen
contrast/control-insufficient und contrast/control-undetermined (1.4.11)
sind ein Port von auditmysites non_text_contrast_css (casoon/barrierlab#21,
casoon/auditmysite#698). Anders als dort wird kein Vergleich gegen Weiß
gezogen, wenn der Hintergrund fehlt, sondern UNTESTED gemeldet.
0.24.0: Linkzweck
Linkzweck aus auditmysite (link_purpose, link_purpose_link_only;
casoon/barrierlab#13, #18). Beide Regeln hatte auditmysite#690 auf B5
verschoben, B5 hat sie dann nicht mitgenommen. Alle Befunde sind Tier 2 und
REVIEW: Ob ein Linktext reicht, entscheidet am Ende der Zusammenhang.
Neue Kennungen
| Neue Kennung | WCAG, Schwere | ersetzt in auditmysite |
|---|---|---|
links/url-name | 2.4.4, niedrig; nur ohne Kontext | „raw URL” aus link_purpose |
links/single-character-name | 2.4.4, mittel; Ziffern ausgenommen | „single character” aus link_purpose |
links/new-window-unannounced | 3.2.5 (AAA), niedrig | „opens in new window” aus link_purpose |
links/purpose-link-only | 2.4.9 (AAA), niedrig | link-name-only (link_purpose_link_only) |
Abweichungen
links/new-window-unannouncedprüfttarget="_blank". auditmysite prüftearia-haspopupund traf den gemeinten Fall nie. G201 gehört zu 3.2.5, nicht zu 2.4.4 wie bisher in auditmysite.links/generic-namewertet den Zusammenhang aus wie auditmysite #569 (Plan 71, Technik H80).