Semántica HTML y WAI-ARIA: Roles implícitos y acoplamiento BEM
📄 Descargar Edición PDFEl Desafío (Síntoma)
Durante la auditoría de las últimas vistas (Engineering Dashboard y CV Semántico), surgieron dos incidentes arquitectónicos aparentemente inconexos pero nacidos de la misma causa: la falta de semántica estricta.
- Ceguera de Lector de Pantalla: Se inyectó un atributo
aria-label="Métricas de rendimiento del sistema"a un<div>genérico que actuaba como contenedor del dashboard. Sin embargo, las tecnologías asistivas a menudo lo ignoraban por completo al leer la página. - Acoplamiento BEM: Los botones de llamada a la acción (CTA) del Hero en el currículum estaban utilizando la clase
.nav__link. Aunque visualmente resolvía el problema temporalmente, ataba el diseño de un componente local a la barra de navegación global de la web.
La Maniobra (Lógica)
- Restauración WAI-ARIA: Se inyectó explícitamente el atributo
role="group"al<div>genérico del dashboard (<div class="hero__dashboard" role="group" aria-label="...">). - Desacoplamiento BEM: Se eliminó la clase
.nav__linkde los botones del Hero en el HTML. En su lugar, se crearon reglas SASS nativas anidadas dentro de su propio bloque (.hero__cta a) para gobernar su aspecto. Adicionalmente, se restituyó la etiqueta estructural<h2>para la declaración de intenciones en el currículum que había quedado huérfana.
El Aprendizaje / Deuda Técnica
Este incidente refuerza dos reglas fundamentales en el ecosistema:
-
WAI-ARIA y Elementos Genéricos: Un
aria-labelpor sí solo no convierte un elemento genérico (div,span) en algo semánticamente relevante. El estándar dictamina que, si un elemento carece de semántica nativa (como sí la tienen<nav>,<main>, o<button>), el navegador y el Árbol de Accesibilidad no le darán un "nombre accesible" a menos que se le asigne un rol válido (comogrouporegion). -
Principio de Responsabilidad Única en CSS: Reutilizar clases globales (como
.nav__link) para "ahorrar" código en botones aislados es un antipatrón en la metodología BEM. Genera un código frágil: cualquier cambio futuro de espaciado o color en el menú global habría destrozado visualmente los botones de la portada.
Si no tiene rol, no existe. Si no es su bloque, no usa su clase.