Wie verstecke ich einen Text und mache ihn per Screenreader zugänglich?

Lesezeit: 7 Minuten

Ich habe einen einfachen Text, der bei einer Aktion aktualisiert wird, und ich möchte, dass dies vom Screenreader angekündigt wird. Aber ich möchte nicht, dass dieser Text auf der Webseite sichtbar ist. Ich habe es versucht display: none und visibility: hidden, aber es scheint, als ob sie für die Screenreader-Software nicht zugänglich sind. Ich habe einen Weg gefunden, dies zum Laufen zu bringen – das heißt, das Element vollständig mit einem negativen Wert von 999999 zu positionieren, wodurch es vom Bildschirm und von der Webseite ausgeblendet wird. Ich bin nicht wirklich ein Fan dieser Lösung. Gibt es einen eleganteren Weg, dies zu erreichen?

<span class="aria-invisible" aria-live="polite">5 selections have been made.</span>

.aria-invisible {
   display: none; //either of these two attributes
   visibility: hidden;
}

Wie verstecke ich einen Text und mache ihn per Screenreader
Graham Ritchie

Eine bessere Lösung für die Bootstrap-Klasse “nur SR”.

Es gibt zahlreiche Probleme mit der Bootstrap “sr-only”-Klasse.

  1. Zunächst werden Sie sehen aus dieser Diskussion dass eine negative Marge Probleme bei VoiceOver verursachen kann.

  2. Zweitens müssen Sie Rechenschaft ablegen Wörter, die pro Zeile umgebrochen werden, da Bildschirmlesegeräte Zeilenumbrüche nicht lesen

  3. Endlich clip ist veraltet.

Um Punkt 1 zu beheben, fügen Sie einfach keine negative Marge hinzu.

Um Punkt 2 zu beheben, fügen Sie hinzu white-space: no-wrap um sicherzustellen, dass Wörter nicht „eins pro Zeile“ enden und dazu führen, dass Wörter zusammengequetscht werden.

Um Punkt 3 zu beheben, fügen wir hinzu clip-path: inset(50%) Da dies auf ein 0px-Quadrat gekürzt wird, behalten wir es bei clip Da dies im Moment eine große Reichweite hat, clip-path wird verwendet, um Ihre Lösung zukunftssicher zu machen.

Bitte finden Sie unten eine viel robustere Klasse, bis jetzt habe ich noch keine Screenreader / Browser-Kombination gefunden, die damit nicht wie erwartet funktioniert.

Ich habe diese Klasse in ein paar verschiedenen Foren getestet, so weit, so gut, aber wenn jemand ein Problem damit findet, lass es mich bitte wissen, da ich sie überall einreichen werde.

.visually-hidden { 
    border: 0;
    padding: 0;
    margin: 0;
    position: absolute !important;
    height: 1px; 
    width: 1px;
    overflow: hidden;
    clip: rect(1px 1px 1px 1px); /* IE6, IE7 - a 0 height clip, off to the bottom right of the visible 1px box */
    clip: rect(1px, 1px, 1px, 1px); /*maybe deprecated but we need to support legacy browsers */
    clip-path: inset(50%); /*modern browsers, clip-path works inwards from each corner*/
    white-space: nowrap; /* added line to stop words getting smushed together (as they go onto seperate lines and some screen readers do not understand line feeds as a space */
}
<p>visible text <span class="visually-hidden">hidden text</span></p>

  • Es gibt viele Variationen dieser Klasse im Web, und Informationen sind verstreut (diese Pull-Anforderung, dieser Medium-Blogpost usw.). Es ist nicht leicht herauszufinden, warum einige Änderungen vorgenommen wurden, noch zu wissen, was Sie letztendlich verwenden sollten. Diese Antwort leistet gute Arbeit und erklärt einige häufige Änderungen (zumindest eine Erklärung für die white-space: nowrap hacken). Glaubst du, dieser Code und diese Erklärung könnten es schaffen? die Referenzseite von WebAIM?

    – Maëlan

    8. Mai 2021 um 11:56 Uhr

  • Da Sie den Rahmen entfernen möchten, der möglicherweise durch eine andere Regel hinzugefügt wurde, sollten Sie vielleicht auch Umrisse und Schatten entfernen? outline: none; box-shadow: none;

    – Maëlan

    8. Mai 2021 um 12:05 Uhr

  • Warum verwenden wir rect(1px, 1px, 1px, 1px) statt einfacher rect(0, 0, 0, 0)? Liegt es daran, dass einige Bildschirmleser versuchen, schlau zu sein und letztere besonders zu behandeln?

    – Maëlan

    8. Mai 2021 um 12:50 Uhr

  • Kein schlechter Vorschlag box-shadow, das muss ich testen (jetzt der spaßige Teil, wieder eine alte IE-Browserinstanz zu finden!). An die genaue Antwort kann ich mich nicht erinnern, aber es hatte mit Bildlaufleisten oder Fokusanzeigen und der Art und Weise zu tun, wie ein einzelnes Pixel gerendert wurde. Wenn wir also 0,0,0,0 haben, ist es oben links und Sie können es sehen, etwas, das mit der Rendering-Engine zu tun hat, bedeutet, dass Dinge von oben links gerendert werden, 1,1,1,1 ist unten rechts, Sie sehen es also nicht so, als ob es versucht hätte, etwas zu rendern, es beginnt bei 1,1 – vielleicht kann jemand eine genauere / detailliertere Erklärung geben, da es eine Weile her ist!

    – Graham Ritchie

    8. Mai 2021 um 13:02 Uhr

  • Ich denke, Sie haben gut darauf hingewiesen, warum jeder Schritt vorhanden ist, wie Sie sagten, einige der Schritte werden in einem Artikel erklärt, andere in einem anderen. Vielleicht habe ich einen Versuch, diese paar Fragen für Sie zu beantworten und daraus einen vollständigen Artikel zu machen, um dies ein für alle Mal zu klären (das typische Problem bei allem, was mit Barrierefreiheit zu tun hat – die Informationen sind da, aber an 25 verschiedenen Stellen!). Nicht sicher, ob WebAIM ihren Artikel umschreiben/bearbeiten würde, nicht vertraut damit, wie sie Inhalte schreiben/erstellen!

    – Graham Ritchie

    8. Mai 2021 um 13:04 Uhr


Ich hatte dieses Problem in der Vergangenheit. Bootstrap hat diese süße Klasse sr-only die eigentlich den Inhalt auf der Webseite verbirgt, aber für die Screenreader zugänglich ist. Sie können dies überprüfen Verknüpfung

Wenn Sie Bootstrap nicht verwenden, können Sie die Klasse außerdem einfach selbst in Ihren Code implementieren.

.aria-invisible {
      border: 0; 
      clip: rect(0 0 0 0); 
      height: 1px;  
      margin: -1px;
      overflow: hidden;
      padding: 0;
      position: absolute;
      width: 1px;
    }
<span class="aria-invisible">5 selections have been made. </span>

Ich hoffe das hilft.

  • Fantastisch. Vielen Dank für Ihre schnelle Antwort. Ich versuche schon seit einiger Zeit diese Lösung zu finden. Es funktioniert einfach 🙂

    – Donut

    30. Mai 2020 um 18:47 Uhr

Verwenden aria-label Attribute ist der Weg zu tun (Beispiel unten)

Gibt es einen eleganteren Weg, dies zu erreichen?

Blenden Sie das Element nicht aus. Jawohl. Ich beantworte Ihre Frage nicht, aber ich spreche das Problem an.

Screenreader sind nur ein Teil der Hilfstechnologien, die von einem kleinen Teil der Menschen verwendet werden, auf die die Richtlinien zur Barrierefreiheit abzielen.

Stellen Sie sich vor, Sie verwenden beispielsweise eine Bildschirmlupe, wenn Sie keine globale Ansicht auf dem gesamten Bildschirm haben. Stellen Sie sich vor, Sie haben einige kognitive Behinderungen, die es Ihnen erschweren, Elemente zu zählen oder sich daran zu erinnern.

Wenn Sie der Meinung sind, dass eine Information für blinde Menschen wichtig ist, dann ist sie es sicherlich für sie UND für andere Menschen.

Anstelle eines langen Textes kann es nun auch ein kleiner Zähler mit entsprechender Arienbeschriftung sein:

<div role="status" aria-live="polite" aria-label="5 selections have been made.">
  5 selections
</div>

  • Ich bin mir fast sicher, dass ein Bereich als markiert ist aria-live liest nur den Inhalt und ignoriert ihn aria-label Updates (Ich habe es in meiner Firmenanleitung, sie nicht zusammen zu verwenden, aber ich habe keinen Link zu einer Geige gesetzt, also kann ich mich nicht erinnern, warum, aber ich schreibe solche Sachen nur, wenn es einen Grund gibt!). Sie müssten hier wahrscheinlich immer noch visuell versteckten Text verwenden. Ich stimme der Meinung zu, dass die Informationen für alle nützlich sind und wahrscheinlich auch visuell verfügbar sein sollten!

    – Graham Ritchie

    31. Mai 2020 um 8:56 Uhr

  • vielleicht zwicken das beispiel zu haben 5 selections <span class="visually-hidden"> have been made</span> und entfernen Sie die aria-labelgebe dann +1, da dies eine gute Anleitung ist.

    – Graham Ritchie

    31. Mai 2020 um 8:59 Uhr

  • @GrahamRitchie aria-live ist ein generisches Attribut ohne implizite standardmäßige ARIA-Rollensemantik. Sie müssen also explizit eine Rolle festlegen, die “Name von: Autor” wie die unterstützt Rolle “Status”. was auch “Name von: Inhalten” nicht unterstützt, was dies impliziert aria-label ist hier Pflicht.

    – Adam

    31. Mai 2020 um 20:54 Uhr

  • (und dass jeglicher Inhalt darin ignoriert werden sollte)

    – Adam

    31. Mai 2020 um 20:59 Uhr

  • wenn du ein hinzufügst aria-label Sie könnten zwar Recht haben, der Inhalt wird ignoriert, aber die aktualisieren auf diesem Etikett wird ebenfalls ignoriert und Ihr gerendert aria-live Bereich sinnlos. Ich habe versucht, die offiziellen Dokumente dazu zu finden und bin gescheitert, aber ich habe diese Antwort auf SO gefunden, die das Verhalten stackoverflow.com/a/52432767/2702894 erwähnt. Du könntest die verwenden aria-label auf einem Absatz innerhalb der aria-live region, aber die Verwendung als Attribut für die Region selbst bedeutet, dass sie nicht angesagt wird. role="status" automatisch eingestellt aria-live="polite" Es liest also tatsächlich Inhalte.

    – Graham Ritchie

    1. Juni 2020 um 7:29 Uhr

924890cookie-checkWie verstecke ich einen Text und mache ihn per Screenreader zugänglich?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy