A11Y web: ¿Dónde empezar con accesibilidad?

Si te encuentras en un proyecto en el cual tienes que hacer las pantallas accesibles, tienes ganas de aprender a hacerlo y no sabes por dónde empezar. ¡Este artículo es para ti!

Aquí vamos a presentar cuáles son los principales conceptos para comprobar si una página es accesible y lo que debe ser hecho para dejarla tal cual.

CONCIACIÓN – ALGUNOS DATOS

Accesibilidad puede involucrar muchos tipos de discapacidad, algunos tipos son:

  • Problemas visuales (ceguera, daltonismo…)
  • Problemas auditivos (baja audición, sordera…)
  • Problemas físicos (ausencia de un miembro o impedimentos de movilidad como la artrosis o lesiones crónicas)
  • Problemas cognitivos (discapacidad mental)
  • Problemas neurológicos (epilepsia, parkinson)
  • Problemas del habla (derrame cerebral)

Hacer nuestras webs accesibles no sólo beneficia a este tipo de personas, nos beneficia a todos, ya que a veces por circunstancias que escapan de nuestro control como una conexión lenta, un brazo roto o simplemente la vejez, no podemos hacer un uso normalizado de la web.

Accesibilidad en la web – a11y

En la web se pueden encontrar muchos artículos y contenidos sobre accesibilidad al buscar por a11y. A título de curiosidad, a11y es un numerónimo (palabra basada en números) para la palabra” accesibility” (similar a i18n para internacionalización).

Accesibilidad es un término que está relacionado con diferentes contextos y, para la web, a11y nos ayuda a identificar los términos relacionados con accesibilidad digital.

Accesibilidad en la web – ¿Que es WCAG?

Los documentos WCAG (Web Content Accessibility Guidelines) son documentos técnicos que contienen un conjunto de políticas o pautas que debemos seguir para hacer que el contenido de nuestra web sea accesible para las personas con discapacidad.

Actualmente tenemos 2 versiones en las que apoyarnos, la WCAG 2.0 (2008), WCAG 2.1 (2018) y WCAG 2.2 (2022), que no es más que una actualización de la 2.0.

Estos documentos, son generados por la WAI (Web Accessibility Initiative) que forma parte de la W3C (World Wide Consortium, principal organización que rige los estándares de internet) y constan de unas 12-13 pautas organizadas bajo los 4 principios de la accesibilidad (Perceptible, Operable, Comprensible y Robusto).

Para cada pauta, existen criterios de éxito comprobables mediante la combinación de pruebas automatizadas y evaluación humana (por ejemplo, la usabilidad), distribuidos en tres niveles, según el nivel de conformidad/aceptación de los criterios que tienen como requisitos y son: A, AA y AAA.

Como documento de consulta, podéis usar la siguiente guía: https://www.w3.org/WAI/WCAG21/quickref/

¿Entonces… Empezamos?

Después de echarle un ojo a la importancia de la accesibilidad y su impacto, vamos a ver los principales puntos que deben ser tenidos en cuenta en el momento de desarrollar.

HTML semántico

Antes de empezar con los temas de WAI ARIA es necesario saber que se puede hacer accesible todo y cualquier contenido desarrollado que sea bien etiquetado con HTML5, o sea, que el propósito de una etiqueta sea para finalidad en que la misma fue creada. Los lectores de pantalla están por defecto preparados para identificar cada una de las etiquetas standard que forman la web.

En resumen, en el momento de la maquetación, si utilizamos las etiquetas adecuadas para cada ítem en la página ya sería suficiente para que lo mismo esté accesible. Esto significa el HTML semántico es esencial para conseguir una mejor calidad de usabilidad por defecto.

Aunque nos parezca más cómodo, en la maquetación se deben cambiar (siempre que posible) las clásicas “divs” por las debidas etiquetas nativas.

HTML semántico – Premisas

Hay algunas premisas que son fundamentales para una aplicación accesible y las principales son:

Enfoque visible

Mantener el “focus” con una buena visibilidad a las etiquetas que son “enfocables” como enlaces y botones, por ejemplo.

Por defecto de los browsers actuales, tenemos un enfoque visible y aceptable para que sea accesible (Aunque que lo tengamos, no podemos dejar esta responsabilidad para solo 1 browser específico).

Podemos hacer esto utilizando el CSS y la propiedad “:focus”.

body:focus, *:focus {
outline: 0.125rem solid #08c;
outline-offset: 0.25rem;
}

 

¡A TENER EN CUENTA!

No son todas las etiquetas web que son “enfocables”, actualmente tenemos las etiquetas interactivas son: a, area, button, details, input, iframe, select, textarea.

No obstante, es posible convertir una div genérica en un elemento que puede recibir “focus” con tabindex (vamos a verlo más adelante) y por tener esta libertad merece la pena recordar que solo recibe “focus” elementos interactivos, o sea, elementos que se pueden interactuar desde el teclado como un botón o un acordeón, por ejemplo.

Títulos y nivel de títulos (H1…H6)

Solo podemos utilizar un título principal (H1) por página (lo mismo vale para las Single Page Applications o SPA’s)

Podemos utilizar más de un subtítulo (H2…H6), pero que lo mismo traiga sentido para lo que está siendo leído.

Más informaciones en: https://www.w3.org/WAI/tutorials/page-structure/headings/

IMÁGENES

En la web, las imágenes forman parte no solo de apelo visual de una noticia, también de elemento de interacción que va a mantener motivado el usuario a continuar navegando en aquel sitio, pero ¿cómo convertimos una imagen en accesible? ¿Es necesario que todo sea etiquetado y contenga una descripción o no? Vamos a echar un ojo.

IMÁGENES CON DESCRIPCIÓN

Las imágenes deben tener una descripción cuando tenga sentido tenerla en la línea de lectura a nivel de narrativa (Por ejemplo, una foto de una noticia). Para esto utilizamos el atributo ALT o TITLE (Max.: 130 caracteres)

<img src=”camino_imagen/imagen.jpg" alt=”Empleados mirando sus nuevos proyectos”/>

 

IMÁGENES CON ENLACE

Imágenes que están involucradas en un enlace (href) deben quedarse con sus atributos vacíos (cuando hay texto en el enlace y lo forma referencia a la imagen), dejando apenas el contenido de texto del enlace.

IMÁGENES CON DESCRIPCIÓN

Cuando la imagen tiene una función (un enlace u otro comportamiento), el atributo ALT se debe representar su funcionalidad.

<a href="/mainpage" class="logo">
<img src=”caminho/imagen.png" alt="Logotipo nuestra empresa - Ir a la home" srcset="">
</a>

Imagen de ejemplo con imágenes que tienen función de enlace.

IMÁGENES DECORATIVAS

Imágenes que son decorativas son aquellas que llevan apenas un apelo visual y no traen sentido a narrativa del texto y deben ser ignoradas.

Se aplica a los iconos, por ejemplo.

Para ignorarlos, dejamos los atributos ALT y TITLE vacíos.

<section class="article">
<h1>Bienvenido!</h1>
<img class="decorative-image" src="assets/world.png" alt=""/>
<p>
Lorem Ipsum es simplemente el texto de relleno de las imprentas y archivos de texto. </p>
</section>

 

FORMULARIOS

Debemos utilizar toda la estructura de un formulario que va a garantizar que los lectores de pantalla a mejor comprender que es un formulario. Mismo que por el diseño de UX no tenga una label, se debe añadirla y ocultarla con CSS.

.wrap .content .article form fieldset {
border-color: transparent;
}

.wrap .content .article form fieldset legend {
opacity: 0;
font-size: 0px;
}
.wrap .content .article form .form-group label {
opacity: 0;
font-size: 0px;
}

¡A tener en cuenta! “display: none” no puede ser leído por los lectores de pantalla.

 

form action="">
<fieldset>
<legend>En formulário de ejemplo</legend>
<div class="form-group">
<label for="name">nombre:</label>
<input type="text" name="name" id="name" placeholder="Escriba su nombre">
<span class="validator hidden" id="validate-name"></span>
</div>
<div class="form-group">
<label for="email">correo:</label>
<input type="text" name="email" id="email" placeholder="Escriba su correo">
<span class="validator hidden" id="validate-email"></span>
</div>
<div class="form-group">
<label for="message">mensaje:</label>
<textarea name="message" id="message" cols="30" rows="10" placeholder="Escriba su mensaje">
</textarea>
<span class="validator hidden" id="validate-message"></span>
</div>
<button id="send-message" disabled>Enviar!</button>
</fieldset>
</

EVITE REDUNDANCIAS

Por defecto si utilizamos una etiqueta adecuada al tipo de elemento, no debemos utilizar roles para el mismo.

Incorrecto:

<button role="button" id="close-btn">¡Si!</button>

Correcto:

<span role="button" id="close-btn">¡Si!</span>

Es recomendable utilizar las etiquetas adecuadas si es posible, si no puedes utilizar la propiedad role.

Componentes personalizados

Hay componentes que son distintos o no existen en el mundo HTML nativamente. En este caso debemos utilizar las roles y atributos disponibles y Javascript para obtener las funcionalidades adecuadas de lectura e interacción (por ejemplo, un modal).

Representación de un componente modal.

<!-- Trigger/Open The Modal -->
<button id="myBtn">Open Modal</button>

<!-- The Modal -->
<div id="myModal" class="modal">
<!-- Modal content -->
<div class="modal-content">
<span class="close">&times;</span>
<p>Some text in the Modal..</p>
</div>
</div>

Referencia: https://www.w3schools.com/howto/howto_css_modals.asp

La propiedad tabindex

Es un atributo global en que podemos añadir a nuestros componentes customizados opciones de enfoque a través de la tecla TAB.

Si un elemento necesita tener el enfoque o si es necesario añadir una secuencia lógica en el momento de tabular si puede utilizar este atributo.

<section>
<button tabindex="-1">Ignorado</button>
<div role="button" tabindex="0">Butón custom 1</div>
<div role="button" tabindex="1">Butón custom 2</div>
<div role="button" tabindex="2">Butón custom 3</div>
</section>

Observaciones

tabindex=“-1” Es un elemento enfocable, pero no navegable por la tecla tab

tabindex=“0” No es un elemento enfocable, pero con el atributo se convierte a un elemento que hace focus y se puede navegar con tab

tabindex=“1--2” La secuencia de focus puede ser controlada a través de los valores numéricos (1—N)

* Tornar un elemento “enfocable” no le añade más funcionalidades de interactivas.

Referencia: https://developer.mozilla.org/es/docs/Web/HTML/Global_attributes/tabindex

La propiedad lang

Define cual es el lenguaje del elemento. Generalmente puesto en la etiqueta html de una página.

Es posible definir un lenguaje distinto para un o más bloques.

Observaciones

El atributo lang es importante para definir cuál es el idioma de la página o de un bloque de código.

Dejar sin ninguna definición en el HTML va a resultar en la lectura por defecto del idioma configurado en el lector.

¡A tener en cuenta!

(voiceOVer) Para que seas leído correctamente (por un locutor del idioma correspondiente), se debe añadir el idioma en su configuración.

Referencia: https://developer.mozilla.org/es/docs/Web/HTML/Global_attributes/lang

WAI-ARIA – ¿Qué es ARIA?

Según la W3C, las aplicaciones de Internet enriquecidas accesibles (WAI-ARIA | Web Accessibility Initiative - Accessible Rich Internet Applications) son un conjunto de atributos que definen formas de hacer que el contenido web y las aplicaciones web (especialmente las desarrolladas con JavaScript) sean más accesibles para las personas con discapacidad. Para esto, ARIA, ofrece a los desarrolladores la opción de agregar información semántica complementaria a nuestros desarrollos:

  • Roles para describir el tipo de widget presentado, como "menú", "elemento de árbol", "control deslizante" y "barra de progreso".
  • Roles para describir la estructura de la página web, como encabezados, regiones, áreas de búsqueda y áreas de navegación.
  • Las propiedades para describir los widgets de estado se encuentran, como "marcada" para una casilla de verificación, "haspopup" para un menú que representa un submenú u otra ventana emergente y "expandido / contraído" para un nodo de árbol.

