A better solution to the bootstrap “sr-only” class.
There are numerous problems with the Bootstrap “sr-only” class.
-
First of all you will see from this discussion that a negative margin can cause issues on VoiceOver.
-
Secondly you must account for words wrapping one per line as screen readers do not read line breaks
-
Finally
clip
has been deprecated.
To fix point 1 simply don’t add a negative margin.
To fix point 2 add white-space: no-wrap
to ensure words do not end up ‘one per line’ and cause words to get smushed together.
To fix point 3 we add clip-path: inset(50%)
as this clips to a 0px square, we keep clip
as at the moment this has great coverage, clip-path
is used to future-proof your solution.
Please find below a much more robust class, as of yet I have not found a screen reader / browser combo that does not work as expected with this.
I have this class on a few different forums being tested, so far so good but if someone can find a problem with it please let me know as I will be submitting it everywhere.
.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>