Lección 3 de 10 · 14 min de lectura · Revisado el 26/10/2026
Cómo se anuncia un campo: nombre accesible, estados y 2.5.3 Etiqueta en el nombre
En la lección anterior aprendimos a asociar etiquetas, grupos y ayudas con <label>, <fieldset> y aria-describedby. Ahora miramos el resultado desde el otro lado: qué recibe de verdad la tecnología de apoyo. Como vimos en el curso N3-C1, el navegador construye un árbol de accesibilidad y, para cada campo, expone un rol, un nombre, una descripción, unos estados y un valor. Si entiendes cómo se calcula cada uno, depurarás en minutos fallos que parecen misteriosos y cumplirás dos criterios que se incumplen a menudo sin que nadie lo note: 4.1.2 Nombre, función, valor (A) y 2.5.3 Etiqueta en el nombre (A).
Qué anuncia un lector de pantalla al llegar a un campo
Cuando el foco entra en un campo, el lector compone su anuncio con las propiedades que le entrega el navegador. El orden y la redacción cambian entre NVDA, JAWS, VoiceOver y TalkBack, pero los ingredientes son los mismos.
| Propiedad | De dónde sale | Ejemplo de anuncio |
|---|---|---|
| Rol | El elemento y su type | «cuadro de edición», «casilla de verificación», «cuadro combinado» |
| Nombre | aria-labelledby, aria-label, <label>, title, placeholder | «Correo electrónico» |
| Descripción | aria-describedby (o title si no se usó como nombre) | «Te enviaremos aquí el justificante» |
| Estados | required, aria-invalid, disabled, readonly, checked | «obligatorio», «no válido», «no disponible», «marcado» |
| Valor | Lo escrito o la opción elegida | «30001» |
Sin nombre, el lector solo dice «cuadro de edición». Con un nombre equivocado, la persona escribe con toda confianza el dato que no es. Ambos casos incumplen 4.1.2, y el segundo es más traicionero porque nadie lo detecta mirando la pantalla.
Cómo calcula el navegador el nombre
El cálculo lo definen dos especificaciones del W3C: Accessible Name and Description Computation (el algoritmo general) y HTML Accessibility API Mappings (cómo se aplica a cada elemento HTML). Para un campo de texto, el navegador prueba las fuentes en un orden fijo y se queda con la primera que da un texto no vacío. Las demás se descartan: no se suman.
Infografía · Proceso
Cómo calcula el navegador el nombre de un campo
Prueba las fuentes en este orden y se queda con la primera que da texto; las demás no se suman
- Paso 1: aria-labelledbyGana a todo: une los textos de los id citados, en el orden en que se escriben
- Paso 2: aria-labelTexto literal invisible; si existe, la etiqueta visible deja de contar
- Paso 3: label o legend nativosLo recomendado: label con for en cada campo y legend en cada fieldset
- Paso 4: titleÚltimo recurso: solo se ve al pasar el ratón, nunca con teclado ni táctil
- Paso 5: placeholderSi no hay nada más; desaparece al escribir y no es una etiqueta
- Paso 6: Sin nombreEl lector dice solo «cuadro de edición»: incumple 4.1.2
Leer la infografía como texto
Proceso de seis pasos que sigue el navegador para calcular el nombre accesible de un campo de texto. Primero mira aria-labelledby: si existe, gana a todo y une los textos de los id citados en el orden escrito. Si no, usa aria-label, un texto invisible que anula la etiqueta visible. Después, la opción recomendada: el label asociado con for o, en un fieldset, su legend. Si no hay nada de eso, recurre al atributo title, que solo se ve al pasar el ratón. En penúltimo lugar usa el placeholder, que desaparece al escribir. Si ninguna fuente da texto, el campo queda sin nombre y el lector solo dice «cuadro de edición», lo que incumple 4.1.2 Nombre, función, valor.
aria-labelledby sustituye, no añade
aria-labelledby gana a todo, incluido el <label> visible. Es útil para componer el nombre con varios textos de la página, pero usado a la ligera borra la etiqueta original.
Ejemplo
Incorrecto: se quiso «añadir contexto» y el campo pasó a llamarse solo «Datos del solicitante».
<h2 id="sec-solicitante">Datos del solicitante</h2>
<label for="dni">DNI o NIE</label>
<input id="dni" name="dni" aria-labelledby="sec-solicitante">Correcto, cuando de verdad hace falta componer el nombre: una tabla de pedido donde cada fila tiene un campo de cantidad. Los id se concatenan en el orden en que se escriben.
<th id="col-cantidad" scope="col">Cantidad</th>
…
<th id="prod-3" scope="row">Mochila escolar azul</th>
<td><input type="text" inputmode="numeric"
aria-labelledby="col-cantidad prod-3"></td>
<!-- Nombre calculado: «Cantidad Mochila escolar azul» -->aria-label pisa la etiqueta visible
aria-label va segundo. Si un campo tiene a la vez un <label> visible y un aria-label, el lector anuncia el aria-label y la etiqueta que ve la persona deja de usarse como nombre del campo. Es la causa más común de incumplimiento de 2.5.3, como veremos enseguida.
title y placeholder: los últimos recursos
Solo cuando no hay nada de lo anterior se recurre a title y, en último lugar, al placeholder. Que el navegador los use como nombre no los convierte en buenas etiquetas: title solo se ve al pasar el ratón (nunca con teclado ni en pantallas táctiles) y el placeholder desaparece al escribir, como vimos en la lección anterior.
Error frecuente
Componentes reutilizables que generan siempre el mismo id. Si un formulario incluye dos veces el componente «Dirección» (envío y facturación) y ambos usan id="cp", los dos <label for="cp"> apuntan al primer campo y el segundo queda sin nombre. En React usa useId(); en otros entornos, genera los id con un prefijo por instancia. El validador de HTML del W3C y axe detectan los id duplicados.
2.5.3 Etiqueta en el nombre: lo que se ve es lo que se dice
Quien usa control por voz (Voice Control en macOS e iOS, Voice Access en Android, Dragon en Windows) activa los controles diciendo su nombre: ve un botón que pone «Enviar solicitud» y lo dice en voz alta. Si el nombre accesible de ese botón es otro, el programa no lo encuentra. Por eso 2.5.3 exige que, en los componentes que tienen una etiqueta visible con texto, el nombre accesible contenga ese texto. La técnica recomendada es que el nombre empiece por el texto visible.
- Visible «Enviar solicitud» y
aria-label="Enviar solicitud de ayuda escolar": cumple, porque lo contiene y empieza igual. - Visible «Enviar solicitud» y
aria-label="Tramitar": incumple. - Visible «Código postal» y
aria-label="CP": incumple, y además el lector anuncia una sigla que la persona no ha visto. - Visible «Nombre:» con nombre accesible «Nombre»: cumple; la puntuación y las mayúsculas no se consideran relevantes para este criterio.
Los botones que solo tienen un icono (una lupa, una papelera) no tienen etiqueta visible con texto, así que 2.5.3 no se aplica, pero siguen necesitando un nombre por 4.1.2. Elige el que diría cualquiera al verlo: «Buscar», «Eliminar».
Punto clave
La regla práctica es sencilla: si el control ya tiene texto visible, no añadas aria-label. Si de verdad necesitas más contexto para quien usa lector de pantalla, añádelo detrás del texto visible (con aria-describedby o con texto visualmente oculto al final), nunca en su lugar.
Modo formulario: por qué se pierden las instrucciones
Los lectores de pantalla de escritorio tienen dos formas de trabajar. En el modo de navegación (o exploración), la persona recorre todo el contenido con flechas y atajos. Al entrar en un campo de texto pasan al modo de foco (NVDA) o de formularios (JAWS) para que las teclas escriban en lugar de navegar. En ese modo, y siempre que se avanza con Tab, solo se oye lo que pertenece al control enfocado: nombre, rol, estados y descripción.
Consecuencia directa: un párrafo suelto entre dos campos («La contraseña debe tener al menos 8 caracteres») no se oye si nadie lo asocia al campo. La persona no lo sabrá hasta que el formulario la rechace. Lo mismo ocurre con las instrucciones colocadas después del botón de enviar o en una columna lateral.
- Lo imprescindible para rellenar el campo va en su nombre o en su descripción.
- El nombre, corto y estable: «Contraseña nueva». El formato y las reglas, en la descripción.
- Las instrucciones generales del formulario, antes del primer campo, para que se lean en el modo de navegación antes de empezar.
Estados que también se anuncian
Los estados completan el anuncio y tienen sus propias trampas:
requiredexpone el estado «obligatorio» y activa la validación nativa;aria-required="true"solo expone el estado. Usa el primero: aunque desactives las burbujas nativas connovalidate,requiredsigue exponiendo el estado «obligatorio»;aria-requiredqueda para controles personalizados que no admitenrequired.aria-invalid="true"se pone solo después de validar y solo en los campos que fallan. Un formulario que nace con todos los campos «no válidos» resta credibilidad al estado.disabledsaca el campo del orden de tabulación: quien navega con Tab no lo oye. Si un dato precargado importa (el NIF del titular que no se puede cambiar), usareadonly, que se puede enfocar y leer.
Error frecuente
Deshabilitar el botón «Enviar» hasta que el formulario sea válido. Quien usa lector de pantalla no lo encuentra al tabular, quien ve bien no sabe qué le falta y nadie recibe un mensaje de error que le oriente. Deja el botón activo y muestra los errores al pulsarlo, como vimos en la lección de validación. Si por algún motivo necesitas indicar que no está disponible, aria-disabled="true" lo mantiene enfocable y anunciado.
Cómo inspeccionarlo
No hace falta adivinar: el navegador muestra el resultado del cálculo. En las herramientas para desarrolladores de Chrome y Edge, pestaña Elements, panel Accessibility, el apartado de propiedades calculadas indica el rol, el nombre y de qué fuente ha salido cada parte (aria-labelledby, aria-label, label, title o placeholder), además de la descripción y los estados. Firefox tiene su propio inspector de accesibilidad. Después, escucha el campo con un lector de pantalla real: es lo que oirá la persona.
Pruébalo tú
Abre en Chrome un formulario que conozcas (el de contacto de tu web o el de una sede electrónica). Pulsa con el botón derecho sobre tres campos, elige «Inspeccionar» y, en el panel Accessibility, anota para cada uno el nombre calculado y su fuente. ¿Alguno toma el nombre del placeholder o del title? ¿Alguno tiene un aria-label distinto del texto visible? Esos son tus primeros hallazgos.
Resumen
- El lector anuncia rol, nombre, estados, descripción y valor; todos salen del código, no de la pantalla.
- El nombre se toma de la primera fuente disponible:
aria-labelledby,aria-label,<label>,titleyplaceholder, en ese orden; no se suman. - 2.5.3 exige que el nombre contenga el texto visible, idealmente al principio: si hay texto visible, no añadas
aria-label. - En modo formulario solo se oye lo asociado al campo: las instrucciones sueltas entre campos se pierden.
- Comprueba el nombre calculado en el panel de accesibilidad del navegador y escúchalo con un lector de pantalla.
Comprueba lo que has aprendido
Esta lección se puede leer libremente. Para hacer su test de 3 preguntas, los ejercicios prácticos con páginas reales, guardar tu avance y optar al examen y al certificado, matricúlate en el curso.