Accesibilidad Frontend: correcciones que también mejoran el SEO

¿Te fue útil?

Los errores de SEO más costosos que he visto no fueron actualizaciones de algoritmos ingeniosas. Fueron decisiones frontend aburridas:
un botón que no es un botón, un menú que solo funciona con mouse, una página cuyo “contenido” existe mayormente en divs y esperanza.
Google no abandona furioso como un usuario, pero sí indexa menos, entiende menos y te posiciona en consecuencia.

El trabajo de accesibilidad (A11y) suele venderse como cumplimiento, empatía o “lo correcto”. Cierto, y también: es una
forma implacable de eliminar ambigüedad del DOM. A los motores de búsqueda les encanta lo no ambiguo. A los equipos de respuesta a incidentes también.

Por qué la A11y y el SEO se solapan (y dónde no)

Los motores de búsqueda no son lectores de pantalla, pero comparten una dependencia básica: tu sitio debe explicarse en
una estructura legible por máquinas. Si tu UI depende de señales visuales (“esa cosa allí”) o de comportamientos implícitos
(manejadores de clics en divs), has creado una interfaz solo para humanos. Los humanos son geniales, pero no indexan a escala.

El solapamiento: estructura, claridad y resiliencia

  • HTML semántico da tanto a la tecnología asistiva como a los rastreadores un mapa. Encabezados, listas, landmarks, botones
    y controles de formulario reducen la conjetura. La conjetura no posiciona.
  • Alternativas textuales legibles (texto alt, texto de enlace, aria-label cuando corresponde) mejoran la comprensión
    cuando las imágenes no cargan, JS falla o un rastreador decide no renderizar tu app hoy.
  • Rendimiento y estabilidad son dependencias compartidas. Si tu página se mueve, salta o nunca se asienta,
    los usuarios con teclado sufren y los Core Web Vitals sufren. Esto último es un factor de posicionamiento; lo primero, un vector de demanda legal.
  • Navegación que funcione sin mouse suele ser navegación predecible en el DOM, que
    suele ser más fácil de analizar y menos frágil entre dispositivos y bots.

Donde no coinciden: ARIA no es un truco de posicionamiento

Seamos claros: añadir atributos ARIA no aumenta mágicamente el SEO. A veces ARIA es necesario; a menudo es un
parche sobre semántica ausente. Usa elementos nativos primero. ARIA viene después. Si tu estrategia de SEO incluye
“añadiremos aria-label a todo”, tu estrategia es “gastaremos dinero y seguiremos confundidos.”

Una verdad operacional aplica aquí: la fiabilidad sigue a los valores por defecto. Los valores por defecto del navegador
para elementos nativos son asombrosamente buenos. Los valores por defecto de la sopa de divs a medida son… creativos.

Una idea parafraseada de Richard Cook (seguridad de sistemas): el éxito oculta el trabajo que previene fallos hasta que un pequeño cambio lo expone.
La A11y y el SEO son lugares donde ese trabajo o se hace por adelantado—o se paga durante un incidente.

Hechos e historia interesantes que explican el desastre actual

La A11y y el SEO no “convergieron” por un comité. Convergieron porque ambos se preocupan por estructura interpretable,
comportamiento predecible y contenido que sobreviva la adversidad: redes lentas, JS roto, dispositivos antiguos y humanos que no
usan la interfaz como tu diseñador.

  1. El término “accesibilidad” precede a las aplicaciones web modernas. Las tecnologías asistivas tempranas existieron mucho antes
    de React; la web heredó décadas de expectativas sobre uso del teclado y alternativas textuales.
  2. WCAG 1.0 se publicó en 1999. Eso es más antiguo que la mayoría de las canalizaciones de compilación que actualmente mantienen tu frontend como rehén.
  3. La ADA es de 1990. Muchas empresas “modernas” la descubrieron cuando llegó una carta de reclamación, no cuando diseñaron la navegación.
  4. HTML5 introdujo elementos semánticos como <nav>, <main>, <article> en 2014.
    No se inventaron para SEO, pero ayudan a que rastreadores y tecnología asistiva coincidan en qué es una página.
  5. Google empezó a usar Core Web Vitals en sus sistemas de ranking en 2021. CLS e INP/LCP no son “métricas de a11y”,
    pero los mismos malos patrones de UI tienden a romper ambos.
  6. ARIA 1.0 fue Recomendación del W3C en 2014. Existe porque los autores seguían construyendo controles personalizados
    sin las affordances que ofrecen los controles nativos.
  7. Los lectores de pantalla parsean un árbol de semántica, no tu CSS. Si tu “botón” es un div con un manejador de clic,
    es invisible para esa capa semántica a menos que reinventes lo que el navegador haría gratis.
  8. Los motores de búsqueda pueden no ejecutar tu JS como tú lo haces. El renderizado puede retrasarse, limitarse o saltarse.
    HTML semántico accesible aumenta la probabilidad de que tu significado sobreviva renderizados parciales.
  9. Los CAPTCHAs nacieron para detener bots; a menudo detienen humanos también. Cuando tu embudo de conversión bloquea usuarios reales,
    ninguna campaña de SEO puede salvar la gráfica de ingresos de la física.

Broma #1: Seguimos inventando nuevos frameworks frontend para evitar escribir HTML, y luego pasamos semanas reinventando lo que HTML ya hacía.

Guía de diagnóstico rápido: encuentra el cuello de botella en 15 minutos

Cuando el SEO cae o el engagement se desploma, los equipos a menudo entran en pánico y “publican más contenido”. Si el frontend está semánticamente roto,
más contenido es como añadir libros a una biblioteca cuyo catálogo está en llamas.

Primero: confirma el modo de fallo (indexación vs comprensión vs experiencia)

  • Problema de indexación: páginas faltantes en la búsqueda, anomalías de rastreo, confusión de canónicos, directivas robots.
  • Problema de comprensión: snippets incorrectos, consultas irrelevantes, rankings pobres pese a estar indexado.
  • Problema de experiencia: picos de rebote, caídas de conversión, regresiones en Core Web Vitals, dolor en móvil.

Segundo: comprueba la verdad del DOM, no la intención del diseño

  • ¿Hay exactamente un <h1> y coincide con el tema de la página?
  • ¿La navegación y las acciones principales usan <a> y <button> nativos?
  • ¿Las imágenes que transmiten significado están descritas con alt significativo?
  • ¿Los formularios tienen <label> y mensajes de error que se anuncian?

Tercero: prueba la realidad “sin JS” y “JS lento”

  • Obtén el HTML crudo. ¿Está el contenido principal ahí, o solo ves “Cargando…”?
  • Simula 3G lento + throttling de CPU. ¿El diseño salta? ¿Los menús se vuelven inutilizables?
  • Ejecuta Lighthouse y axe contra la misma URL en el mismo commit. Rastrea deltas.

Cuarto: decide qué arreglar primero

Arregla las cosas que bloquean tanto a humanos como a rastreadores:
encabezados semánticos, enlaces rotos, navegación inaccesible, etiquetas faltantes y regresiones catastróficas de rendimiento.
“Anillos de enfoque pixel-perfect” pueden esperar hasta que tu sitio sea encontrable y operable.

Correcciones de accesibilidad que también mejoran el SEO (lista práctica)

1) Usa encabezados reales, en orden, para estructurar

Los encabezados son el esquema del documento. Para usuarios de lectores de pantalla, son un método de navegación primario. Para los motores de búsqueda,
ayudan a inferir tema y jerarquía.

Haz esto:

  • Exactamente un <h1> por página, que describa el tema único de la página.
  • Usa <h2> para secciones principales, <h3> para subsecciones. No saltes niveles para “hacerlo más pequeño”.
  • No uses encabezados solo para estilo. Si necesitas texto grande, usa CSS en un <p> o <div> y mantén la semántica honesta.

Evita:
múltiples <h1> usados como texto decorativo del hero, o encabezados dentro de componentes repetidos que convierten cada título de tarjeta en un <h2>.
Eso crea una página con 47 “temas principales.” Los rastreadores no saben cuál quieres; los usuarios tampoco.

2) Texto de enlace que se explique por sí mismo (y no repita “haz clic aquí”)

Los lectores de pantalla a menudo listan enlaces fuera de contexto. Los motores de búsqueda también analizan el texto del ancla para entender relaciones.
“Leer más” repetido 20 veces no es una relación; es un encogimiento de hombros.

  • Usa texto de enlace descriptivo: “Precios para planes empresariales”, no “Saber más”.
  • Si debes usar “Leer más”, añade contexto oculto visualmente: “Leer más sobre respuesta a incidentes”.
  • Los botones realizan acciones; los enlaces navegan. No los mezcles porque “funciona”.

3) Texto alternativo: no es una máquina tragaperras SEO, es un contrato de contenido

Un buen texto alt mejora la búsqueda de imágenes, ayuda a usuarios no visuales y ayuda cuando las imágenes fallan en cargar. También hace tu contenido
portable en contextos (modo lector, sindicación, ancho de banda bajo).

  • Imágenes funcionales (iconos que actúan como botones/enlaces) necesitan alt que describa la acción: “Buscar”, “Abrir menú”.
  • Imágenes informativas necesitan alt que transmita la información sucintamente.
  • Imágenes decorativas deberían tener alt vacío (alt="") para que la tecnología asistiva pueda ignorarlas.

Evita el relleno de palabras clave. Si escribes “mejor almacenamiento en la nube empresarial asequible” en el alt de la foto de tu perro de oficina,
mereces el posicionamiento que obtengas.

4) Landmarks: haz la página navegable con una sola tecla

Usa <header>, <nav>, <main>, <footer> y labels de región donde haga falta.
Esto no “posiciona” directamente. Reduce la confusión, lo que reduce viajes rotos, lo que mejora señales de usuario y conversiones.
Y hace las auditorías más sencillas.

  • Un <main> por página.
  • Si tienes múltiples navs (nav superior + barra lateral), etiquétalos (por ejemplo, aria-label="Primary").
  • Añade un enlace “Saltar al contenido” como primer elemento enfocables.

5) Formularios: etiquetas, errores y autocomplete no son opcionales

Un formulario que no se puede completar es un bug de conversión. El SEO trae tráfico; la accesibilidad decide si ese tráfico puede pagarte.
Además, los motores de búsqueda cada vez más premian sitios que no parecen trampas.

  • Cada input obtiene una etiqueta programática: <label for> o aria-labelledby si es necesario.
  • Los mensajes de error deben enlazarse vía aria-describedby y anunciarse usando regiones live cuando aparezcan.
  • Usa tokens autocomplete. Reduce fricción y ayuda a la tecnología asistiva.
  • No uses texto placeholder como etiqueta. Los placeholders desaparecen; tus usuarios no.

6) Soporte de teclado: tu sitio debe funcionar en “modo sin mouse”

La operabilidad por teclado es accesibilidad 101, y también es una prueba de cordura del DOM. Si el orden de tabulación es caótico,
tu marcado es caótico. El marcado caótico tiende a producir renderizados caóticos y scripts frágiles, lo que se convierte en deuda de SEO y confiabilidad.

  • Asegura que todos los elementos interactivos sean alcanzables y operables con teclado.
  • Estilos de foco visibles. No “sutiles”. Visibles.
  • No atrapes el foco en modales; devuelve el foco al elemento disparador.

7) Menús de navegación: deja de construirlos como juegos

Mega-menús y navegaciones sofisticadas a menudo se envían como experiencias solo por puntero. Luego el equipo las parchea con roles ARIA
y manejadores de teclas, y la mitad todavía falla en Safari con VoiceOver. Usa patrones nativos a menos que tengas una razón sólida para no hacerlo.

  • Usa <button> para toggles, <a> para destinos.
  • Asegura que el estado expandido se refleje (por ejemplo, aria-expanded).
  • Mantén el HTML de navegación presente en la respuesta inicial cuando sea factible; no escondas tu IA tras JS.

8) No ocultes contenido en pestañas/accordeones inaccesibles

La UI colapsable está bien. La UI colapsable que elimina contenido del árbol de accesibilidad, rompe el foco o depende del hover no lo está.
Para SEO: si el contenido existe solo tras una interacción cliente frágil, algunos rastreadores lo perderán.

9) Datos estructurados: alinéalos con contenido visible y accesible

Los datos estructurados no son una característica de a11y, pero la disciplina se solapa: tu página debe decir lo mismo a humanos,
tecnología asistiva y máquinas. Si tu schema afirma reseñas de cinco estrellas pero tu contenido visible no muestra ninguna, estás creando
señales de desconfianza. Rastreados y usuarios odian eso.

10) El rendimiento es accesibilidad, y el rendimiento es SEO

Un sitio lento es un sitio inaccesible para usuarios con ancho de banda limitado, hardware antiguo o fatiga cognitiva. También es
un sitio que pierde posicionamiento y conversiones. Los mayores culpables:

  • Imágenes hero grandes sin tamaños responsivos.
  • Renderizado del lado cliente que retrasa contenido y encabezados.
  • Saltos de diseño por fuentes, anuncios e imágenes que cargan tarde sin dimensiones.
  • Hidratación y scripts de terceros que bloquean la interactividad.

11) No rompas páginas con “solo scroll infinito”

El scroll infinito puede ser accesible si se implementa con cuidado, pero a menudo se lanza sin semántica de paginación adecuada.
Para SEO, la paginación sigue siendo una herramienta de trabajo. Para accesibilidad, la navegación predecible es decencia básica.

12) Idioma y metadatos: configura lo básico correctamente

Establece lang en el documento. Asegura títulos únicos que coincidan con el encabezado visible. Usa meta descripciones que describan
el contenido, no el manifiesto de la marca. Esto ayuda a los lectores de pantalla a elegir reglas de pronunciación y ayuda a que los snippets de búsqueda coincidan con la intención.

Broma #2: Nada dice “experiencia de marca premium” como un modal que no puedes cerrar sin un mouse.

Tres micro-historias corporativas desde el frente

Historia 1: El incidente causado por una suposición equivocada (“Google renderiza todo como Chrome, ¿no?”)

Una empresa SaaS de tamaño medio reconstruyó su sitio de marketing como una SPA. Se veía fantástica. Animaciones, transiciones,
degradados de buen gusto. Al CTO le gustó, lo que suele ser o una buena señal o el inicio de un incidente.

La suposición fue simple: “Los motores de búsqueda ejecutan JavaScript como un navegador normal.” En desarrollo probaron con
Chrome moderno en portátiles rápidos. En producción, enviaron renderizado del lado cliente para la mayoría del contenido, con una pantalla esqueletal
y llamadas a la API para poblar secciones, incluyendo el H1 y el copy principal.

En semanas, el tráfico orgánico descendió. No un acantilado, que habría sido misericordioso. Una fuga lenta. Ventas se quejaron primero.
El equipo SEO culpó al contenido. Ingeniería culpó “cambios de algoritmo.” Soporte abrió tickets sobre páginas en blanco en Wi‑Fi de hotel inestable.
Nadie conectó los puntos porque el sitio “funcionaba en mi máquina”, que es la mentira más vieja en operaciones.

La corrección no fue exótica. Añadieron renderizado del lado servidor para contenido central, aseguraron que la respuesta HTML contuviera el H1 y
el copy principal, y convirtieron los enlaces de navegación en anchors reales. Luego auditaron encabezados y eliminaron H1 duplicados introducidos por un
componente hero compartido. Los rankings se estabilizaron. Las conversiones mejoraron. Las animaciones permanecieron, porque el mundo es injusto.

La lección: si tu contenido primario no está en el HTML inicial, apuestas ingresos a presupuestos de renderizado que no controlas.
La gente de A11y lleva años advirtiendo sobre esto. La gente de SEO ahora trae recibos.

Historia 2: La optimización que salió mal (“Quitamos los outlines y mejoramos el CLS… más o menos”)

Un equipo de ecommerce empresarial tenía un mandato: mejorar Core Web Vitals. Se lo tomaron en serio. Redujeron CSS, optimizaron imágenes
y abordaron el layout shift. El progreso fue real—hasta que “optimizaban” los estilos de foco.

La razón fue estética y equivocada: los anillos de foco “se ven feos” y “provocan jitter visual”. Alguien también creyó
que quitar outlines reduciría el layout shift. No lo hizo. Solo eliminó el único indicador visible del foco por teclado.

Lo que pasó después fue predecible: los usuarios con teclado no sabían dónde estaban. Subieron las llamadas a soporte sobre problemas en checkout
que sonaban a error de usuario pero no lo eran. Mientras tanto, las grabaciones de sesión mostraban clics de rabia y tabulaciones repetidas.
El rebote aumentó de una forma que las analíticas no podían explicar completamente porque la fricción por teclado no siempre aparece como una caída limpia en el embudo.

Luego intervino el equipo de cumplimiento. La corrección fue pequeña: restaurar los estilos de foco, asegurar que no causaran layout shift usando
outline (que no afecta al layout) en lugar de borders, y probar en modo solo teclado como puerta de lanzamiento.

La lección: la “optimización” que reduce las affordances visibles no es optimización. Es sabotaje con un ticket de rendimiento adjunto.
Si quieres reducir CLS, reserva espacio para imágenes y fuentes. No dejes ciego al usuario.

Historia 3: La práctica aburrida pero correcta que salvó el día (gates de release + presupuestos de regresión)

Una empresa fintech tenía una cadencia semanal de lanzamientos y la costumbre de enviar pequeños experimentos de UI. Los experimentos están bien.
Los experimentos no medidos son cómo acabas con una interfaz Frankenstein.

Instituyeron una práctica aburrida: cada PR que afectara plantillas frontend ejecutaba dos chequeos automáticos en CI:
Lighthouse (rendimiento + accesibilidad básica) y axe-core para reglas de accesibilidad. Umbrales fallidos bloqueaban merges.
Sin excepciones, sin “solo esta vez”, sin “pero es viernes”.

Una semana, un desarrollador introdujo un componente “simple”: una cuadrícula de tarjetas donde cada tarjeta era clickable. Lo implementó como
<div onClick> con enlaces anidados. Funcionaba con mouse. También produjo anidamiento interactivo inválido, rompió
la navegación por teclado y confundió la tecnología asistiva.

Los checks de CI fallaron de inmediato: faltaba semántica de botón, targets de enlace duplicados y un orden de tabulación roto. El desarrollador
convirtió la tarjeta en un enlace real con un área clicable sensata y eliminó elementos interactivos anidados. El release se envió.
Nadie celebró. Ese es el punto.

La lección: el trabajo de A11y y SEO más valioso es la prevención de regresiones. Tu yo futuro nunca te agradecerá en voz alta, pero dormirá tranquilo.

Errores comunes: síntoma → causa raíz → corrección

1) Síntoma: “Estamos indexados, pero los rankings son pobres y los snippets se ven mal”

  • Causa raíz: los encabezados son decorativos; el esquema de la página es un sinsentido; múltiples H1; contenido clave oculto tras JS.
  • Corrección: hacer cumplir la jerarquía de encabezados, renderizar contenido central server-side o pre-render, asegurar que el title y el H1 coincidan con el tema.

2) Síntoma: “Los usuarios rebotan en móvil; CWV regresó; soporte dice ‘el sitio está fallando’”

  • Causa raíz: layout shift por imágenes sin dimensiones, fuentes que cargan tarde o inyección de banners/modales tras la carga.
  • Corrección: establecer width/height o aspect-ratio, precargar fuentes críticas con responsabilidad, reservar espacio para UI dinámico, retrasar scripts no críticos.

3) Síntoma: “Los usuarios de teclado no pueden usar el menú / formularios”

  • Causa raíz: divs clicables, gestión de foco faltante, interacciones solo por hover, estilos de foco removidos.
  • Corrección: usar elementos nativos, implementar correcta trampa/devolución de foco, añadir foco visible usando outline, probar el orden de tabulación.

4) Síntoma: “El tráfico de búsqueda de imágenes es bajo; las imágenes de producto no aparecen bien”

  • Causa raíz: alt faltante o basura, imágenes decorativas con alt ruidoso, lazy-loading aplicado indiscriminadamente.
  • Corrección: escribir alt significativos para imágenes informativas, usar alt=»» para decorativas, evitar lazy-loading en imágenes hero above-the-fold.

5) Síntoma: “El presupuesto de rastreo parece desperdiciado; muchos casi-duplicados”

  • Causa raíz: la navegación facetada crea variantes infinitas de URL; etiquetas canónicas erróneas; paginación oculta en JS.
  • Corrección: restringir facetas, establecer canónicos correctamente, proporcionar enlaces de paginación rastreables, usar directivas robots intencionalmente.

6) Síntoma: “Añadimos ARIA por todas partes; las auditorías siguen fallando”

  • Causa raíz: ARIA usada como sustituto de la semántica nativa; roles en conflicto con elementos; etiquetas duplicadas o faltantes.
  • Corrección: eliminar ARIA innecesaria, usar controles nativos, aplicar ARIA solo cuando construyas componentes verdaderamente personalizados con soporte completo de teclado.

7) Síntoma: “Los popups modales hunden conversiones y tiempo en sitio”

  • Causa raíz: falta trampa de foco, botón de cierre no accesible, ESC no gestionado, scroll de fondo no controlado.
  • Corrección: patrón de modal accesible: el foco entra, queda atrapado, vuelve al disparador, soporta ESC, el botón de cerrar es de primera clase.

8) Síntoma: “La búsqueda interna funciona, pero la externa no encuentra contenido profundo”

  • Causa raíz: contenido renderizado solo tras llamadas API cliente; páginas profundas no enlazadas o solo accesibles vía scripts.
  • Corrección: asegurar enlaces rastreables, renderizar server-side páginas clave, generar sitemaps, evitar que la navegación dependa solo de manejadores de clic.

Tareas prácticas con comandos: qué ejecutar, qué significa, qué hacer

Estas tareas están diseñadas para un flujo de trabajo orientado a producción: verificar con un comando, interpretar la salida y luego tomar una decisión.
Puedes ejecutar la mayoría desde un runner de CI o un host de depuración. No arreglarán tu DOM por ti, pero evitarán que te pelees por opiniones.

Task 1: Fetch raw HTML and verify main content exists without JS

cr0x@server:~$ curl -sS -L -A "Mozilla/5.0 (compatible; DebugBot/1.0)" https://www.example.com/product/widget | sed -n '1,80p'
<!doctype html>
<html lang="en">
<head>
  <title>Widget - Example</title>
  ...
</head>
<body>
  <main>
    <h1>Widget</h1>
    <p>Our Widget helps you...</p>

Qué significa la salida: Puedes ver <main>, <h1> y copy real en la respuesta inicial.
Eso es bueno para rastreadores y para usuarios en redes malas.

Decisión: Si solo ves un esqueleto (“Loading…”) y scripts, prioriza SSR/pre-render o al menos HTML estático para contenido central.

Task 2: Verify canonical and robots directives in headers

cr0x@server:~$ curl -sSI https://www.example.com/blog/post | egrep -i 'x-robots-tag|cache-control|content-type'
content-type: text/html; charset=utf-8
cache-control: max-age=0, must-revalidate

Qué significa la salida: No hay X-Robots-Tag presente aquí. Eso es normal.

Decisión: Si ves X-Robots-Tag: noindex en páginas que quieres indexar, detén todo y arregla el header en la capa CDN/app.

Task 3: Check meta robots and canonical in HTML

cr0x@server:~$ curl -sS https://www.example.com/blog/post | egrep -i 'rel="canonical"|name="robots"' | head
<link rel="canonical" href="https://www.example.com/blog/post">
<meta name="robots" content="index,follow">

Qué significa la salida: El canonical apunta a sí mismo; robots permiten indexación.

Decisión: Si el canonical apunta a una página distinta sin querer (común con stripping de UTM mal hecho), arregla las plantillas y reindexa.

Task 4: Validate heading count quickly (rough but useful)

cr0x@server:~$ curl -sS https://www.example.com/product/widget | pup 'h1,h2,h3 text{}' | nl | sed -n '1,30p'
     1  Widget
     2  Features
     3  Reliability
     4  Pricing
     5  FAQ

Qué significa la salida: Obtienes un extracto de esquema limpio. Es una comprobación de cordura de que el DOM tiene estructura real.

Decisión: Si la salida muestra encabezados repetidos de tarjetas (“Learn more” como H2 en todas partes), refactoriza componentes y degrada encabezados.

Task 5: Run Lighthouse in CI mode for accessibility and performance

cr0x@server:~$ lighthouse https://www.example.com/ --only-categories=accessibility,performance --output=json --output-path=./lh.json --chrome-flags="--headless=new"
Lighthouse CLI v12.0.0
✔  Generated report to ./lh.json

Qué significa la salida: Existe un reporte JSON; puedes compararlo entre commits y extraer puntuaciones y auditorías.

Decisión: Define presupuestos. Si rendimiento o a11y caen más allá de un umbral, falla la build y arregla antes de release.

Task 6: Extract key Lighthouse audits (LCP/CLS plus a11y signals)

cr0x@server:~$ jq -r '.categories.accessibility.score, .categories.performance.score, .audits["largest-contentful-paint"].displayValue, .audits["cumulative-layout-shift"].displayValue' lh.json
0.92
0.74
3.8 s
0.21

Qué significa la salida: La accesibilidad está decente; el rendimiento es débil; LCP y CLS están fuera de objetivos “buenos”.

Decisión: Trata CLS > 0.1 y LCP > 2.5s como incidente de rendimiento/a11y para páginas de aterrizaje clave. Investiga saltos de layout y trabajo que bloquea render.

Task 7: Run axe-core via CLI on a URL

cr0x@server:~$ npx axe https://www.example.com/ --exit
✔ 0 violations found!

Qué significa la salida: Las comprobaciones automáticas básicas pasaron. Esto no es “totalmente accesible”, pero es un buen guardarraíl de regresión.

Decisión: Si aparecen violaciones, conéctalo al CI y bloquea merges por nuevas violaciones. No dejes que el backlog se convierta en un vertedero.

Task 8: Identify missing alt attributes quickly

cr0x@server:~$ curl -sS https://www.example.com/ | pup 'img attr{alt}' | head
Summer campaign banner
Product photo: Widget in use

Qué significa la salida: Al menos algunas imágenes tienen alt. Este comando no muestra alts faltantes directamente—la ausencia es el problema.

Decisión: Si sospechas alt faltantes, busca <img sin alt en plantillas y aplica reglas de lint (p. ej., eslint-plugin-jsx-a11y).

Task 9: Confirm gzip/brotli and payload size hints

cr0x@server:~$ curl -sSI -H 'Accept-Encoding: br,gzip' https://www.example.com/ | egrep -i 'content-encoding|content-length|vary'
vary: Accept-Encoding
content-encoding: br

Qué significa la salida: La compresión Brotli está activa; la respuesta varía por encoding. Buen baseline para rendimiento y accesibilidad en enlaces lentos.

Decisión: Si no hay compresión, arregla la configuración del CDN/servidor web. Luego re-check Lighthouse performance.

Task 10: Test if critical CSS/JS is cacheable (performance stability)

cr0x@server:~$ curl -sSI https://www.example.com/assets/app.9c1f3d2.js | egrep -i 'cache-control|etag|last-modified'
cache-control: public, max-age=31536000, immutable
etag: "a1b2c3d4"

Qué significa la salida: Los assets fingerprinted están cacheados agresivamente. Eso reduce latencia en visitas repetidas y ayuda a usuarios que navegan múltiples páginas.

Decisión: Si los assets son no-cache, fuerzas descargas innecesarias e incrementas la probabilidad de experiencias lentas y rotas.

Task 11: Spot heavy third-party scripts (a11y + CWV offender)

