ARIA: Accessible Rich Internet Applications, Roles, States

ARIA agrega información accesibilidad a UIs dinámicas vía roles, states, properties, para screen readers cuando HTML solo no es suficiente.

¿Qué es ARIA?

ARIA (Accessible Rich Internet Applications) es una spec W3C que añade información accesibilidad a páginas web y aplicaciones vía atributos HTML. Le dice a tecnologías asistivas (screen readers, voice control, switch devices) qué son los elementos UI dinámicos, su state y cómo se comportan, cuando HTML solo no transmite ese significado.

ARIA fue creado porque los elementos HTML como <button> son accesibles por default, pero widgets custom construidos con <div> son invisibles para tech asistiva sin ayuda.

Las tres categorías de atributos ARIA

TipoPropósitoEjemplo
RolesQué ES el elementorole="button"
PropertiesAtributos describiendo elementoaria-label="Close"
StatesState dinámico actualaria-expanded="true"

La primera regla de ARIA: no uses ARIA

<!-- MAL -->
<div role="button" tabindex="0">Submit</div>

<!-- BIEN -->
<button>Submit</button>

Roles ARIA comunes

RolePara
role="button"Botones custom
role="dialog"Diálogos modal
role="tablist" + tab + tabpanelUI tabs
role="menu" + menuitemMenús aplicación
role="combobox"Inputs autocomplete
role="tree"Vistas tree
role="alert"Mensajes error
role="status"Updates status non-crítico
role="navigation"Regiones navegación
role="main"Contenido main

Properties ARIA comunes

PropertyUso
aria-labelNombre accesible
aria-labelledbyReferenciar elemento que nombra esto
aria-describedbyReferenciar descripción más larga
aria-hidden="true"Esconder de tech asistiva
aria-haspopupElemento triggea popup
aria-controlsElemento controla otro
aria-currentItem actual en un set

States ARIA comunes

StateUso
aria-expanded¿Disclosure abierto?
aria-selected¿Tab/option seleccionado?
aria-checkedState checkbox/radio
aria-disabled¿Elemento deshabilitado?
aria-pressedState toggle button
aria-busyElemento siendo updated
aria-invalidField form inválido

Live regions: anunciar updates dinámicos

<div aria-live="polite" aria-atomic="true">
  {{ savedMessage }}
</div>

<div role="alert">Error: connection lost</div>

Ejemplo real-world: tabs accesibles

<div role="tablist" aria-label="Account sections">
  <button role="tab" aria-selected="true" aria-controls="profile-panel" id="profile-tab">
    Profile
  </button>
</div>
<div role="tabpanel" id="profile-panel" aria-labelledby="profile-tab">
  Profile content
</div>

Mejores prácticas ARIA

  • Usar HTML nativo primero.
  • No cambiar semántica nativa.
  • Todo ARIA interactivo debe ser keyboard-accesible.
  • No esconder elementos focuseables.
  • Proveer labels visibles.
  • Testear con screen reader.
  • Seguir patterns APG.
  • Actualizar states cuando UI cambia.

Pitfalls ARIA comunes

  • ARIA incorrecto sobre HTML correcto.
  • aria-hidden en elementos focuseables.
  • States stale.
  • Sobreuso de role="application".
  • Live regions firing demasiado.
  • Sin soporte teclado.
  • aria-label conflictivo con texto visible.

FAQ: ARIA

¿Debería usar ARIA en cada elemento?

No, solo cuando HTML nativo no expresa la semántica.

¿Cuál es la "primera regla de ARIA"?

"No uses ARIA".

¿ARIA ayuda al SEO?

Indirectamente.

¿Qué es WAI-ARIA APG?

Authoring Practices Guide.

¿Puedo usar ARIA en SVG?

Sí.

¿Qué es aria-current?

Marca el item actual en un set.

¿Cómo testeo ARIA?

Tools automatizadas + manual screen reader testing.

Testea ARIA + accesibilidad con LoadFocus

LoadFocus corre auditorías Lighthouse desde 25+ regiones. Regístrate en loadfocus.com/signup.

¿Qué tan rápido es tu sitio web?

Mejora su velocidad y SEO sin problemas con nuestra Prueba de Velocidad gratuita.

Prueba de velocidad de sitio web gratis

Analice la velocidad de carga de su sitio web y mejore su rendimiento con nuestro comprobador de velocidad de página gratuito.

×