Accesibilidad
💡 🎯 Al terminar esta lección podrás…
- Explicar por qué la accesibilidad beneficia a todos y qué son los principios POUR.
- Comprobar el contraste de color y no depender solo del color.
- Hacer una página operable con teclado: foco visible y enlace para saltar.
- Aplicar ARIA solo cuando hace falta, y probar tu página con herramientas y a mano.
1.Qué es la accesibilidad y por qué importa
Una página es accesible cuando puede usarla cualquier persona, sin importar cómo vea, oiga, se mueva o piense. No es un lujo para «unos pocos»: casi todos necesitamos accesibilidad en algún momento.
| Tipo de situación | Ejemplos |
|---|---|
| Permanente | Ceguera, sordera, baja visión, movilidad reducida, dislexia, daltonismo |
| Temporal | Un brazo enyesado, una infección en el ojo, una operación de cataratas |
| Situacional | Sol directo sobre la pantalla, un lugar ruidoso, un celular con una sola mano, conexión lenta |
Además, una página accesible suele ser mejor para todos: más clara, más rápida, más fácil de usar con teclado y mejor posicionada en buscadores. En muchos países también es una obligación legal para sitios públicos y comerciales.
Los cuatro principios (POUR)
| Principio | Significa | Ejemplo |
|---|---|---|
| Perceptible | La información se puede percibir con algún sentido | Texto alternativo en imágenes, subtítulos, buen contraste |
| Operable | Se puede usar con distintos dispositivos | Todo se maneja con teclado; los botones son grandes |
| Understandable (comprensible) | El contenido y el uso son claros | Idioma declarado, errores explicados, textos simples |
| Robusto | Funciona con tecnologías de apoyo | HTML válido y semántico, uso correcto de ARIA |
📌 Nota · Qué es una tecnología de apoyo
Son los programas y dispositivos que usan algunas personas para navegar: lectores de pantalla (leen la página en voz alta), ampliadores, control por voz, teclados especiales o conmutadores. Funcionan bien cuando tu HTML está bien escrito.
2.HTML correcto: el 80% del trabajo
Lo más importante ya lo aprendiste. Una página con HTML semántico es accesible casi sin esfuerzo extra:
| Haz esto | Porque… |
|---|---|
Usa <header>, <nav>, <main>, <footer> | Los lectores de pantalla permiten saltar entre estas zonas |
Declara lang="es" en <html> | El lector pronuncia con el idioma correcto |
Usa títulos en orden (h1 → h2 → h3) | Quien navega por títulos entiende la estructura |
Usa <button> para acciones y <a> para ir a otro sitio | Ya funcionan con teclado y se anuncian bien |
| Usa listas y tablas reales | Se anuncia «lista de 5 elementos» o «tabla de 3 columnas» |
Escribe alt en las imágenes y title en los iframe | Describen lo que no se ve |
⚠️ Importante · Un <div> no es un botón
Si usas <div class="btn" onclick="…">, no se puede alcanzar con el teclado, no se activa con Enter y el lector de pantalla no sabe que es un botón. Un <button> hace todo eso por ti, gratis.
Haz clic dentro del resultado y pulsa Tab: el foco llega al botón real, pero ignora al <div>. Eso es lo que vive una persona que no usa ratón.
3.Color y contraste
El texto debe distinguirse del fondo. El contraste se mide con una proporción (de 1:1, sin contraste, a 21:1, negro sobre blanco). Las pautas WCAG piden:
| Nivel | Texto normal | Texto grande (≥ 24 px, o ≥ 19 px en negrita) |
|---|---|---|
| AA (el mínimo recomendado) | 4.5 : 1 | 3 : 1 |
| AAA (el ideal) | 7 : 1 | 4.5 : 1 |
Prueba tú mismo: el valor inicial es un gris claro sobre blanco, muy común… y que no pasa. Mueve los colores y mira cuándo se cumple cada nivel.
- No dependas solo del color. Un campo con error no debe distinguirse únicamente por tener borde rojo: añade un texto o un ícono. Un 8% de los hombres tiene alguna forma de daltonismo.
- Subraya los enlaces dentro de párrafos, o dales otra señal además del color.
- Los textos sobre imágenes necesitan un fondo o sombra que garantice el contraste.
- Respeta el zoom. Usa
remo%, nopx, para tamaños de texto, y no bloquees el zoom en el<meta viewport>.
4.Teclado y foco
Mucha gente no usa ratón: personas con discapacidad motriz, quienes usan lectores de pantalla y quienes prefieren la velocidad del teclado. Todo lo que se hace con clic debe poder hacerse con teclado.
| Tecla | Qué hace |
|---|---|
| Tab / Shift + Tab | Avanza / retrocede entre enlaces, botones y campos |
| Enter | Activa un enlace o un botón |
| Espacio | Activa un botón, marca una casilla |
| Flechas | Cambia entre opciones de un grupo de radios o de un select |
| Esc | Cierra menús y ventanas emergentes |
1. El foco siempre debe verse
:focus-visible {
outline: 3px solid #f59e0b;
outline-offset: 3px;
}
Nunca escribas outline: none sin dar una alternativa: sería como esconder el cursor del ratón.
2. Enlace para saltar al contenido
Quien navega con teclado tendría que pulsar Tab sobre todo el menú en cada página. Un «enlace para saltar» al inicio lo evita:
<body>
<a class="saltar" href="#contenido">Saltar al contenido</a>
<header>…menú largo…</header>
<main id="contenido">…</main>
</body>
<style>
.saltar { position: absolute; left: -999px; }
.saltar:focus { left: 8px; top: 8px; background: #fff; padding: 8px; z-index: 10; }
</style>
El enlace está fuera de la pantalla hasta que recibe el foco con Tab; entonces aparece y, al pulsarlo, salta directo al <main>. Este curso lo usa: pulsa Tab al abrir cualquier lección.
3. El orden y tabindex
- El orden de Tab sigue el orden del HTML: escribe el código en el orden en que se debe leer.
tabindex="0"hace que un elemento no interactivo reciba foco (rara vez lo necesitarás).tabindex="-1"permite enfocarlo con programación pero no con Tab.- No uses valores positivos (
tabindex="3"): desordenan la navegación.
5.Formularios accesibles
Ya viste en la lección 5 que cada campo necesita su <label>. Falta lo que ocurre cuando hay errores:
<label for="correo">Correo electrónico</label>
<input type="email" id="correo" name="correo"
required aria-invalid="true" aria-describedby="error-correo">
<p id="error-correo" role="alert">Escribe un correo válido, por ejemplo ana@ejemplo.com.</p>
aria-describedbyconecta el campo con el texto que lo explica; el lector lo lee después de la etiqueta.aria-invalid="true"avisa que el valor actual no es válido.role="alert"hace que el lector anuncie el mensaje en cuanto aparece.- El error debe explicar qué pasó y cómo corregirlo, no solo «campo inválido».
- Usa
autocomplete(por ejemploautocomplete="email") para que el navegador rellene los datos.
6.ARIA: cuándo y cómo
ARIA es un conjunto de atributos que añaden información a las tecnologías de apoyo. Tiene una regla de oro:
⚠️ Importante · Primera regla de ARIA
Si existe una etiqueta HTML que haga lo que necesitas, úsala en lugar de ARIA. <button> en vez de <div role="button">. Un ARIA mal usado empeora la accesibilidad: es mejor no usarlo que usarlo mal.
| Atributo | Para qué sirve | Ejemplo |
|---|---|---|
aria-label | Da un nombre cuando no hay texto visible | <button aria-label="Cerrar">✕</button> |
aria-labelledby | Usa otro elemento como nombre | <section aria-labelledby="titulo"> |
aria-describedby | Añade una descripción o ayuda | Campo de contraseña con requisitos |
aria-live | Anuncia contenido que cambia | <p aria-live="polite">Guardado</p> |
aria-hidden="true" | Oculta algo a los lectores | Íconos decorativos |
aria-expanded | Indica si un menú está abierto | <button aria-expanded="false">Menú</button> |
role | Cambia el rol de un elemento | role="status", role="alert" |
<button type="button" aria-label="Abrir menú">
<span aria-hidden="true">☰</span>
</button>
El botón solo muestra un símbolo, pero el lector de pantalla anuncia «Abrir menú, botón». El símbolo se oculta porque «tres rayas» no aporta nada.
📌 Nota · aria-live
Cuando un mensaje aparece sin recargar la página (por ejemplo «Mensaje enviado»), el lector no lo notaría si no estuviera en una región aria-live. polite espera a que termine de leer lo actual; assertive interrumpe y se reserva para errores importantes.
7.Movimiento y tiempo
- Respeta
prefers-reduced-motion: quien lo activa en su sistema pide menos animación. - Nada de parpadeos rápidos (más de 3 por segundo): pueden desencadenar convulsiones.
- Permite pausar carruseles, videos de fondo y animaciones largas.
- No limites el tiempo de lectura o de llenado sin avisar y sin permitir ampliarlo.
.tarjeta { transition: transform .3s; }
@media (prefers-reduced-motion: reduce) {
* { animation: none !important; transition: none !important; scroll-behavior: auto !important; }
}
Las animaciones de este curso incluyen este bloque: si tu sistema pide reducir movimiento, desaparecen.
8.Cómo probar tu página
No necesitas ser experto: con estas pruebas de cinco minutos detectas la mayoría de los problemas.
- Teclado: Deja el ratón. Recorre la página con Tab. ¿Ves siempre dónde estás? ¿Puedes llegar a todo y activarlo?
- Zoom: Amplía al 200% (Ctrl + +). ¿Se sigue leyendo sin desplazarte de lado?
- Contraste: Revisa colores con un comprobador como el de esta lección.
- Lector de pantalla: Prueba 5 minutos con NVDA (Windows, gratis), VoiceOver (Mac/iPhone) o TalkBack (Android).
- Herramientas: Ejecuta Lighthouse (pestaña en F12 de Chrome), WAVE o axe DevTools. Detectan errores automáticos, pero solo una parte: la prueba humana sigue siendo necesaria.
💡 Consejo · Hazlo desde el principio
Corregir la accesibilidad al final es caro y frustrante. Si desde la primera línea usas HTML semántico, alt, label y un buen contraste, el resto es mínimo.
9.Errores frecuentes
- Quitar el contorno de foco con
outline: none. - Usar
<div>o<span>como botones o enlaces. - Enlaces como «haz clic aquí» o «leer más» sin contexto.
- Imágenes sin
alt, o conaltcomo «imagen1». - Campos solo con
placeholder, sin<label>. - Texto gris claro sobre fondo blanco.
- Mensajes de error solo en rojo, sin texto que los explique.
- Abusar de ARIA o usarlo para tapar un HTML mal escrito.
- Saltar niveles de títulos para lograr un tamaño de letra.
📒 Apuntes para llevar
- La accesibilidad beneficia a todos: personas con discapacidad permanente, temporal o situacional.
- Los principios WCAG son Perceptible, Operable, Comprensible y Robusto (POUR).
- HTML semántico bien escrito resuelve la mayor parte: landmarks, títulos en orden,
lang,buttonya. - Contraste mínimo AA: 4.5:1 en texto normal y 3:1 en texto grande. No uses solo el color para dar información.
- Todo debe ser operable con teclado, con foco siempre visible y un enlace «saltar al contenido».
- Los errores de formulario se enlazan con
aria-describedbyy se anuncian conrole="alert". - ARIA: primero HTML nativo;
aria-label,aria-liveyaria-hiddenen casos puntuales. - Prueba con teclado, zoom al 200%, un lector de pantalla y herramientas como Lighthouse.
10.Glosario
| Término | Significado |
|---|---|
| Accesibilidad | Que una página pueda ser usada por todas las personas. |
| WCAG | Pautas internacionales de accesibilidad web (niveles A, AA y AAA). |
| Lector de pantalla | Programa que lee en voz alta el contenido y la estructura. |
| Contraste | Diferencia de luminosidad entre el texto y su fondo. |
| Foco | El elemento que recibe las pulsaciones del teclado en ese momento. |
| ARIA | Atributos que dan información extra a las tecnologías de apoyo. |
| Landmark | Zona de la página (header, nav, main…) a la que se puede saltar. |
| Tecnología de apoyo | Software o dispositivo que ayuda a usar la web (lectores, ampliadores…). |
🧠 Comprueba lo aprendido
Elige una respuesta en cada pregunta. Verás al instante si acertaste y por qué.
Un texto gris claro sobre blanco con proporción de contraste de 3:1 en tamaño normal…
Para texto normal, AA exige 4.5:1. 3:1 solo es suficiente para texto grande.
¿Cuál es la mejor forma de crear un botón?
<button> ya funciona con teclado y se anuncia como botón. No necesita ARIA.
Un botón con solo el símbolo ☰ debe llevar…
aria-label da el nombre que el lector anunciará cuando no hay texto visible.
¿Para qué sirve un enlace «Saltar al contenido»?
Permite llegar al contenido principal con una sola pulsación.
¿Cómo anunciar «Guardado» cuando aparece sin recargar la página?
Las regiones aria-live hacen que el lector anuncie los cambios de contenido.
Tu progreso se guarda en este navegador y se refleja en el índice del curso.
💡 🚀 ¡Ahora te toca!
La práctica fija lo aprendido. Pasa al ejercicio de esta lección.