Acerca de este problema HTML
El atributo tabindex controla si un elemento puede recibir foco del teclado y en qué orden. El validador del W3C reporta este error cuando encuentra tabindex="" porque la especificación HTML requiere que el valor del atributo sea un entero válido — y una cadena vacía no puede ser interpretada como tal. Esto comúnmente ocurre cuando se omite accidentalmente un valor, cuando un motor de plantillas genera un valor en blanco, o cuando un CMS genera el atributo sin un valor por defecto apropiado.
Por qué es importante
La navegación por teclado es fundamental para la accesibilidad web. Los lectores de pantalla y las tecnologías asistivas dependen de los valores de tabindex para determinar el comportamiento del foco. Un atributo tabindex vacío crea ambigüedad: los navegadores pueden ignorarlo o manejarlo de manera inconsistente, llevando a un comportamiento impredecible del foco para usuarios de teclado y tecnologías asistivas. Más allá de la accesibilidad, también significa que tu HTML es inválido según el estándar vivo HTML de WHATWG, que define estrictamente tabindex como que acepta solo un entero válido.
Cómo funciona tabindex
El atributo acepta un valor entero con tres rangos significativos:
-
Valor negativo (ej.,
tabindex="-1"): El elemento puede recibir foco programáticamente (a través de.focus()de JavaScript), pero se excluye del orden secuencial de navegación por teclado. -
tabindex="0": El elemento se añade al orden natural de navegación basado en su posición en el código fuente del documento. Esta es la forma más común de hacer que elementos no interactivos (como un<div>o<span>) puedan recibir foco del teclado. -
Valor positivo (ej.,
tabindex="1",tabindex="5"): El elemento se coloca en el orden de navegación antes que los elementos contabindex="0"o sintabindex, con números más bajos recibiendo foco primero. Usar valores positivos generalmente se desaconseja porque anula el orden natural del documento y hace que la gestión del foco sea más difícil de mantener.
Cómo solucionarlo
-
Si el elemento debe poder recibir foco en el orden de navegación, establece
tabindex="0". -
Si el elemento solo debe poder recibir foco programáticamente, establece
tabindex="-1". -
Si no necesitas comportamiento de foco personalizado, elimina el atributo
tabindexcompletamente. Los elementos interactivos como<a>,<button>e<input>ya pueden recibir foco por defecto. - Si una plantilla o CMS genera el atributo, asegúrate de que la lógica proporcione un entero válido u omita el atributo cuando no haya valor disponible.
Ejemplos
❌ Valor tabindex vacío (desencadena el error)
<div tabindex="">Click me</div>
<button tabindex="">Submit</button>
✅ Corregido: entero válido proporcionado
<div tabindex="0">Click me</div>
<button tabindex="-1">Submit</button>
✅ Corregido: atributo eliminado cuando no es necesario
Los elementos interactivos como <button> pueden recibir foco por defecto, por lo que tabindex puede simplemente eliminarse:
<button>Submit</button>
✅ Corregido: renderizado condicional en una plantilla
Si estás usando un sistema de plantillas, asegúrate de que el atributo solo se renderice cuando existe un valor válido:
<!-- En lugar de siempre generar tabindex -->
<!-- Malo: <div tabindex="{{ tabindexValue }}"> -->
<!-- Solo generar el atributo cuando se establezca un valor -->
<div tabindex="0">Interactive content</div>
Una nota sobre los valores positivos de tabindex
Aunque los enteros positivos como tabindex="1" o tabindex="3" son técnicamente válidos, fuerzan un orden de navegación personalizado que diverge del orden visual y del DOM de la página. Esto crea confusión para los usuarios de teclado y es difícil de mantener a medida que las páginas evolucionan. Las Prácticas de Autoría WAI-ARIA recomiendan evitar valores positivos de tabindex. Mantente con 0 y -1 en casi todos los casos.
Encuentra problemas como este automáticamente
Rocket Validator escanea miles de páginas en segundos, detectando problemas de HTML en todo tu sitio web.
Más información: