aria-controls
Identifica el elemento o elementos cuya presencia o contenido gobierna este control. Pares habituales: una pestaña controla su tabpanel, un botón de revelación controla una región desplegada. La compatibilidad con las tecnologías de apoyo es irregular — se recomienda usarlo con moderación.
Cuándo utilizarlo
En un control cuya activación modifica un elemento distinto en la página — los ejemplos canónicos son la relación pestaña → tabpanel y un botón de revelación → panel desplegado. Indica a las tecnologías de apoyo que «operar este widget afectará a aquel otro», ofreciendo a los usuarios avanzados una forma de saltar del control al elemento controlado.
No debe usarse de forma indiscriminada en cada interacción. La mayoría de los manejadores de clic no necesitan aria-controls; se reserva para los casos en que el elemento controlado está genuinamente separado en el DOM y el usuario se beneficia de conocer la conexión.
Cómo se comporta
El valor es una lista de identificadores de elementos separados por espacios para el elemento o elementos controlados. El elemento controlado debe existir en el DOM en el momento en que se consulta la relación — si el tabpanel solo se monta cuando se activa la pestaña, la referencia queda sin resolver para los usuarios de tecnologías de apoyo hasta que el panel aparece.
La compatibilidad es el punto débil. JAWS expone un atajo para «ir al elemento controlado», pero VoiceOver y NVDA ignoran en gran medida el atributo fuera de patrones específicos (pestañas, comboboxes). Esto significa que aria-controls rara vez es lo que hace accesible una funcionalidad — es una mejora sobre roles correctos, gestión de foco y aria-expanded. Primero se construye el patrón correctamente; aria-controls se añade al final.
Errores frecuentes
- Tratar
aria-controlscomo sustituto del desplazamiento del foco. Un botón «Ir a resultados» debe mover el foco al activarse; añadiraria-controlsno realiza esa acción. - Apuntar a un elemento que todavía no está en el DOM. La referencia no se resuelve hasta que el panel se renderiza.
- Olvidar establecer también
aria-expandeden un botón de revelación.aria-controlsdice «influyo en ese elemento»;aria-expandeddice «y actualmente está abierto / cerrado». - Usar
aria-controlsen un selector personalizado para apuntar a una lista de opciones — el patrón correcto esrole="combobox"másaria-controlsen el campo de entrada, conaria-activedescendantpara la opción resaltada. - Añadir
aria-controlsen todos los botones «por completitud». Solo genera ruido; nada depende de él.
Ejemplo
<button
type="button"
aria-expanded="false"
aria-controls="faq-1-answer"
>
¿Cuál es su política de devoluciones?
</button>
<div id="faq-1-answer" hidden>
Las devoluciones se procesan en un plazo de 14 días …
</div>