Fallo Común F15 de WCAG 2.1: Implementar controles personalizados sin utilizar una API de accesibilidad

Control de videojuego con un diseño futurista y elementos pixelados, representando la personalización de interfaces y la importancia de la accesibilidad en controles interactivos.

La accesibilidad web es fundamental para garantizar que todos los usuarios, incluidas las personas con discapacidades, puedan interactuar correctamente con los elementos de una página. Un problema recurrente en el desarrollo web es la implementación de controles personalizados sin el uso adecuado de una API de accesibilidad.

El fallo F15 ocurre cuando los desarrolladores crean controles interactivos personalizados (botones, deslizadores, reproductores multimedia, entre otros) que no están correctamente expuestos a las tecnologías de asistencia a través de la API de accesibilidad de la plataforma. Esto impide que los usuarios de lectores de pantalla u otras herramientas de asistencia puedan percibir y operar estos controles correctamente.

La API de accesibilidad actúa como un puente entre la interfaz de usuario y las tecnologías de asistencia. Cuando se usan controles HTML estándar, la compatibilidad con la API es automática, pero en controles personalizados es responsabilidad del desarrollador asegurarse de que sean accesibles mediante el uso de WAI-ARIA y eventos de teclado.

Acerca de este fallo

Este fallo incumple el criterio de conformidad 4.1.2: Nombre, Rol, Valor (Nivel A) de WCAG 2.1, que exige que los controles de usuario expongan su:

  • Nombre: Cómo se identifica el control.
  • Rol: Su función dentro de la interfaz (botón, casilla de verificación, deslizador, etc.).
  • Valor: Estado o contenido del control.

Cuando un control personalizado no usa una API de accesibilidad adecuada, las tecnologías de asistencia no pueden identificarlo, lo que genera una barrera para los usuarios con discapacidad visual o motora.

Escenarios comunes en los que ocurre este fallo:

  • Uso de elementos <div> o <span> para crear botones o controles sin roles y atributos accesibles.
  • Creación de controles personalizados con JavaScript sin exponer su función mediante WAI-ARIA.
  • Falta de compatibilidad con el teclado en controles interactivos.

Ejemplos

Ejemplo incorrecto 1: Uso de elementos sin roles y atributos accesibles.

Código incorrecto: Un botón personalizado hecho con <div> sin rol accesible:

<div onclick="submitForm()" style="width: 100px; height: 40px; background: blue; color: white; text-align: center;">Enviar</div>

🔴 Problema:

  • El elemento <div> no tiene un rol semántico.
  • Los lectores de pantalla no lo reconocen como un botón.
  • No se puede enfocar con el teclado ni activar con «Enter» o «Espacio».

Solución correcta: Usar elementos con roles y atributos accesibles.

Código accesible con WAI-ARIA:

<button onclick="submitForm()" aria-label="Enviar formulario">Enviar</button>

✅ ¿Qué mejora?:

  • Se usa un <button>, que es accesible por defecto.
  • Se añade aria-label para una mejor identificación.
  • Es compatible con el teclado y tecnologías de asistencia.

Ejemplo incorrecto 2: Uso de elementos sin atributos accesibles.

Código incorrecto: Un deslizador de volumen personalizado sin atributos accesibles:

<div class="slider" onmousedown="adjustVolume(event)"></div>

🔴 Problema:

  • No tiene role="slider" para ser identificado como un control de volumen.
  • No informa su valor actual a los lectores de pantalla.
  • No se puede operar con el teclado.

Solución correcta: Usar elementos con atributos accesibles.

Código accesible con ARIA:

<div role="slider" aria-valuemin="0" aria-valuemax="100" aria-valuenow="50" tabindex="0" onkeydown="adjustVolumeWithKeyboard(event)"></div>

✅ ¿Qué mejora?:

  • Se define el rol slider.
  • Se especifican los valores mínimo, máximo y actual con aria-valuemin, aria-valuemax y aria-valuenow.
  • Se permite la navegación con el teclado.

Ejemplo correcto: Uso de controles estándar

Uso de controles estándar en lugar de personalizados:

<input type="range" min="0" max="100" value="50" aria-label="Control de volumen">

Este control ya es accesible sin necesidad de añadir atributos extra.

Errores comunes y cómo evitarlos

Errores frecuentes:

  • Usar elementos <div> o <span> como botones sin roles accesibles.
  • Implementar controles personalizados sin aria-label, aria-role u otros atributos.
  • No permitir la navegación por teclado.
  • No probar los controles con tecnologías de asistencia.

Cómo evitar estos errores:

  • Usar siempre que puedas controles HTML estándar, ya que la compatibilidad con la API es automática. 
  • Implementar WAI-ARIA en controles personalizados requiere de conocimientos avanzados y suele ser fuente de numerosos conflictos que generan barreras de accesibilidad.
  • Probar con herramientas como VoiceOver, NVDA o JAWS.
  • Validar con Accessibility Insights o el inspector de accesibilidad del navegador.

Preguntas frecuentes

¿Por qué los controles personalizados pueden ser inaccesibles?

Porque no están conectados a la API de accesibilidad, lo que impide que sean detectados por lectores de pantalla.

¿Cuándo debería usar WAI-ARIA?

Cuando un control no tiene una alternativa semántica en HTML estándar.

¿Cómo puedo probar si un control es accesible?

Usando herramientas como Accessibility Insights, el inspector de accesibilidad del navegador o un lector de pantalla.

¿Es obligatorio usar ARIA en todos los controles?

No, solo cuando sea necesario. Siempre es mejor usar elementos HTML nativos.

¿Qué pasa si un control no tiene soporte de teclado?

No será usable para personas con discapacidades motoras. Se debe agregar tabindex y eventos keydown.

¿Cuáles son las herramientas más recomendadas para validar accesibilidad?

WAVE, axe DevTools, NVDA y la pestaña «Accesibilidad» en las herramientas de desarrollador del navegador.

Recursos relacionados

Pruebas y validación

Procedimiento:

  1. Revisar los controles personalizados con herramientas de accesibilidad (o si no está disponible, inspeccionar el código usando las herramientas para desarrolladores de un navegador o probar con una tecnología de asistencia).
  2. Verificar que los controles admiten la API de accesibilidad.
  3. Probar la navegación con teclado y lectores de pantalla.

Resultados esperados:

  • ❌ Si los controles no están expuestos correctamente, la prueba falla.
  • ✅ Si las tecnologías de asistencia pueden identificar y operar los controles, la prueba es exitosa.

Implementar controles personalizados sin API de accesibilidad crea barreras para los usuarios con discapacidades. Asegúrate de que todos los controles sean accesibles usando HTML semántico o WAI-ARIA.

¿Necesitas ayuda con la accesibilidad web? Contáctanos y optimiza tu sitio para todos.

¿Tienes dudas? Solicita una consultoría inicial gratuita

Evaluamos tu sitio web para identificar barreras que dificultan el acceso a personas con discapacidad. Te entregamos un informe con errores detectados y soluciones para que tu web sea usable por todos.