[ad_1]
Ich denke, es lohnt sich, alles anzuhören, was Sara Soueidan zu sagen hat. Das gilt insbesondere, wenn sie zum ersten Mal seit vier Jahren bei einer Veranstaltung spricht, wie es der Fall war, als sie die Bühne betrat bei CSS Day 2024 in Amsterdam. Was ich an Sara am meisten schätze, ist, wie sie nicht nur erklärt, Warum hinter allem, was sie präsentiert, aber sie präsentiert es auf eine Art und Weise, die bei mir ein „Aha!“ auslöst, anstatt „Oh Mist, ich mache alles falsch.“
(Oh, und Sie sollten ihren Kurs über Praktische Zugänglichkeit.)
Saras Präsentation „Das andere ‚C‘ in CSS“ war auf YouTube veröffentlicht erst letzte Woche. Es sind ungefähr 55 Minuten mit unverzichtbaren Punkten zu den verschiedenen Möglichkeiten, wie CSS die Zugänglichkeit beeinflussen kann und tut. Ich begann die Präsentation beiläufig anzusehen, öffnete aber schnell einen Ort, an dem ich mir ausführliche Notizen machen konnte, sobald ich mich selbst gefunden hatte. ooo-ing und ahhh-mitmachen.
Das sind also die Dinge, die ich aus Saras Präsentation mitgenommen habe. Sagen Sie mir Bescheid, wenn Sie auch Notizen gemacht haben, damit wir vergleichen können! Los geht’s, es gibt viel zu lernen.
Hier ist das Video
Ja, CSS beeinflusst die Zugänglichkeit
CSS ändert mehr als nur das visuelle Erscheinungsbild von Elementen, ob es uns gefällt oder nicht. Darüber hinaus wirken sich seine Auswirkungen auch auf HTML und den Zugänglichkeitsbaum (accTree) aus. Und wenn wir vom accTree sprechen, beziehen wir uns auf eine Liste von Objekten, die zugängliche Informationen über Elemente beschreiben und definieren.
Zu einem accTree-Objekt gibt es typischerweise vier Hauptinformationen:
- Rolle: was ist das für ein Ding? Die meisten HTML-Elemente werden ARIA-Rollen zugeordnet, aber nicht alle.
- Name: identifiziert das Element in der Benutzeroberfläche.
- Beschreibung: wie beschreiben wir die Sache weiter?
- Zustand: wie ist der aktuelle Stand? Sag es Bescheid!
Der Browser bietet interaktive Funktionen – beispielsweise das Aktivieren eines Kontrollkästchens, das die Informationen des Elements aktualisiert und anzeigt –, sodass der Benutzer weiß, was nach einer Interaktion geschieht.
Objekte des Zugänglichkeitsbaums können auch enthalten Eigenschaften Und Beziehungenetwa ob es Teil einer Gruppe ist oder durch ein anderes Element gekennzeichnet ist.
Beispiel: Listensemantik
CSS kann die zugängliche Rolle, den Namen, die Beschreibung eines Objekts oder sogar die Frage beeinflussen, ob es überhaupt im accTree angezeigt wird. Daher kann es die Ankündigung des Screenreaders direkt beeinflussen. Wir haben vor einiger Zeit erklärt, wie Entfernen list-style
beeinflusst die Listensemantikinsbesondere im Fall von Safari, und Sara erklärt die Feinheiten.
/* Removes list role semantics in Safari */
/* Need to add aria-role=list */
ul {
list-style: none;
}
/* Does not remove role semantics in Safari */
nav ul {
list-style: none:
}
/* Removed unless specifically re-added in the markup */
ul:where([role="list"]) {
list-style: none;
}
/* Preserves list semantics */
ul {
list-style: "";
}
display: contents
CSS kann die Präsenz eines Elements vollständig aus dem Zugänglichkeitsbaum entfernen. Ich habe einen Screenshot von einer von Saras Folien gemacht, aber es ist einfach so verdammt hilfreich, dass ich dachte, es wäre sinnvoller, die Informationen in eine Tabelle zu setzen:
Sind Sie a11y-APIs ausgesetzt? | Über Tastatur zugänglich? | Visuell zugänglich (gerendert)? | Sind Kinder a11y-APIs ausgesetzt? | |
---|---|---|---|---|
display: none |
||||
visibility: hidden |
||||
opactity: 0 Und filter: opacity(0) |
||||
clip-path: inset(100%) |
||||
position(off-canvas) |
||||
.visually-hidden |
||||
display: contents |
Der display: contents
Methode tut mehr als sie soll. Kurz gesagt, wir wissen, dass display
steuert den Typ der Box, die ein Element erzeugt. Ein Wert von none
erzeugt beispielsweise keine Box.
Der contents
Wert ist so etwas wie none
in dem nicht die Box generiert wird. Der Unterschied besteht darin, dass es keine Auswirkungen auf die untergeordneten Elemente des Elements hat. Mit anderen Worten, die Deklaration contents
entfernt das Element oder seine untergeordneten Elemente nicht aus dem accTree. Darüber hinaus gibt es einen aktuellen Fehlerbericht, der besagt, dass die Deklaration contents
in Firefox unterbricht die Verankerungswirkung eines an ein Element angehängten ID-Attributs.
Eric Bailey sagt, dass die Verwendung display: contents
gilt als schädlich. Wenn Sie es verwenden, empfiehlt es sich, es auf einen generischen Wert einzustellen.
Dinge optisch verstecken
Viele, viele von uns verwenden eine Art .visibility-hidden
Klasse als Dienstprogramm zum Ausblenden von Elementen, während Screenreader diese erkennen und den Inhalt ansagen können. TPGi bietet eine großartige Aufschlüsselung der Technik.
.visually-hidden:not(:focus):not(:active) {
width: 1px;
height: 1px;
overflow: hidden;
clip: rect(0 0 0 0); /* for IE only */
clip-path: inset(50%);
position: absolute;
white-space: nowrap;
}
Das ist sehr nah an dem, was ich persönlich in meiner Arbeit verwende, aber die beiden :not()
Anweisungen waren neu für mich und haben mich verwirrt. Sie sorgen dafür, dass der Selektor nur angewendet wird, wenn das Element weder fokussiert noch aktiviert ist.
Es ist einfach, diese Klasse auf Dinge zu klatschen, die wir verbergen möchten, und das war’s. Aber wir müssen vorsichtig sein und sie absichtlich verwenden, wenn die Situation es uns erlaubt, ein Element zu verbergen, aber dennoch anzukündigen. Wir würden dies beispielsweise nicht für interaktive Elemente verwenden wollen, da diese immer angezeigt werden sollten. Wenn Sie mit etwas interagieren, müssen wir es sehen können. Aber für allgemeine Textsachen ist alles in Ordnung. Auch Links zum Überspringen von Inhalten.
Es gibt eine Ausnahme! Wir möchten vielleicht ein animiertes Kontrollkästchen und müssen das native Steuerelement ausblenden. appearance
so dass es verborgen bleibt, auch wenn CSS es so gestaltet, dass es sichtbar ist. Wir müssen immer noch die verschiedenen Zustände des Formularsteuerelements berücksichtigen und wie es der unterstützenden Technologie mitgeteilt wird. Wenn wir beispielsweise das native Kontrollkästchen für ein benutzerdefiniertes Kontrollkästchen verbergen, indem wir es weit außerhalb des Bildschirms positionieren, wird die unterstützende Technologie es bei Fokus oder Aktivierung nicht ankündigen. Es ist besser, das Kontrollkästchen absolut über dem benutzerdefinierten Kontrollkästchen zu positionieren, um die Vorteile der interaktiven Zugänglichkeit zu nutzen.
Fazit: Fragen Sie sich, ob ein interaktives Element sichtbar wird, wenn es den Fokus erhält, wenn Sie entscheiden, ob Sie ein .visually-hidden
Dienstprogramm.
CSS und barrierefreie Namen
Der Browser folgt einem bestimmten Prozess, wenn er den zugänglichen Namen (accName) eines Elements bestimmt:
- Zunächst wird geprüft, ob
aria-labelledby
. Falls vorhanden und wenn die ID im Attribut ein gültiger Verweis auf ein Element auf der Seite ist, wird der berechnete Text des Verweiselements als zugänglicher Name des Elements verwendet. - Andernfalls prüft es, ob
aria-label
. - Andernfalls, sofern das Element nicht mit gekennzeichnet ist
role="presentation"
oderrole="none"
(d. h. das Element akzeptiert keinen accName mehr), prüft der Browser, ob das Element seinen eigenen Namen erhalten kann. Dies kann auf verschiedene Arten geschehen, unter anderem:- aus einem HTML-Element, wie zum Beispiel
alt
odertitle
(am besten auf einem; andernfalls vermeiden),
- von einem anderen Element, wie
oder
oder
- von seinem Inhalt.
- aus einem HTML-Element, wie zum Beispiel
An dieser Stelle ging Sara kurz (aber wunderbar) auf Semantik. Schaltflächen sind beschriftbare Elemente und können ihren accName erhalten, indem sie
aria-label
Attribut, ein aria-labelledby
Attribut, dessen Inhalt oder sogar ein Element.
ARIA hat Vorrang vor HTML, weshalb wir es nur dort vermeiden wollen, wo es unbedingt sein muss. Wir können die Prioritäten und Überschreibungen für zugängliche Namen in DevTools unter der Registerkarte „Zugänglichkeit“ sehen, wenn wir Elemente prüfen.
Beachten Sie jedoch: Die im Berechnungsalgorithmus von accName definierte Prioritätsreihenfolge definiert nicht die Prioritätsreihenfolge, die Sie beim Zuweisen eines accName zu Elementen einhalten sollten. Die Schritte sollten eher umgekehrt sein. Priorisieren Sie natives HTML!
CSS-generierter Inhalt
Vermeiden Sie die Verwendung von CSS, um aussagekräftige Inhalte zu erstellen. Hier ist der Grund:
CSS generated content
.info::before {
content: "ⓘ" / "Info: ";
/* or */
content: url('path-to-icon.svg') / "Info: ";
}
/* Contents: : Info: CSS generated content. */
Aber es ist noch vielschichtiger. Zum einen können wir von CSS generierten Inhalt nicht in andere Sprachen übersetzen, zumindest nicht mit automatisierten Tools. Zum anderen ist dieser Inhalt verloren, wenn CSS aus irgendeinem Grund nicht verfügbar ist. Ich dachte nicht, dass dies jemals ein allzu großes Problem darstellen würde, bis Sara mich daran erinnerte, dass einige Kontexte CSS vollständig entfernen, wie etwa der Reader-Modus von Safari (auf den ich mich praktisch jeden Tag verlasse, aber ich wünschte, ich müsste nicht).
Es gibt auch Randfälle, in denen CSS-generierte Inhalte könnte unzugänglich sein, auch in Forced Colors-Umgebungen (sprich: Farbkonflikte), oder wenn ein defektes Bild an den url()
Funktion (lies: alt
Der Text des Bildes wird nicht anstelle des defekten Bildes angezeigt, zumindest nicht in den meisten Browsern, aber er trägt trotzdem zum accName bei und verletzt SC 2.5.3 Bezeichnung im Namen). Adrian Rosellis Artikel zum Thema enthält umfassende Testergebnisse der neuen Funktion, die unterschiedliche Ergebnisse zeigen.
Inline-SVG ist wahrscheinlich besser! Aber wir können dies auch tun, um bei Symbolen, die dekorativ sein sollen, zu helfen, redundante Informationen nicht zu wiederholen. Aber es ist inkonsistent, was die Browserimplementierung betrifft (aber Sara sagt, Safari macht es richtig).
/* like:
*/
.icon {
content: url('path/to/icon.svg') / "";
}
Was können wir also tun, um unangenehme und unzugängliche Situationen bei der Verwendung von CSS-generierten Inhalten zu vermeiden?
- Vermeiden Sie die Verwendung von CSS-Pseudoelementen für aussagekräftige Inhalte – verwenden Sie HTML!
- Verstecken Sie dekorative und redundante CSS-Inhalte, indem Sie ihnen ein leeres
alt
Text (wenn Unterstützung vorhanden und das Verhalten konsistent ist).
CSS kann ein Element vollständig von seinem AccName befreien.
… wenn die Quelle des Namens so verborgen ist, dass sie aus dem Zugänglichkeitsbaum entfernt wird.
Beispielsweise kann seinen accName von einem
aber dieses Label wird von CSS so versteckt, dass es nicht für a11y-APIs verfügbar ist. Mit anderen Worten, das
wird nicht mehr gerendert und auch sein Inhalt nicht, sodass die Eingabe ohne „accName“ endet.

ABER! Pro Spezifikation:
Standardmäßig geben unterstützende Technologien keine versteckten Informationen weiter, aber ein Autor kann dies explizit außer Kraft setzen und versteckten Text als Teil des barrierefreien Namens oder der barrierefreien Beschreibung einschließen, indem er
aria-labelledby
oderaria-describedby
.
In diesem Fall können wir das Etikett wiederverwenden, auch wenn es durch Anheften versteckt ist. aria-labelledby
Wir könnten die .visually-hidden
Dienstprogramm, aber das Label ist immer noch zugänglich und wird weiterhin bekannt gegeben.

CSS macht nicht den Zustand eines Elements im accTree beeinflussen
Wenn wir eine um ein anderes Element anzuzeigen/auszublenden, beispielsweise das
Elementstatus muss diesen Status offenlegen. Inhalt beim Hovern oder Fokussieren verletzt SC 1.4.13 Dies erfordert eine Möglichkeit, den Inhalt zu schließen. Außerdem müssen Benutzer den Cursor vom Text weg bewegen können, ohne dass dieser verloren geht.
Nur-CSS-Modale, die den Kontrollkästchen-Hack verwenden, sind schrecklich, da sie den Fokus nicht einfangen, den Seiteninhalt nicht inaktiv machen und den Tastaturfokus nicht verwalten (ohne JavaScript).
Popovers, die mit der Popover-API erstellt werden, sind immer nicht modal. Wenn Sie ein modales Popover erstellen möchten, ist der richtige Weg. Ich bin verliebt in Jhey Tompkins’ Demo mit dem
popover
für eine Flyout-Navigationskomponenteso sehr, dass Ich habe es in einem anderen Artikel verwendet. Aber wenn wir Popover für modale Dinge verwenden – einschließlich so etwas wie einer Flyout-Navigation – müssen wir immer noch die zugänglichen Zustände aktualisieren.
Es gibt noch viel mehr zu beachten, von Fokusfallen bis hin zu inaktivem Inhalt. Aber wir können auch erwägen, die Popovers zu entfernen. ::backdrop
für weniger Einschränkungen, wie das Inaktivieren von Hintergrundinhalten oder das Einfangen des Fokus. Dann wieder so etwas wie ein popover
-basierte Flyout-Navigation verstößt gegen SC 2.4.12 Fokus nicht verdeckt wenn es ein anderes Element mit Fokus überdeckt oder verdeckt. Also, ja, Sichtbarkeit ist wichtig für die Benutzerfreundlichkeit, aber wir sollten eine bessere Benutzerfreundlichkeit anstreben, die darüber hinaus WCAG-Konformität. (Sara geht näher darauf ein in einem Kommentar unten.)
Also… schließen Sie die popover
wenn der Fokus nachlässt. Sara erwähnte ein Artikel, den Amit Sheen für das Smashing Magazine geschrieben hat wo es ratsam wäre, genau darauf zu achten, wie eine Änderung dem Benutzer mitgeteilt wird, wenn ein Speisekarte
ist ausgewählt, um die Farben auf der Seite zu aktualisieren. Das wirft Fragen auf bezüglich Erfolgskriterium 3.2.2 wo sich bei der Eingabe etwas ändert. Wenn der Benutzer damit interagiert, sollte er wissen, was passieren wird.
Abschließende Gedanken
Ja, lass das alles mal sacken. Es fühlt sich gut an, oder? Was ich an Saras Präsentation (oder an allen anderen) am meisten liebe, ist, dass sie mit dem Finger nicht verurteilend auf jemanden zeigt. Mir sind viele zugängliche Erfahrungen wichtig, aber ich weiß, wie viel ich nicht weiß, und es sind praktische Dinge wie diese, bei denen ich klare Verbindungen zu meiner Arbeit sehe, die mich besser machen können.
Ich habe mir noch eine weitere Notiz aus Saras Vortrag gemacht und wusste nicht so recht, wohin mit ihr, aber ich denke, die Schlussfolgerung ergibt Sinn, weil sie uns nachdrücklich daran erinnert, dass HTML, CSS und, ja, JavaScript alle einen Platz am Tisch haben und jeweils positiv zu einer barrierefreien Erfahrung beitragen können:
- Das Umgehen von JavaScript mit CSS kann zu Zugänglichkeitsbarrieren führen. JavaScript ist für diese Dinge immer noch nützlich und erforderlich. Verwenden Sie das richtige Tool für die Aufgabe.
Das „andere“ C in CSS ursprünglich veröffentlicht am CSS-TricksTeil der DigitalOcean Familie. Sie sollten Abonnieren Sie den Newsletter.
[ad_2]
Source link