La guía completa de accesibilidad para notificaciones tipo toast, alertas y banners: lectores de pantalla, foco, diseño que no desaparece, historial y prioridad de errores (WCAG 2.1 AA)
Resumen ejecutivo (puntos clave primero)
- La UI de notificaciones (toasts/alertas/banners) es un área donde los errores pueden provocar fácilmente problemas como que los usuarios no las noten, no puedan leerlas, se interrumpan sus interacciones o se sature la salida del lector de pantalla.
- Lo esencial es: (1) clasificar por severidad (éxito/info/advertencia/error), (2) dejar claro el significado con texto, (3) usar correctamente las regiones en vivo (live regions), (4) asegurar que las notificaciones que se cierran automáticamente puedan controlarse, (5) proporcionar un historial para recuperar avisos perdidos.
- El núcleo está en la distinción entre
role="status"yrole="alert". El éxito debe ser “silencioso”; los errores deben ser “contundentes”.- Evita notificaciones que roben el foco; solo cuando sea necesario —como en un resumen de errores— debes guiar el foco de forma intencional.
- Este artículo incluye plantillas de implementación listas para usar (HTML/CSS/JS), plantillas de copy, anti-patrones y una prueba rápida de 5 minutos.
Público objetivo (concreto): diseñadores UI/UX, ingenieros front-end, responsables de design systems, PMs/directores, QA/testers, CS/operaciones (cualquier persona involucrada en el diseño de mensajes de error)
Nivel de accesibilidad: orientado al cumplimiento WCAG 2.1 AA (relacionado: 4.1.2, 2.2.2, 2.4.3, 2.4.7, 3.3.1, 3.3.3, 1.4.13, entre otros)
1. Introducción: Las notificaciones existen para “comunicar”, pero a menudo son lo que menos comunica
“Guardado.” “Añadido al carrito.” “Ocurrió un error.”—Las notificaciones son señales que permiten a los usuarios avanzar con confianza.
Sin embargo, en productos reales es común que las notificaciones “no se entreguen” porque:
- aparecen brevemente en una esquina y desaparecen
- dependen solo del color para transmitir significado
- no son anunciadas por tecnologías de asistencia
- sí se anuncian, pero en ráfagas rápidas que generan congestión
- roban el foco y detienen el flujo del usuario
La UI de notificaciones se sitúa en la intersección entre accesibilidad y UX. Cuando se hace bien, ayuda no solo a usuarios de tecnologías de asistencia, sino también a personas en móvil, en entornos ruidosos o simplemente ocupadas. Este artículo resume cuidadosamente prácticas de diseño e implementación para que las notificaciones lleguen de forma fiable a los usuarios.
2. Empieza por la clasificación: separa las notificaciones por “severidad” y “necesidad de acción”
Si muestras todo como el mismo toast, tarde o temprano fallará. Primero, clasifica en cuatro tipos.
2.1 Éxito
- Ejemplo: guardado completado, copia completada
- Acción: generalmente no requerida
- Recomendado: toast +
role="status"(de forma discreta)
2.2 Información
- Ejemplo: filtros aplicados, número de resultados de búsqueda
- Acción: no requerida a opcional
- Recomendado:
role="status"y, si es necesario, historial
2.3 Advertencia
- Ejemplo: fecha límite próxima, entrada incompleta
- Acción: opcional a requerida
- Recomendado: banner (parte superior de la página) + enlace/botón para resolverlo
2.4 Error
- Ejemplo: envío fallido, permisos insuficientes
- Acción: casi siempre requerida
- Recomendado: banner/inline prominente +
role="alert", que no desaparezca, y ofrecer solución
Incorporar esta clasificación en tu design system reduce drásticamente los accidentes relacionados con notificaciones.
3. Fundamentos de live regions: lo esencial es saber cuándo usar status vs alert
3.1 role="status" (educado, no interrumpe)
- Para mensajes de éxito, actualizaciones de conteo, etc.
- No “interrumpe” al lector de pantalla
- Si se actualiza repetidamente, los anuncios pueden retrasarse — mantén el mensaje breve
<div id="status" role="status" aria-atomic="true" class="sr-only"></div>
3.2 role="alert" (interrumpe, máxima prioridad)
- Para fallos, advertencias críticas, acciones bloqueadas
- Interrumpe el anuncio actual
- Su uso excesivo convierte la UI en algo que “siempre grita”, así que contrólalo según la severidad
<div id="alert" role="alert" aria-atomic="true"></div>
3.3 Cómo pensar en aria-atomic="true"
Úsalo cuando quieras que se lea todo el texto aunque solo cambie una parte.
Como las notificaciones deben ser breves, activarlo suele hacer el comportamiento más estable.
4. Diseño de notificaciones que se cierran automáticamente (toasts): legibles, detenibles y revisables
4.1 Limita el auto-cierre solo al “éxito”
Si los errores o advertencias importantes desaparecen por sí solos, los usuarios los perderán.
Como regla general:
- Éxito: puede cerrarse automáticamente en 3–5 segundos
- Error: no debe desaparecer (o debe permanecer hasta que el usuario lo cierre)
4.2 Haz que sea “detenible”
Si el toast recibe foco, pausar el temporizador de cierre es considerado.
4.3 Un “historial” rescata lo perdido
Cuando los usuarios están ocupados, escuchando anuncios o desplazándose, pueden perder avisos.
Un centro de notificaciones (historial) permite recuperarlos después.
5. Plantilla de implementación: toast de éxito + historial (copiar/pegar OK)
5.1 HTML
<div class="toaster" aria-label="Notifications">
<div id="toast" class="toast" role="status" aria-atomic="true" hidden>
<p id="toastMsg">Saved.</p>
<button type="button" id="toastClose" aria-label="Close notification">×</button>
</div>
<details class="log">
<summary>Notification history</summary>
<ul id="logList"></ul>
</details>
</div>
<div id="live" class="sr-only" role="status" aria-atomic="true"></div>
5.2 CSS (mínimo)
.sr-only{ position:absolute; left:-9999px; }
.toast{
position:fixed; right:1rem; bottom:1rem;
max-width:min(28rem, 90vw);
background:#111; color:#fff;
border-radius:.75rem; padding:.75rem 1rem;
box-shadow:0 8px 24px rgba(0,0,0,.25);
}
.toast button{ margin-left:.75rem; }
:focus-visible{ outline:3px solid #FF9900; outline-offset:3px; }
5.3 JS (notificación de éxito)
const toast = document.getElementById('toast');
const toastMsg = document.getElementById('toastMsg');
const toastClose = document.getElementById('toastClose');
const logList = document.getElementById('logList');
const live = document.getElementById('live');
let timer = null;
function showToast(message){
// Anunciar mediante live region (funciona incluso sin el toast visual)
live.textContent = message;
// Toast visual
toastMsg.textContent = message;
toast.hidden = false;
// Añadir al historial
const t = new Date().toLocaleTimeString();
logList.insertAdjacentHTML('afterbegin', `<li>${t}: ${escapeHtml(message)}</li>`);
// Auto-cierre (ejemplo para éxito)
clearTimeout(timer);
timer = setTimeout(hideToast, 3500);
}
function hideToast(){
toast.hidden = true;
}
toastClose.addEventListener('click', hideToast);
// No cerrar mientras tenga foco (más fácil de leer)
toast.addEventListener('focusin', ()=> clearTimeout(timer));
function escapeHtml(s){
return s.replace(/[&<>"']/g, c => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]));
}
// Ejemplo: tras guardar con éxito
// showToast('Saved.');
Notas:
- Proporciona una live region
role="status"separada para anuncios además del toast visual- Usa historial para recuperar notificaciones perdidas
- Mientras tenga foco, no debe cerrarse automáticamente
6. Diseño de notificaciones de error: persistentes, accionables y conscientes del contexto
Los errores no son solo “notificaciones”; son “instrucciones para corregir”.
Por lo tanto, necesitas:
- qué ocurrió
- cómo solucionarlo
- dónde solucionarlo (enlaces)
6.1 Errores en formularios: resumen + por campo (patrón repetible)
En formularios, un resumen con role="alert" en la parte superior de la página y mover el foco al primer error es una estrategia sólida.
6.2 Errores de red: reintentar + alternativa
Acompaña el mensaje con:
- un botón “Reintentar”
- una nota sobre borradores guardados
- una vía de soporte/contacto
7. Gestión del foco: por defecto, “no lo robes”
7.1 Regla: los toasts de éxito no deben robar el foco
Si el usuario está escribiendo, es mejor que continúe.
7.2 Excepción: errores que requieren corrección deben guiar el foco intencionalmente
Tras enviar un formulario, si se necesita corrección:
- mueve el foco al resumen de errores
- proporciona enlaces de salto a cada error
Esto es razonable.
7.3 Evita la congestión de anuncios por notificaciones rápidas
- consolida notificaciones del mismo tipo (por ejemplo, “Guardando…” → “Guardado.”)
- espacia actualizaciones rápidas
- envía mensajes de baja prioridad al historial
8. Plantillas de copy: sé breve y deja clara la siguiente acción
8.1 Éxito
- “Guardado.”
- “Copiado.”
- “Añadido al carrito.”
8.2 Información
- “Resultados de búsqueda: 25”
- “Filtros aplicados (Precio: hasta ¥10.000)”
8.3 Advertencia
- “Tu entrada está incompleta. Revisa los campos obligatorios.”
8.4 Error (causa + solución)
- “Error al guardar. Comprueba tu conexión e inténtalo de nuevo.”
- “No tienes permiso. Contacta con un administrador.”
No te quedes solo en “qué ocurrió”. Añade una línea breve indicando qué hacer después.
9. Anti-patrones comunes: por qué la UI de notificaciones provoca accidentes
| Anti-patrón | ¿Qué ocurre? | Solución |
|---|---|---|
Todo es alert |
El lector de pantalla se congestiona | Usa status para éxito/info |
| Los errores desaparecen en 3 segundos | No se pueden corregir | Mantén los errores + ofrece acciones |
| El significado cambia solo por color | Se pierde el mensaje | Añade texto + iconos |
| El toast roba el foco | Se detiene la escritura | No lo robes por defecto |
| El toast aparece fuera de pantalla/se superpone | No se nota | Posición fija + ancho máximo |
| El botón de cierre es solo “×” sin nombre | El lector no lo identifica | aria-label="Close notification" |
| El progreso es solo un spinner | Estado poco claro | Añade texto como “Enviando…” |
10. Prueba rápida de 5 minutos: condiciones mínimas para “notificaciones entregadas”
- Las notificaciones de éxito se anuncian con
role="status" - Los errores se anuncian claramente con
role="alert"(sin abusar) - Los errores no se cierran automáticamente y ofrecen acción (reintentar, etc.)
- Los toasts no roban el foco (excepción: resumen de errores)
- La visibilidad del foco es suficiente (claro/oscuro)
- El contraste del texto es suficiente (objetivo 4.5:1)
- El botón de cierre es operable con teclado y tiene nombre accesible
- Existe historial de notificaciones para rescatar pérdidas (recomendado)
11. Valor concreto para cada audiencia
- Usuarios de lector de pantalla: El uso adecuado de
status/alertgarantiza que solo se anuncie la información necesaria y reduce la congestión. - Usuarios de teclado: Las notificaciones no roban el foco; cuando es necesario, la guía de foco es intencional y predecible.
- Usuarios con diferencias cognitivas: Copy breve + acción sugerida + historial para revisión posterior aumenta la tranquilidad.
- Usuarios móviles: Un ancho máximo legible y botón de cierre fácil de tocar reducen toques erróneos.
- Operaciones/CS: Un mejor diseño de notificaciones reduce consultas (“¿Se guardó?”, “¿Dónde falló?”), disminuyendo la carga de soporte.
12. Evaluación del nivel de accesibilidad (lo que logra este artículo)
- Criterios clave relacionados con WCAG 2.1 AA
- 4.1.2 Nombre, función, valor: roles para notificaciones (status/alert), nombre accesible para el botón de cierre
- 2.2.2 Pausar, detener, ocultar: control de notificaciones con auto-cierre cuando sea necesario
- 2.4.3 Orden del foco / 2.4.7 Foco visible: prevención de escenarios de “foco perdido”
- 3.3.1 Identificación de errores / 3.3.3 Sugerencia ante errores: contenido claro + solución
- 1.4.3 / 1.4.11: contraste de texto y elementos no textuales
- 1.4.13: diseño coherente con contenido revelado por hover/foco (tooltips, etc.)
- Mejorar la UI de notificaciones favorece el cumplimiento AA y aumenta directamente la reducción de ansiedad y las tasas de finalización.
13. Conclusión: Las notificaciones existen para que los usuarios “noten, entiendan y avancen”
- Clasifica las notificaciones por severidad; entrega el éxito de forma discreta y los errores de forma contundente.
- Usa adecuadamente
role="status"yrole="alert"para evitar congestión de anuncios. - Limita el auto-cierre al éxito; añade pausa o historial para rescatar pérdidas.
- No robes el foco por defecto; guíalo intencionalmente solo cuando se requiera corrección.
- Mantén el copy breve; añade causa + siguiente acción para reducir confusión.
- Usa plantillas y la prueba rápida de 5 minutos para preservar “notificaciones entregadas” tras cada actualización.
Las notificaciones son pequeños elementos de UI, pero contienen palabras importantes que sostienen la confianza del usuario.
Que las notificaciones de tu producto lleguen a todas las personas en cualquier contexto—e iluminen suavemente el siguiente paso.
