Acerca de este problema HTML
El elemento label representa una etiqueta para un control de formulario. Hay dos formas de asociar un label con su control:
-
Asociación implícita — Coloca el control de formulario directamente dentro del elemento
label. No se necesita ningún atributoforporque el navegador automáticamente empareja la etiqueta con el control anidado. -
Asociación explícita — Usa el atributo
foren ellabel, estableciendo su valor aliddel control de formulario objetivo. El control no necesita estar anidado dentro dellabelen este caso.
Ambos métodos son válidos por sí mismos. El problema ocurre cuando los combinas incorrectamente: anidas un input dentro de un label que tiene un atributo for, pero el input no tiene id o tiene un id que no coincide con el valor de for. Esto crea una contradicción — el atributo for apunta a un id específico, pero el input anidado no cumple esa referencia. Los navegadores pueden manejar esto de forma inconsistente, y las tecnologías de asistencia como los lectores de pantalla podrían fallar al anunciar la etiqueta correctamente, perjudicando la accesibilidad.
Por qué esto importa
-
Accesibilidad: Los lectores de pantalla dependen del emparejamiento
for/idpara anunciar etiquetas para los controles de formulario. Unidno coincidente o faltante puede dejar el control sin etiqueta para usuarios que dependen de tecnología de asistencia. -
Cumplimiento de estándares: La especificación HTML requiere que cuando un atributo
forestá presente, debe referenciar elidde un elemento etiquetable. Una falta de coincidencia viola esta regla. -
Comportamiento del navegador: Algunos navegadores recurrirán a la asociación implícita cuando
forno se resuelve, pero otros pueden priorizar la asociación explícita rota, dejando el control efectivamente sin etiqueta.
Cómo solucionarlo
Tienes dos opciones:
-
Elimina el atributo
forsi elinputya está anidado dentro dellabel. La asociación implícita es suficiente por sí sola. -
Añade o corrige el
iden elinputanidado para que coincida exactamente con el valor del atributofor.
Ejemplos
❌ Input anidado sin id coincidente
El atributo for dice "email", pero el input no tiene id en absoluto:
<label for="email">
Email
<input type="email" name="email">
</label>
❌ Input anidado con un id no coincidente
El atributo for dice "email", pero el id del input es "user-email":
<label for="email">
Email
<input type="email" name="email" id="user-email">
</label>
✅ Solución eliminando el atributo for (asociación implícita)
Dado que el input está anidado dentro del label, la asociación es automática:
<label>
Email
<input type="email" name="email">
</label>
✅ Solución añadiendo un id coincidente (asociación explícita)
El valor de for y el valor de id son idénticos:
<label for="email">
Email
<input type="email" name="email" id="email">
</label>
✅ Solución usando asociación explícita sin anidamiento
Si prefieres mantener el atributo for, el input no necesita estar anidado en absoluto:
<label for="email">Email</label>
<input type="email" name="email" id="email">
En la mayoría de los casos, elegir asociación implícita o explícita — en lugar de mezclar ambas — es la forma más simple de evitar este error. Si las combinas, solo asegúrate de que el valor de for y el valor de id coincidan exactamente.
Encuentra problemas como este automáticamente
Rocket Validator escanea miles de páginas en segundos, detectando problemas de HTML en todo tu sitio web.