Práctica de diseñar y desarrollar productos digitales que puedan ser usados por todas las personas, incluyendo aquellas con discapacidades visuales, auditivas, motoras o cognitivas.
Accesibilidad web (a11y) es la práctica de hacer que los productos digitales sean usables por todas las personas, independientemente de sus capacidades. No es un feature opcional — es un requisito fundamental de calidad y, en muchas jurisdicciones, un requisito legal.
Aproximadamente el 16% de la población mundial vive con alguna forma de discapacidad (OMS). Diseñar sin considerar accesibilidad excluye activamente a una de cada seis personas.
Las Web Content Accessibility Guidelines (WCAG) son el estándar internacional publicado por el W3C. La versión 2.2, publicada en octubre de 2023, añade 9 nuevos criterios de éxito sobre la versión 2.1, enfocados en accesibilidad cognitiva, usabilidad móvil y autenticación.
Tres niveles de conformidad:
| Criterio | Nivel | Qué resuelve |
|---|---|---|
| Focus Not Obscured (Minimum) | AA | El elemento con foco no puede estar completamente oculto por otros elementos |
| Focus Not Obscured (Enhanced) | AAA | El elemento con foco debe ser completamente visible |
| Focus Appearance | AAA | Indicador de foco con área y contraste mínimos |
| Dragging Movements | AA | Toda funcionalidad de arrastrar debe tener alternativa sin arrastre |
| Target Size (Minimum) | AA | Objetivos táctiles de al menos 24x24 CSS pixels |
| Consistent Help | A | Mecanismos de ayuda en la misma posición relativa entre páginas |
| Redundant Entry | A | No pedir al usuario que reingrese información ya proporcionada |
| Accessible Authentication (Minimum) | AA | No requerir pruebas cognitivas (ej: transcribir CAPTCHAs) para autenticarse |
| Accessible Authentication (Enhanced) | AAA | Sin pruebas cognitivas de ningún tipo en el flujo de autenticación |
La mayoría de regulaciones (ADA en EE.UU., EN 301 549 en Europa, Ley Europea de Accesibilidad vigente desde junio 2025) exigen nivel AA como mínimo.
Los cuatro principios que organizan todos los criterios WCAG:
HTML semántico es siempre la primera opción. ARIA (Accessible Rich Internet Applications) se usa cuando HTML nativo no puede expresar el rol o estado de un componente.
<button> en lugar de <div role="button">role="heading" en un <button>role="presentation" o aria-hidden="true" en elementos focusablesfunction Tabs({ tabs, activeTab, onChange }: TabsProps) {
return (
<div>
<div role="tablist" aria-label="Secciones">
{tabs.map((tab, i) => (
<button
key={tab.id}
role="tab"
id={`tab-${tab.id}`}
aria-selected={activeTab === tab.id}
aria-controls={`panel-${tab.id}`}
tabIndex={activeTab === tab.id ? 0 : -1}
onClick={() => onChange(tab.id)}
onKeyDown={(e) => {
if (e.key === 'ArrowRight') onChange(tabs[(i + 1) % tabs.length].id);
if (e.key === 'ArrowLeft') onChange(tabs[(i - 1 + tabs.length) % tabs.length].id);
}}
>
{tab.label}
</button>
))}
</div>
{tabs.map((tab) => (
<div
key={tab.id}
role="tabpanel"
id={`panel-${tab.id}`}
aria-labelledby={`tab-${tab.id}`}
hidden={activeTab !== tab.id}
>
{tab.content}
</div>
))}
</div>
);
}Puntos clave: role="tablist" agrupa los tabs, aria-selected indica el activo, aria-controls conecta tab con panel, y las flechas permiten navegación por teclado sin Tab.
Las herramientas automatizadas detectan entre el 30% y el 40% de los problemas de accesibilidad — los que son verificables por análisis de código (contraste, alt text faltante, roles ARIA inválidos). El 60-70% restante requiere juicio humano: ¿el texto alternativo es significativo? ¿El orden de lectura tiene sentido? ¿La navegación por teclado es lógica?
| Aspecto | Automatizado | Manual |
|---|---|---|
| Cobertura WCAG | 30-40% de criterios | 100% de criterios |
| Velocidad | Segundos | Horas |
| Consistencia | Determinista | Depende del evaluador |
| Detecta | Contraste, alt faltante, ARIA inválido, estructura HTML | Orden de lectura, calidad de alt text, flujos de teclado, comprensibilidad |
| Herramientas | axe-core, Lighthouse, eslint-plugin-jsx-a11y | Screen readers (NVDA, VoiceOver), navegación por teclado, revisión experta |
| Cuándo | En cada commit (CI) | Antes de releases, en auditorías periódicas |
La estrategia efectiva combina ambos: automatizado en CI/CD para prevenir regresiones, manual antes de cada release para validar la experiencia real.
axe-core de Deque es el motor de testing de accesibilidad más usado. Se integra con Playwright, Cypress, Jest y como GitHub Action.
import { test, expect } from '@playwright/test';
import AxeBuilder from '@axe-core/playwright';
test('homepage has no accessibility violations', async ({ page }) => {
await page.goto('/');
const results = await new AxeBuilder({ page })
.withTags(['wcag2a', 'wcag2aa', 'wcag22aa'])
.analyze();
expect(results.violations).toEqual([]);
});{
"extends": ["plugin:jsx-a11y/recommended"],
"rules": {
"jsx-a11y/anchor-is-valid": "error",
"jsx-a11y/no-autofocus": "warn",
"jsx-a11y/label-has-associated-control": "error"
}
}Este plugin detecta problemas en tiempo de desarrollo — antes de que el código llegue al navegador. Combinado con axe-core en CI, cubre la capa automatizada completa.
Para testing manual, VoiceOver (macOS/iOS) y NVDA (Windows) son los screen readers más usados:
Cmd + F5 en macOSh1 → h2 → h3 es lógicaaria-live o gestión de focoLa accesibilidad no es un nice-to-have — es un requisito legal en la mayoría de mercados (ADA, Ley Europea de Accesibilidad, EN 301 549) y una práctica de ingeniería que mejora la calidad para todos los usuarios. Un sitio accesible funciona mejor con teclados, conexiones lentas, pantallas pequeñas y dispositivos diversos.
Desde la perspectiva de arquitectura, la accesibilidad es más barata cuando se diseña desde el inicio. Retrofitting accesibilidad en un sistema de diseño existente puede requerir reescribir componentes completos. Integrar axe-core en CI/CD y usar eslint-plugin-jsx-a11y en desarrollo previene regresiones sin esfuerzo manual — pero solo cubre el 30-40% de los criterios. El testing manual con screen readers sigue siendo necesario antes de cada release.
Colección de componentes reutilizables, patrones y guías que aseguran consistencia visual y de interacción en productos digitales a escala.
Biblioteca de JavaScript para construir interfaces de usuario mediante componentes declarativos y reutilizables, con un ecosistema que abarca desde SPAs hasta aplicaciones full-stack con Server Components.
Disciplina que abarca todos los aspectos de la interacción de una persona con un producto, sistema o servicio, buscando que sea útil, usable y satisfactorio.
Enfoques y niveles de testing para validar que el software funciona correctamente, desde unit tests hasta tests end-to-end y testing en producción.
Continuous Integration y Continuous Delivery/Deployment — prácticas que automatizan la integración de código, testing y entrega a producción. Fundamento de la ingeniería de software moderna.
Componente de menú headless para React con accesibilidad completa, cero estilos y soporte para teclado. Publicado en npm.
Estándares web nativos para crear componentes reutilizables y encapsulados que funcionan en cualquier framework o sin framework.