Ocultar y mostrar elementos a los lectores de pantalla
Tags: accesibility, screenreaders, frontend, webdev
Published: 2023-05-30 10:46:41

[English version](https://dev.to/miasalazar/hide-and-show-elements-from-screen-readers-15md)

A la hora de desarrollar muchas veces ocultamos o mostramos elementos sin tener en cuenta a los lectores de pantalla. En algunos casos, cuando escondemos un componente deseamos que los screen readers tampoco puedan visualizarlos; en otros sí queremos que puedan verlos; y en otras circunstancias deseamos no mostrarlos solamente a ellos.

Para conseguir que la experiencia de usuario sea igual de placentera para todas las personas, y garantizar un uso universal de la web, en este artículo voy a enumerar las diferentes maneras de esconder y visualizar componentes.

#CSS

Para comenzar, vamos a hablar de diferentes propiedades de Hojas de Estilo en Cascada, su comportamiento en los navegadores y, por último, cómo los perciben los lectores de pantalla.

##display
`display: none;`

Esta propiedad de CSS determina el tipo de caja (para más info podéis consultar este [artículo](https://dev.to/lupitacode/la-propiedad-display-en-css-1b6a)). Si le añades el valor `none` lo que reciba este código será ocultado y eliminado del flujo, por lo que el lugar que ocupaba anteriormente, también desaparece.

Lector de pantalla: El elemento será ignorado.

##visibility
`visibility: hidden;`

Nos permite esconder o enseñar un elemento sin eliminarlo del flujo y manteniendo la estructura de la página. Es decir, al contrario que con `display: none;` si le indicamos el valor `hidden` el elemento ya no está visible en la página pero el espacio sigue ocupado. 

Lector de pantalla: El elemento será ignorado.

![Imagen con un elemento con visibility: hidden](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/peekcsf2rxdblbqxt2rd.PNG)Imagen con un elemento con visibility: hidden 

##width, height, overflow
`width: 0;
height: 0; 
overflow: hidden;`

`Height` y `width` sirven para establecer el alto y ancho de los elementos y `overflow` permite controlar qué se va a hacer con el contenido que supera el tamaño que tiene un elemento.

Si los combinamos de esta forma, los componentes que se vean afectados por este código estarán ocultos y no se mantendrá el espacio que ocupan.

Lector de pantalla: El elemento será ignorado.

##position
`position: absolute;
left: -9999em;`

Esta propiedad indica la forma de posicionar que se va a utilizar en un componente. Si empleamos el `absolute` y `left: -9999em`, el contenido se desvanecerá del flujo normal, estará emplazado en la esquina izquierda y el espacio que ocupaba también desaparecerá.

Lector de pantalla: Tendrán en cuenta esos elementos y podrán acceder a su contenido.

##text-indent
`text-indent: -9999em;`

`text-indent` especifica la indentación que va a tener la primera línea de un párrafo. En este caso, los elementos son ocultados aunque pueden seguir recibiendo el foco.

Lector de pantalla: Tendrán en cuenta esos elementos y podrán acceder a su contenido, aunque éste sólo podrá ser texto o elementos en línea.

#HTML

Dejando a un lado las propiedades de CSS, hay que destacar algunos atributos de HTML.

##aria-hidden
`<p aria-hidden="true">Esto es un texto</p>`

Este atributo de HTML si tiene su valor en `true` será ocultado exclusivamente para los lectores de pantalla, pudiendo ser visualizado en los navegadores.

Sin embargo, hay que tener en cuenta que este atributo no funciona en elementos que pueden recibir el foco como los botones, los inputs o los links.

Lector de pantalla: El elemento será ignorado.

##type="hidden"

`<input type="hidden" name="input"/>`

Como mencionamos anteriormente, el `aria-hidden="true"` no funcionará en elementos que admiten tener el foco, como los inputs. No obstante, si a un `input` le ponemos que es de tipo `hidden` sí que podrá ser ocultado.  

Lector de pantalla: El elemento será ignorado.

##hidden
`<p hidden="true">Esto es un texto</p>`

Al colocar este atributo en el HTML, este elemento se comportará como si tuviera un `display: none`, siendo escondido y eliminado del flujo. Este atributo afecta a elementos que pueden recibir el foco.

Lector de pantalla: El elemento será ignorado.

#Conclusión

Disponemos de muchas formas de mostrar y ocultar elementos tanto usando HTML como CSS y que se comportan de diferente forma. Ahora que conocemos cómo funcionan cada uno de ellos, podremos tenerlo en cuenta a la hora de desarrollar  y así crear proyectos accesibles.

Para más información
https://www.pluralsight.com/guides/how-to-hide-text-from-screen-readers
http://alistapart.com/article/now-you-see-me/