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.

×