display:none vs visibility:hidden vs text-indent:9999 How screen reader behave with each one?
refer: http://css-discuss.incutio.com/?page=ScreenreaderVisibility
display:none: will not be seen nor heard. *
visibility: hidden: will not be seen nor heard. *
text-indent: 9999: will not be seen but it will be heard.
- Most of the screen reader will not 'speak' display:none and visibility: hidden , but there are few screen readers like pwWebSpeak and HtReader which will read even these too.
What is the difference between visibility:hidden and display:none?
display:none
means that the tag in question will not appear on the page at all (although you can still interact with it through the dom). There will be no space allocated for it between the other tags.
visibility:hidden
means that unlike display:none
, the tag is not visible, but space is allocated for it on the page. The tag is rendered, it just isn't seen on the page.
For example:
test | <span style="[style-tag-value]">Appropriate style in this tag</span> | test
Replacing [style-tag-value]
with display:none
results in:
test | | test
Replacing [style-tag-value]
with visibility:hidden
results in:
test | | test
How to hide any text from sighted user and search engine but not from screen reader?
The jQuery UI CSS framework does this by positioning elements far off-screen, e.g.
.ui-helper-hidden-accessible { position: absolute; left: -99999999px; }
In HTML, how can I have text that is only accessible for screen readers (i.e. for blind people)?
As far as alt text, you are correct, that only works for images.. But you can use aria-label in place of the alt attribute for non-image elements like so:
Solutions that work
ARIA Labels ★ ★ ★ ★ ★ ★
aria-label
(not to be confused with aria-labeledby
, a related tag that instead pulls the accessible name from the text of another element) is used to add off-screen descriptive content to an element much in the way an alt=
attribute adds off-screen descriptive content to images to be used when the images are not displayable.
The difference is, aria-label
can be used on non-image elements.
<div aria-label="test A"><p aria-hidden="true">test B</p></div>
<!--
result (screenreaders): test A
result (regular): test B
-->
The addition of the aria-hidden
attribute hides the inner text.
Position + Clip + Collapse ★ ★ ★ ★
.screenreader {
position: absolute !important; /* Outside the DOM flow */
height: 1px; width: 1px; /* Nearly collapsed */
overflow: hidden;
clip: rect(1px 1px 1px 1px); /* IE 7+ only support clip without commas */
clip: rect(1px, 1px, 1px, 1px); /* All other browsers */
}
The clip is used to hide the 1px x 1px element completely, otherwise it will still be visible on the screen.
Position ★ ★ ★
.screenreader {
position: absolute;
left:-9999px;
}
<div>Wed<span class="screenreader">nesday</span>, Sept<span class="screenreader">ember</span> 24, 2014</div>
Indent ★
.screenreader {
text-indent: -5000px;
}
The actual indent value is not important as long as it's outside of the range of your pages layout. The example will move the content to the left 5,000 pixels.
This solution only works for full blocks of text. It won't work well on anchors or forms, or right-to-left languages, or specific inline-text intermixed with other text.
Will not work
visibility: hidden; and/or display:none;
These styles will hide text from all users. The text is removed from the visual flow of the page and is ignored by screen readers. Do not use this CSS if you want the content to be read by a screen reader. But DO use it for content you don't want read by screen readers.
width:0px;height:0px
As above, because an element with no height or width is removed from the flow of the page, most screen readers will ignore this content. HTML width and height may give the same result. Do not size content to 0 pixels if you want the content to be read by a screen reader.
Further:
- WebAIM Center for Persons with Disabilities
- Fangs Screen Reader Emulator for Mozilla
How to announce that a website has no screen reader support?
Screen readers work on top of the browser so there is no straightforward way (just some convoluted Flash techniques) to detect when somebody is using one.
Your best bet is to place the warning at the beginning of the content and to hide it for sighted users. This article mentions several techniques.
.hidden {
position: absolute;
left: -10000px;
top: auto;
width: 1px;
height: 1px;
overflow: hidden;
}
<div class="hidden">Sorry, this website requires JavaScript to run.</div>
Hide text using css
This is one way:
h1 {
text-indent: -9999px; /* sends the text off-screen */
background-image: url(/the_img.png); /* shows image */
height: 100px; /* be sure to set height & width */
width: 600px;
white-space: nowrap; /* because only the first line is indented */
}
h1 a {
outline: none; /* prevents dotted line when link is active */
}
Here is another way to hide the text while avoiding the huge 9999 pixel box that the browser will create:
h1 {
background-image: url(/the_img.png); /* shows image */
height: 100px; /* be sure to set height & width */
width: 600px;
/* Hide the text. */
text-indent: 100%;
white-space: nowrap;
overflow: hidden;
}
Related Topics
How to Override a Less Mixin Variable Based on a Parent's Variable
Offset Border Effect in Pure CSS
Use Linear Gradient in CSS to Split Div in 2 Colors But Not in Equal Halves
Div Height 100% and Expands to Fit Content
Html5 Vertical Spacing Issue with <Img>
What Does Unset Value Mean in CSS
Style an Ordered List with Cyrillic Letters
Does IE9 Not Support Display: Inline-Flex at All
Why Does Width/Height Work on an Inline Img Element
Ie10/11 Uses Transition:-Webkit-Transform
Why Is This Non-Float Margin Collapsing with a Float
Grid-Area Does Not Seem to Work with the Attr Function, Is This by Design
Vertically Center Image on Page and Maintain Aspect Ratio on Resize
Reverting CSS Style of <Input Type=Submit Button to Its Default Style