Addaw, ir a inicio Donar

Fallo común WCAG 2.2

F44Orden de tabulación desordenado por usar tabindex con números

Nombre oficial en el W3C: Fallo del criterio de conformidad 2.4.3 debido a usar tabindex para crear un orden de tabulación que no conserva el significado ni la operabilidad

En pocas palabras

El atributo tabindex con valores positivos (1, 2, 3…) cambia el orden en que se recorre la página con la tecla Tab. Si esos números no siguen el orden lógico del contenido, el foco salta de un sitio a otro sin sentido. Es un error frecuente al editar una página y olvidar renumerar.

Por qué es importante

Muchas personas usan solo el teclado: personas ciegas con lector de pantalla, personas con poca movilidad en las manos o quien prefiere no usar ratón. Con la tecla Tab pasan de un enlace o campo al siguiente.

Si el orden salta sin lógica, la persona pierde el hilo. En un formulario de cita previa puede llegar a la fecha antes que al nombre. O puede llegar al botón «Enviar» sin haber pasado por un campo.

Cómo evitarlo

  1. Deje que el orden lo marque el código: coloque los elementos en el HTML en el mismo orden en que deben recorrerse.
  2. No use valores de tabindex mayores que 0. Los elementos con número positivo van siempre antes que el resto de la página.
  3. Use tabindex="0" solo para que un control propio reciba el foco en su posición natural. Use tabindex="-1" para darle el foco solo desde un script.
  4. Si el diseño cambia el orden visual con CSS, reordene el HTML en lugar de corregirlo con tabindex.
  5. Si hereda una página con tabindex positivos, quítelos. Si no es posible, revise toda la numeración cada vez que añada o mueva un elemento.

Ejemplo práctico

Es habitual en formularios de cita previa, contacto o registro. El orden se fijó con tabindex positivos. Después se añadió un campo, que quedó fuera de la secuencia.

Así no: Formulario con tabindex positivos y un campo añadido después

Los campos llevan tabindex del 1 al 4. El campo Teléfono se añadió más tarde, sin tabindex. Con Tab, el orden es Nombre, Apellidos, Fecha de la cita y Pedir cita. Teléfono se salta y llega el último, después del botón de envío.

Captura de pantalla del ejemplo incorrecto: Formulario con tabindex positivos y un campo añadido después
Así se ve el ejemplo incorrecto.

La demostración contiene, a propósito, el error de accesibilidad que se explica.

Ver el código del ejemplo incorrecto
<form action="#">
  <p><label for="nombre">Nombre</label><br>
    <input id="nombre" type="text" autocomplete="given-name" tabindex="1"></p>
  <p><label for="apellidos">Apellidos</label><br>
    <input id="apellidos" type="text" autocomplete="family-name" tabindex="2"></p>
  <p><label for="tel">Teléfono</label><br>
    <input id="tel" type="tel" autocomplete="tel"></p>
  <p><label for="fecha">Fecha de la cita</label><br>
    <input id="fecha" type="date" tabindex="3"></p>
  <button type="submit" tabindex="4">Pedir cita</button>
</form>

Así sí: Formulario sin tabindex: el orden sigue al código

Se quitan todos los tabindex. Ahora el orden de tabulación es el del código. Coincide con el orden visual y lógico: Nombre, Apellidos, Teléfono, Fecha de la cita y Pedir cita. Los campos que se añadan en el futuro quedarán en su sitio sin tocar nada más.

Pruébelo aquí:

Ver el código del ejemplo correcto
<form action="#">
  <p><label for="nombre">Nombre</label><br>
    <input id="nombre" type="text" autocomplete="given-name"></p>
  <p><label for="apellidos">Apellidos</label><br>
    <input id="apellidos" type="text" autocomplete="family-name"></p>
  <p><label for="tel">Teléfono</label><br>
    <input id="tel" type="tel" autocomplete="tel"></p>
  <p><label for="fecha">Fecha de la cita</label><br>
    <input id="fecha" type="date"></p>
  <button type="submit">Pedir cita</button>
</form>

Cómo comprobarlo

Teclado

  1. Pulsar Tab desde el inicio de la página. Anotar el orden en que los controles reciben el foco.
  2. Comprobar que ese orden sigue la lectura (de arriba abajo y de izquierda a derecha) y la lógica de la tarea.
  3. Comprobar que ningún campo queda al final, después del botón de envío o del pie de página.

