Saltar al contenido
Curso de HTML
Todos los cursos Ir al ejercicio →

Accesibilidad

  • ⏱ 40 minutos
  • 📶 Nivel: principiante
  • 🧩 Incluye ejercicio

💡 🎯 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ónEjemplos
PermanenteCeguera, sordera, baja visión, movilidad reducida, dislexia, daltonismo
TemporalUn brazo enyesado, una infección en el ojo, una operación de cataratas
SituacionalSol 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)

PrincipioSignificaEjemplo
PerceptibleLa información se puede percibir con algún sentidoTexto alternativo en imágenes, subtítulos, buen contraste
OperableSe puede usar con distintos dispositivosTodo se maneja con teclado; los botones son grandes
Understandable (comprensible)El contenido y el uso son clarosIdioma declarado, errores explicados, textos simples
RobustoFunciona con tecnologías de apoyoHTML 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 estoPorque…
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 sitioYa funcionan con teclado y se anuncian bien
Usa listas y tablas realesSe anuncia «lista de 5 elementos» o «tabla de 3 columnas»
Escribe alt en las imágenes y title en los iframeDescriben 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.

✏️ Compara: div contra button

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:

NivelTexto normalTexto grande (≥ 24 px, o ≥ 19 px en negrita)
AA (el mínimo recomendado)4.5 : 13 : 1
AAA (el ideal)7 : 14.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.

El comprobador en acción: al oscurecer el texto, sube la proporción y se van cumpliendo los niveles.
🎨 Comprobador de contraste
Texto de ejemplo: ¿se lee bien?

    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.

    TeclaQué hace
    Tab / Shift + TabAvanza / retrocede entre enlaces, botones y campos
    EnterActiva un enlace o un botón
    EspacioActiva un botón, marca una casilla
    FlechasCambia entre opciones de un grupo de radios o de un select
    EscCierra menús y ventanas emergentes

    1. El foco siempre debe verse

    Un foco claro
    :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:

    Enlace para saltar
    <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

    5.Formularios accesibles

    Ya viste en la lección 5 que cada campo necesita su <label>. Falta lo que ocurre cuando hay errores:

    Un campo con mensaje de error
    <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>
    ✏️ Un formulario con ayuda y error

    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.

    AtributoPara qué sirveEjemplo
    aria-labelDa un nombre cuando no hay texto visible<button aria-label="Cerrar">✕</button>
    aria-labelledbyUsa otro elemento como nombre<section aria-labelledby="titulo">
    aria-describedbyAñade una descripción o ayudaCampo de contraseña con requisitos
    aria-liveAnuncia contenido que cambia<p aria-live="polite">Guardado</p>
    aria-hidden="true"Oculta algo a los lectoresÍconos decorativos
    aria-expandedIndica si un menú está abierto<button aria-expanded="false">Menú</button>
    roleCambia el rol de un elementorole="status", role="alert"
    Botón de solo ícono
    <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

    Reducir animaciones
    .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.

    1. Teclado: Deja el ratón. Recorre la página con Tab. ¿Ves siempre dónde estás? ¿Puedes llegar a todo y activarlo?
    2. Zoom: Amplía al 200% (Ctrl + +). ¿Se sigue leyendo sin desplazarte de lado?
    3. Contraste: Revisa colores con un comprobador como el de esta lección.
    4. Lector de pantalla: Prueba 5 minutos con NVDA (Windows, gratis), VoiceOver (Mac/iPhone) o TalkBack (Android).
    5. 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

    📒 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, button y a.
    • 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-describedby y se anuncian con role="alert".
    • ARIA: primero HTML nativo; aria-label, aria-live y aria-hidden en casos puntuales.
    • Prueba con teclado, zoom al 200%, un lector de pantalla y herramientas como Lighthouse.

    10.Glosario

    TérminoSignificado
    AccesibilidadQue una página pueda ser usada por todas las personas.
    WCAGPautas internacionales de accesibilidad web (niveles A, AA y AAA).
    Lector de pantallaPrograma que lee en voz alta el contenido y la estructura.
    ContrasteDiferencia de luminosidad entre el texto y su fondo.
    FocoEl elemento que recibe las pulsaciones del teclado en ese momento.
    ARIAAtributos que dan información extra a las tecnologías de apoyo.
    LandmarkZona de la página (header, nav, main…) a la que se puede saltar.
    Tecnología de apoyoSoftware 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…

    ¿Cuál es la mejor forma de crear un botón?

    Un botón con solo el símbolo ☰ debe llevar…

    ¿Para qué sirve un enlace «Saltar al contenido»?

    ¿Cómo anunciar «Guardado» cuando aparece sin recargar la página?

    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.

    Ir al ejercicio