cr0x@server:~$ curl -sS https://www.example.com/ | egrep -o '<script[^>]+src="[^"]+"' | sed 's/.*src="//;s/"$//' | head
https://cdn.example.com/assets/app.9c1f3d2.js
https://thirdparty.example.net/tracker.js
https://chat.example.org/widget.js

Qué significa la salida: Puedes ver scripts de terceros cargándose. Estos suelen dañar INP, añadir layout shift y crear problemas de foco.

Decisión: Audita la necesidad. Difere, carga perezosa o elimina. Si un script añade un modal, obliga a que cumpla requisitos de teclado y foco.

Task 12: Validate robots.txt quickly for accidental blocks

cr0x@server:~$ curl -sS https://www.example.com/robots.txt | sed -n '1,80p'
User-agent: *
Disallow: /admin/
Disallow: /internal/
Sitemap: https://www.example.com/sitemap.xml

Qué significa la salida: Disallows razonables, sitemap declarado.

Decisión: Si ves Disallow: / en producción, trátalo como Sev-1. Haz rollback o hotfix inmediatamente.

Task 13: Verify sitemap returns 200 and is parseable

cr0x@server:~$ curl -sSI https://www.example.com/sitemap.xml | head
HTTP/2 200
content-type: application/xml

Qué significa la salida: El sitemap es accesible y servido como XML. Higiene básica.

Decisión: Si es 404/500 o servido como HTML, arregla el ruteo y caché. Luego reenvía en las herramientas de la consola de búsqueda.

Task 14: Detect SPA-style “title never changes” issues

cr0x@server:~$ for u in https://www.example.com/ https://www.example.com/pricing https://www.example.com/product/widget; do echo "== $u"; curl -sS $u | pup 'title text{}'; done
== https://www.example.com/
Example
== https://www.example.com/pricing
Example
== https://www.example.com/product/widget
Example

Qué significa la salida: Cada página tiene el mismo título. Eso es malo para SEO y confuso para usuarios de tecnología asistiva que dependen de títulos.

Decisión: Implementa títulos por ruta server-side o mediante gestión correcta del head, y asegura que el H1 visible se alinee con el title.

Listas de verificación / plan paso a paso

Plan paso a paso para los próximos dos sprints

Sprint 1: Estabilizar semántica y detener la hemorragia

  1. Fija una política de encabezados. Un H1 por página, outline consistente H2/H3. Añade una regla de lint o puerta de revisión.
  2. Arregla elementos interactivos. Reemplaza divs clicables por botones/enlaces. Elimina elementos interactivos anidados.
  3. Añade/repara skip links y landmarks. Un main, navs etiquetados, estructura predecible.
  4. Higiene de formularios. Etiquetas, autocomplete, errores accesibles, gestión de foco para validación.
  5. Restaura estilos de foco. Usa outline, no border. Asegura contraste.
  6. Automatiza checks de regresión. Lighthouse + axe en CI, con umbrales y regla de “no nuevas violaciones”.

Sprint 2: Mejoras de rendimiento y rastreabilidad que se componen

  1. Arregla CLS en la fuente. Reserva espacio para imágenes/anuncios, fuentes estables, evita inyecciones DOM tardías por encima del pliegue.
  2. Reduce el coste de JS. Elimina scripts de terceros, code-splitting, difiere características no críticas, mide INP.
  3. Haz la navegación rastreable. Asegura que las rutas primarias sean enlaces reales en HTML, no manejadores de clic solo JS.
  4. Programa de texto alt. Define reglas: decorativas vs informativas vs funcionales. Haz cumplir en componentes.
  5. Consistencia de title + meta. Títulos únicos, meta descripciones precisas, lang correcto, sanity de canónicos.
  6. Estrategia de paginación. Proporciona controles de paginación accesibles y asegura que las páginas profundas sean alcanzables e indexables.

Checklist de puerta de lanzamiento (imprímelo, fastidia a tu equipo)

  • Prueba rápida solo teclado: navegación, CTA principal, formularios, cerrar modal.
  • Un H1, outline sensato, sin spam de encabezados en componentes repetidos.
  • Los enlaces tienen texto descriptivo; no hay patrones “haz clic aquí” a escala.
  • Imágenes: alt significativos donde se necesiten, alt vacío para decorativas.
  • Presupuestos Lighthouse: accesibilidad y rendimiento por encima de umbrales.
  • No hay headers/meta con noindex accidentales, canónico correcto.
  • CLS controlado en plantillas clave; imágenes con dimensiones.
  • Scripts de terceros revisados; no hay nuevas etiquetas que bloqueen sin justificación.

Preguntas frecuentes

1) ¿Mejorar la accesibilidad mejora directamente los rankings?

No como un único “puntaje a11y” factor de ranking. Pero las correcciones que hacen un sitio accesible—estructura semántica, navegación rastreable,
renderizado estable, formularios utilizables—a menudo mejoran cómo se descubre, parsea y experimenta el contenido. Eso mejora las cosas que sí importan.

2) ¿ARIA es bueno para SEO?

ARIA es mayormente para tecnologías asistivas, no para motores de búsqueda. Úsala para hacer widgets personalizados accesibles cuando los elementos nativos
no puedan hacerlo. Si puedes usar un elemento nativo, hazlo. Es más rápido, más fiable y suele ser más compatible.

3) Si ya tenemos SSR, ¿hemos terminado?

SSR ayuda, pero aún puedes enviar una página semánticamente rota: encabezados erróneos, controles inaccesibles, etiquetas faltantes y trampas de foco.
SSR es un mecanismo de transporte. A11y es una disciplina de diseño e implementación.

4) ¿Todas las imágenes deben tener alt text?

Cada <img> debería tener un atributo alt. A veces ese alt está vacío (alt="") para imágenes decorativas.
Las imágenes funcionales e informativas necesitan un alt significativo que coincida con lo que la imagen aporta.

5) Usamos botones solo con icono. ¿Cuál es el patrón correcto?

Usa un <button> real y proporciona un nombre accesible vía texto visible, aria-label o aria-labelledby.
Asegura que el foco sea visible y que el botón sea alcanzable por teclado. Luego prueba con un lector de pantalla al menos una vez por ciclo de release.

6) ¿“Saltar al contenido” puede afectar al SEO?

Indirectamente. Los skip links mejoran la usabilidad por teclado y reducen rebote/fricción, especialmente en páginas con cabeceras y nav grandes.
También obligan a los equipos a mantener un <main> coherente, lo cual es buena higiene estructural.

7) ¿Cuál es la corrección de accesibilidad más rápida con mayor beneficio SEO?

Limpia encabezados y semántica de navegación, y asegura que el HTML inicial contenga el contenido significativo y el H1. Eso mejora el parseo y reduce la dependencia de renderizado cliente frágil.

8) ¿Cómo prevenimos regresiones sin convertir los lanzamientos en un comité?

Automatiza. Ejecuta Lighthouse y axe en CI, fija umbrales y bloquea merges por nuevas violaciones. Acompáñalo con una prueba humana rápida en modo solo teclado para flujos clave. Es más rápido que triagear un trimestre de reuniones “¿por qué cayó el tráfico?”.

9) ¿Mejoras en Core Web Vitals ayudan la accesibilidad?

A menudo. Menos CLS reduce movimiento y confusión. Mejor INP reduce la latencia de entrada que puede ser devastadora para usuarios que dependen de teclado,
dispositivos de conmutación o entrada por voz. Pero no “optimices” quitando affordances como indicadores de foco.

10) Tenemos un design system. ¿Por qué seguimos fallando auditorías?

Los design systems frecuentemente envían componentes que lucen consistentes pero se comportan de forma inconsistente: etiquetas faltantes, contenedores no semánticos,
selects personalizados sin soporte de teclado. Audita el sistema en sí, no solo las páginas de producto. Arregla una vez; beneficia en todos lados.

Conclusión: próximos pasos que sobreviven a un trimestre de reuniones

Si quieres trabajo de A11y que también mueva el SEO, deja de tratar la accesibilidad como una misión secundaria de cumplimiento y empieza a tratarla como
ingeniería de fiabilidad frontend. Tu DOM es una API. Hazla estable, semántica y testeable.

Haz esto a continuación, en orden

  1. Ejecuta la guía de diagnóstico rápido en tus 5 páginas de aterrizaje principales: HTML crudo, encabezados, semántica de navegación, CLS/LCP/INP.
  2. Arregla los bloqueadores estructurales: un H1, esquema sensato, enlaces/botones reales, formularios etiquetados, foco visible, skip link + landmarks.
  3. Pon una puerta en CI: Lighthouse + axe, con presupuestos y “no nuevas violaciones”. La prevención de regresiones supera la heroica.
  4. Recorta scripts de terceros y estabiliza el layout. El trabajo de rendimiento que reduce el jank es trabajo de accesibilidad y SEO.
  5. Institucionaliza las comprobaciones aburridas: prueba rápida solo teclado en cada release, especialmente para navegación, modales y checkout.

La recompensa no es solo posicionamiento. Son menos incidentes UI frágiles, menos debates “funciona en mi máquina” y un sitio que se comporta como
un producto profesional en lugar de una demo que accidentalmente se puso en producción.

← Anterior
Migrar Windows a un SSD nuevo y conservar el antiguo como fallback (sin caos)
Siguiente →
Diseño frontend: el patrón de página de documentación que mantiene a los usuarios desplazándose (sin rebotar)

Deja un comentario