Herramientas del navegador

  1. En Firefox, abrir las herramientas de desarrollo (F12) y la pestaña Accesibilidad. Activar «Mostrar orden de tabulación» para ver la secuencia numerada sobre la página.
  2. Para listar los elementos con tabindex positivo, ejecutar en la Consola: document.querySelectorAll('[tabindex]:not([tabindex="0"]):not([tabindex^="-"])')

Validación automática

  1. axe DevTools (regla tabindex) y Lighthouse avisan de los elementos con tabindex mayor que 0. WAVE también los señala como alerta.
  2. Estas herramientas detectan los tabindex positivos, pero no saben si el orden es lógico. El fallo se confirma recorriendo la página con el teclado.

Errores frecuentes en auditorías

  • Poner tabindex="1" en el buscador o en el botón de cookies para que reciban el foco primero. Así hay que pasar por ellos antes que por el enlace para saltar al contenido.
  • Formularios de plugins o constructores visuales que numeran los campos con tabindex. Al añadir o mover campos, el orden se desordena.
  • Mezclar tabindex positivos en una ventana modal y en el resto de la página. El foco sale de la modal antes de terminarla.
  • Corregir con tabindex positivos un orden visual cambiado con CSS (order, flex-direction: row-reverse). Lo correcto es reordenar el código fuente.
Ver el texto completo del W3C (traducción al español)

Esta es una traducción no oficial al español de la técnica F44 de Techniques for WCAG 2.2, del W3C. Puede contener errores. El único documento oficial y normativo es la versión original en inglés, publicada en el sitio web del W3C.

Aplicabilidad

HTML

Descripción

Este documento describe un fallo que se produce cuando el orden de tabulación no sigue las relaciones y secuencias lógicas del contenido.

Los elementos que pueden recibir el foco, como los enlaces y los elementos de formulario, tienen un atributo tabindex. Los elementos reciben el foco en orden ascendente según el valor del atributo tabindex. Cuando los valores del atributo tabindex se asignan en un orden distinto al de las relaciones y secuencias del contenido, el orden de tabulación deja de seguir las relaciones y secuencias del contenido.

Una de las causas más habituales de este fallo se da al editar una página en la que se ha usado tabindex. Es fácil que el orden de tabulación y el orden del contenido dejen de corresponderse cuando se edita el contenido pero no se actualizan los atributos tabindex para reflejar los cambios realizados.

Ejemplos

El siguiente ejemplo usa tabindex de forma incorrecta para especificar un orden de tabulación alternativo:

<ol>
  <li><a href="main.html" tabindex="1">Homepage</a></li>
  <li><a href="chapter1.html" tabindex="4">Chapter 1</a></li>
  <li><a href="chapter2.html" tabindex="3">Chapter 2</a></li>
  <li><a href="chapter3.html" tabindex="2">Chapter 3</a></li>
</ol>

Si se navega por esta lista con la tecla de tabulación, se recorre en el orden «Homepage», «chapter 3», «chapter 2», «chapter 1» (página de inicio, capítulo 3, capítulo 2, capítulo 1), que no sigue la secuencia del contenido.

En una página web se ha fijado explícitamente el orden de tabulación asignando atributos tabindex a todos los campos. Más adelante se modifica la página para añadir un campo nuevo en mitad de la página, pero quien la desarrolla olvida añadir un atributo tabindex al nuevo campo. Como resultado, el nuevo campo queda al final del orden de tabulación.

Pruebas

Procedimiento

  1. Si se usa tabindex, comprobar que el orden de tabulación especificado por los atributos tabindex sigue las relaciones existentes en el contenido.

Resultados esperados

  • Si la comprobación n.º 1 es falsa, se da esta condición de fallo y el contenido falla el criterio de conformidad.

Recursos

Cómo lo comprobamos en ADDAW

Este error es uno de los que buscamos en cada auditoría de ADDAW. Se lo entregamos con capturas y la forma de corregirlo.

Solicitar una auditoría

Basado en la técnica F44 del W3C (WCAG 2.2). Explicación y ejemplos: ADDAW. Traducción no oficial del texto del W3C © W3C, licencia de documentos del W3C. ¿Ha visto un error? Escríbanos.