Menu

Label en HTML: el atributo for y cómo etiquetar campos

Cómo da nombre a un campo de formulario el elemento <label>: conectarlo con for e id o envolviendo el campo, la zona de clic más grande en checkboxes y radios, pistas y mensajes de error, etiquetas ocultas y los errores que rompen la conexión.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

Qué hace el elemento label

<label> le da nombre a un campo de formulario. Conéctalo con for, con el valor del id del campo, y pasan dos cosas: los lectores de pantalla anuncian la etiqueta cuando el campo recibe el foco, y al pulsar el texto de la etiqueta el foco pasa al campo. Pulsa los dos textos de abajo:

Pulsar "City" pone el cursor en su campo. Pulsar "Country" no hace nada, y un lector de pantalla que llega a ese segundo campo solo oye "editar texto", sin nombre. Los dos se ven idénticos; solo uno está etiquetado.

Dos formas de conectar una etiqueta

Usa for e id, o pon el campo dentro de la etiqueta:

for e idEnvolver
Necesita un idSí, único en la páginaNo
Etiqueta y campo pueden estar separadosSí (una celda de tabla, una cuadrícula)No, el campo está dentro
Fácil de romperPor una errata o un id duplicadoPor poner dos campos en una etiqueta

for debe coincidir con el id del campo, no con su name. A menudo los dos son la misma palabra, lo que oculta el error hasta que alguien cambia uno. Hacer las dos cosas (envolver y for) está bien y es habitual.

Una etiqueta se puede conectar a <input> (salvo type="hidden"), <select>, <textarea>, <button>, <meter>, <output> y <progress>. Una etiqueta da nombre a un campo. Un campo puede tener más de una etiqueta, aunque una etiqueta clara es más fácil para todos.

Una zona de clic más grande para checkboxes y radios

En los controles pequeños es donde más importa la etiqueta: pulsar en cualquier punto de ella alterna la casilla, así que la zona de clic es toda la línea de texto, no un cuadrado de 13 píxeles. Dar estilo a la etiqueta puede agrandarla aún más:

Pulsa en el padding de cada fila, lejos de la casilla. La primera fila se alterna; la segunda no hace nada salvo que aciertes en la propia casilla. Más sobre checkboxes en checkbox en HTML.

Pistas y mensajes de error

Una etiqueta debe ser corta: el nombre del campo. Las instrucciones extra y los mensajes de error van en elementos aparte, conectados con aria-describedby, para que los lectores de pantalla lean primero la etiqueta y después la descripción:

Pulsa Create con el campo vacío, luego con AB y luego con ada99. Con aria-describedby, un lector de pantalla anuncia algo como "Username, obligatorio, editar texto, 3 to 16 lowercase letters or digits, Enter a username." El asterisco lleva aria-hidden porque el atributo required ya dice "obligatorio"; oír "asterisco" no aporta nada.

Etiquetas ocultas

Algunos campos tienen una pista visible distinta de una etiqueta de texto, como un cuadro de búsqueda junto a un botón Search. La etiqueta sigue siendo necesaria; ocúltala visualmente pero mantenla en la página para los lectores de pantalla:

No la ocultes con display: none ni visibility: hidden: también la ocultan a los lectores de pantalla, y no todos los navegadores y lectores de pantalla siguen usando una etiqueta oculta como nombre. La otra opción es aria-label="Search courses" en el input, que le da nombre sin ningún elemento label. Una etiqueta visible sigue siendo la mejor opción siempre que haya sitio: a todo el mundo le sirve ver para qué es un campo.

Errores comunes

  • for apuntando al name en lugar del id. No se conecta nada.
  • Ids duplicados. for se conecta al primer elemento con ese id, que puede ser un campo de otro formulario de la página.
  • Placeholder en lugar de una etiqueta. Desaparece al escribir y no es un nombre fiable.
  • Dos campos dentro de una etiqueta. Una etiqueta da nombre a un campo; el segundo queda sin etiqueta.
  • Un enlace dentro de la etiqueta de un checkbox, como "Acepto las condiciones" con "condiciones" como enlace. Parte de la línea alterna la casilla y parte abre una página, lo que es fácil de pulsar por error. Pon el enlace fuera de la etiqueta.
  • Ocultar la etiqueta con display: none. Usa una clase de ocultación visual.
  • Texto junto a un campo que no es un <label>. Se ve igual y no hace nada. Para el formulario que rodea a tus campos, consulta formularios HTML.

Preguntas frecuentes

¿Qué hace la etiqueta label en HTML?

Da nombre a un campo de formulario. Los lectores de pantalla leen la etiqueta cuando el campo recibe el foco, y al pulsar la etiqueta el foco pasa al campo, o se alterna si es un checkbox o un radio button.

¿Qué es el atributo for de un label?

for contiene el id del campo al que pertenece la etiqueta: <label for="email">Email</label> <input id="email">. Debe coincidir exactamente con el id, no con el name.

¿Pongo el input dentro del label o uso for?

Las dos formas funcionan en los navegadores y lectores de pantalla actuales. Envolver no necesita ids; for e id permiten que la etiqueta y el campo estén en sitios distintos del marcado, como celdas de tabla separadas. Muchos equipos envuelven y además añaden for.

¿Un placeholder puede sustituir a un label?

No. El placeholder desaparece en cuanto el lector escribe, suele tener poco contraste y no siempre se anuncia como nombre del campo. Usa un <label> visible y deja el placeholder para un valor de ejemplo, si acaso.

¿Cómo oculto un label pero lo mantengo para los lectores de pantalla?

Mantén el <label> y ocúltalo visualmente con una clase que lo reduzca a 1 píxel y lo recorte, en lugar de display: none, que también lo oculta a los lectores de pantalla. Para un campo sin sitio para ninguna etiqueta, la alternativa es aria-label en el campo.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR