Acerca de este problema HTML
El atributo aria-labelledby es un atributo IDREFS, lo que significa que su valor debe ser una lista separada por espacios de uno o más valores id que existan en el documento. Estos elementos referenciados proporcionan colectivamente el nombre accesible para el elemento. Cuando el valor es una cadena vacía ("") o contiene solo espacios en blanco, no hay referencias ID válidas, lo que viola el requisito IDREFS definido en las especificaciones WAI-ARIA y HTML.
Este problema aparece comúnmente cuando los sistemas de plantillas o frameworks de JavaScript establecen condicionalmente aria-labelledby pero generan una cadena vacía cuando no hay un ID de etiqueta disponible. También ocurre cuando los desarrolladores añaden el atributo como marcador de posición con la intención de completarlo más tarde pero olvidan hacerlo.
Por qué esto importa
Un aria-labelledby vacío es problemático por varias razones:
-
Accesibilidad: Los lectores de pantalla dependen de
aria-labelledbypara anunciar el nombre accesible de un elemento. Un valor vacío puede causar comportamientos impredecibles: algunos lectores de pantalla pueden ignorar el SVG completamente, mientras que otros pueden recurrir a leer contenido no útil o no anunciar nada. Esto deja a los usuarios que dependen de tecnología asistiva sin una descripción significativa del gráfico. - Cumplimiento de estándares: El validador de W3C marca esto como error porque la especificación HTML requiere que los atributos IDREFS contengan al menos un carácter que no sea espacio en blanco. Publicar HTML inválido puede indicar problemas de calidad más amplios y puede causar problemas en entornos de análisis estrictos.
-
Mantenibilidad: Un
aria-labelledbyvacío es ambiguo. No está claro si el desarrollador pretendía que el SVG fuera decorativo, olvidó añadir una referencia, o encontró un error en su lógica de plantillas.
Cómo solucionarlo
Elige el enfoque que coincida con tu intención:
-
Referencia un elemento de etiquetado por ID: Si el SVG transmite significado, añade un elemento
<title>(u otro elemento de texto visible) dentro o cerca del SVG con unidúnico, luego establecearia-labelledbya eseid. Los IDs distinguen entre mayúsculas y minúsculas, así que asegúrate de que coincidan exactamente. -
Usa
aria-labelen su lugar: Si quieres proporcionar un nombre accesible directamente como una cadena de texto sin necesidad de un elemento separado, reemplazaaria-labelledbyconaria-label. -
Elimina el atributo: Si el SVG ya tiene un nombre accesible a través de otros medios (como texto adyacente visible o un hijo
<title>que no necesita referencia explícita), simplemente elimina elaria-labelledbyvacío. -
Marca como decorativo: Si el SVG es puramente decorativo y no añade información, elimina
aria-labelledbyy añadearia-hidden="true"para que la tecnología asistiva lo omita completamente.
Cuando generes aria-labelledby dinámicamente, asegúrate de que tu código omita completamente el atributo en lugar de generar un valor vacío cuando no haya un ID de etiqueta disponible.
Ejemplos
❌ aria-labelledby vacío (provoca el error)
<svg role="img" aria-labelledby="">
<use href="#icon-star"></use>
</svg>
La cadena vacía no es un valor IDREFS válido, por lo que el validador reporta un error.
✅ Referencia un elemento <title> por ID
<svg role="img" aria-labelledby="star-title">
<title id="star-title">Favorite</title>
<use href="#icon-star"></use>
</svg>
El aria-labelledby apunta al id del elemento <title>, dando al SVG un nombre accesible claro de “Favorite”.
✅ Usa aria-label con una cadena de texto
<svg role="img" aria-label="Favorite">
<use href="#icon-star"></use>
</svg>
Cuando no necesitas hacer referencia a otro elemento, aria-label proporciona el nombre accesible directamente como un valor de atributo.
✅ Referencia múltiples elementos de etiquetado
<svg role="img" aria-labelledby="star-title star-desc">
<title id="star-title">Favorite</title>
<desc id="star-desc">A five-pointed star icon</desc>
<use href="#icon-star"></use>
</svg>
El valor de aria-labelledby puede incluir múltiples IDs separados por espacios. El nombre accesible se construye concatenando el contenido de texto de los elementos referenciados en orden.
✅ SVG decorativo (no necesita nombre accesible)
<svg aria-hidden="true" focusable="false">
<use href="#icon-decorative-divider"></use>
</svg>
Para gráficos puramente decorativos, aria-hidden="true" elimina el elemento del árbol de accesibilidad. Añadir focusable="false" evita que el SVG reciba el foco del teclado en versiones anteriores de Internet Explorer y Edge.
Encuentra problemas como este automáticamente
Rocket Validator escanea miles de páginas en segundos, detectando problemas de HTML en todo tu sitio web.