El conjunto de atributos y funcionalidades es dividido por 3 partes:

Referencia: https://developer.mozilla.org/en-US/docs/Learn/Accessibility/WAI-ARIA_basics

WAI ARIA – Roles

Widgets para marcar elementos de interfaz, por ejemplo, una caja de alerta, botones, checkbox, links, tabs etc.

Document Structure sirve para definición de estructuras de la organización de la página, por ejemplo, header, footer, sidebar, main etc.

Landmarks regiones de la página que son importantes a donde el usuario va a navegar, por ejemplo, búsquedas, contenido principal, formularios etc.

Abajo os comparto algunos roles y ejemplos que suelen ser bien útiles en el desarrollo de una web.

Roles - Tabs

¡Ojo! Añadir las etiquetas lo hacen con que sea leído de acuerdo con el widget tab, pero no su comportamiento, sin embargo, tenemos que crear toda la lógica a través del Javacript.

Roles – Document structure

¡Ojo! No tiene sentido añadir un role a si la etiqueta es la adecuada. En este ejemplo, valdría dejarlo sin la propiedad role.

 

Si no tenemos control para cambiar la etiqueta, la propiedad role cuadraría como en este ejemplo.

Roles - Menubar

Roles - A TENER EN CUENTA

A pesar de que ARIA nos permite modificar sutilmente (o radicalmente) el árbol de accesibilidad de cualquier elemento de la página es lo único que eso cambia.

- ARIA no mejora nada del comportamiento inherente del elemento.

- ARIA no hará que el elemento pueda tener el foco ni le brindará gestores de eventos de teclado. Esa sigue siendo parte de nuestra tarea de desarrollo.

- No es necesario definir aria en los elementos nativos. Es decir, un elemento <input type="checkbox"> no necesita un atributo de ARIA role="checkbox" adicional para anunciarse correctamente.

También vale la pena mencionar que ciertos elementos HTML tienen restricciones sobre los roles y atributos de ARIA que se pueden usar en ellos. Por ejemplo, a un elemento <input type=“password"> no se le puede aplicar un rol/atributo adicional.

Interfaz de usuario gráfica, Aplicación</p>
<p>Descripción generada automáticamente con confianza media

Si tienes dudas de cómo crear un componente customizado, es decir, un componente que no existe en el estándar del html5, puedes echarle un vistazo a la web Patterns del ARIA Authoring Practices Guide (APG), allí tendrás la visión de unos cuantos componentes customizados y como desarrollarlos a nivel de etiquetas, roles y manipulación (Javacript).

Testing – ¿Cómo comprobar a11y en nuestro desarrollo?

Cuando hablamos de accesibilidad a nivel de desarrollo, es obligatorio pasar por una secuencia de pruebas.

1. Visual

  • Comprobar desde tu desarrollo
    • Contraste: El contraste de los colores de una fuente con relación a su fondo, por ejemplo. (herramienta referencia: https://webaim.org/resources/contrastchecker/)
    • Focus visible: Comprobar que los elementos interactivos tienen un focus accesible.
    • Desde UX ya debería estar con los contrastes debidos, pero garantizar desde el desarrollo si lo mismo fue aplicado.

2. Navegación desde teclado

  • Utilizando la navegación desde teclado, garantizar que todos los elementos que son interactivos (botones, acordeones, etc) son accesibles (literalmente) utilizando solamente el teclado (para esta etapa, solo las teclas tab y flechas ya valdrían).

3. Herramientas automáticas (extensiones)

  • Hay unas cuantas herramientas automáticas que nos devuelven los posibles errores que tenemos en nuestra web, como podríamos arreglarlos y algunos nos da un score de a11y para la web escaneada. Entre los softwares tenemos
    • aXe DevTools – Es de pago, pero para escaneo de una página completa es posible utilizarla gratis.
    • Google LightHouse - Gratis y mantenida por google, es una alternativa para herramienta automática que no solo hace la valuación de a11y como también otras análisis como de performance, SEO etc.
    • Wave – Nos da una visión completa de la página con todos los elementos que fueron encontrados, así como los alertas (cosas que pueden mejorar) y errores.

4. Lector de pantalla

  • Aquí necesitamos de un poco de conocimiento para entender cómo funciona un lector de pantalla y como utilizarlo. Vamos a ver más adelante.

Lectores de pantalla – softwares utilizados

Algunos softwares son utilizados para ayudar con la navegación asistida. Los más utilizados son:

Abajo vamos a echarle un ojo en algunas funcionalidades de los principales (y gratis) lectores de pantalla para windows y Mac.

Lectores de pantalla – NVDA

NVDA - Tenemos algunas teclas de atajo que ayudan a navegar a través de las páginas con los softwares asistidos.

  • Numpad + : Empieza a leer en el topo de la página
  • NVDA + ↓ : Empieza a leer en la posición actual
  • Ctrl : Parar de leer
  • NVDA + ↑ o Numpad 8 : línea actual
  • Ctrl + ← / → o Numpad 4 / Numpad 6 : palabra anterior / siguiente
  • ↑ o Numpad 7 : línea anterior
  • ↓ o Numpad 9 : línea siguiente
  • ← / → o Numpad 1 / Numpad 3 : caracteres anterior / siguiente
  • F5 / Ctrl + F5 : actualización de la página.
  • NVDA + Ctrl + ↑ / ↓ : tasa de aumento de velocidad del habla / disminución del habla
  • L : Listados
  • I : ítems de un listado
  • NVDA + F7 : listado de elementos — links de páginas, títulos e landmarks / puntos de referencia
  • Ctrl + Home : inicio de la página
  • Ctrl + Fim : parte inferior de la página
  • Alt + D o F6 : barra dirección del navegador

La tecla Shift + tecla de acceso rápido Pasa por elementos en la orden invertida.

  • H : Títulos
  • D : landmarks / puntos de referencia
  • 1–6 : Título nivel 1–6 F : formularios
  • T : tablas
  • B : botones

Lectores de pantalla – VoiceOver

Tenemos algunas teclas de atajo que ayudan a navegar a través de las páginas con los softwares asistidos.

  • Premisas
    • Command + F5: Empieza el VoiceOver
    • Control + option = VO
    • Lectura VO + A : Empieza a leer
    • Control : parar de leer
    • VO + →: leer próximo ítem
    • VO + ← : leer ítem anterior
    • VO + P : leer párrafo
    • VO + S : leer frase
    • VO + W : leer la palabra (presione W muchas veces para deletrear palabras em orden alfabética y fonética)
    • VO + B : leer del topo para la posición actual
    • VO + Home : ir al topo de la página
    • VO + End : ir abajo de la página
    • VO + command + ← / → : Seleccione la opción de configuración de voz y habla (tasa de habla, voz, afinación, etc.). Use VO + command + ↑ / ↓ para cambiar la configuración de habla seleccionada.
  • Navegación
    • VO + command + L : link siguiente
    • VO + command + H : título siguiente
    • VO + command + J : controle de formulario siguiente
    • VO + command + T : próxima tabla
    • VO + command + X : listado siguiente
    • VO + command + G : gráfico / imagen siguiente
    • VO + espacio: activar un link o controle de formulario

En resumen, trabajar con a11y como desarrollador puede parecer un reto gigante al principio, pero después es gratificante hacer una web que sea 100% accesible sin barreras de acceso a los servicios de nuestros clientes en las aplicaciones que creamos. ¡Espero que esta pequeña introducción te aporte algún valor en el momento de picar código!

¡Y recuérdate! Es más fácil crear una web con el pensamiento en accesibilidad que hacer una corrección de algo ya creado. Teniendo esto en cuenta, desarrolle siempre con el pensamiento en accesibilidad.

He leído y acepto la política de privacidad
Acepto recibir emails sobre actividades de recruiting NTT DATA