A lo largo de los módulos anteriores hemos ido aplazando el detalle de las alternativas textuales "hasta el Módulo 5". Ha llegado el momento de saldar esa deuda. El criterio 1.1.1 (Contenido no textual) es de nivel A y es, probablemente, el más incumplido de toda la web: exige que toda imagen tenga una alternativa textual apropiada... y "apropiada" no siempre significa "describir lo que se ve". El mismo archivo de imagen puede necesitar un alt largo, un alt vacío o describir una acción, según su función en la página. En esta lección construimos un árbol de decisión que aplicaremos a las imágenes reales de Cursalia: la miniatura del curso, el logo, los iconos de categoría y el gráfico de progreso del alumno. Con ella cerramos el Módulo 5.
Contenido
- Por qué el
altcorrecto depende de la función, no de la imagen - Árbol de decisión del
alt - Imágenes decorativas, informativas, funcionales, de texto y complejas
- Cómo redactar un buen
alt figureyfigcaption- SVG, iconos e imágenes de fondo CSS
- Aplicación a Cursalia
- Errores comunes, ejercicios y conclusión
- Por qué el
alt correcto depende de la función
alt correcto depende de la funciónMarta, con NVDA, no ve la imagen: oye lo que pongas en el alt. Y aquí está la idea que lo cambia todo: la misma foto puede requerir alternativas completamente distintas según para qué esté ahí. Una foto de un candado puede ser:
- pura decoración junto a un titular →
alt=""(que la TA la ignore), - la ilustración de un artículo sobre seguridad →
alt="Candado cerrado sobre un teclado"(informa), - el icono de un botón de "bloquear cuenta" →
alt="Bloquear cuenta"(describe la acción).
Por eso no existe un alt "correcto" en abstracto: primero decides qué función cumple la imagen y de ahí sale la alternativa.
- Árbol de decisión del
alt
altflowchart TD
A[¿La imagen aporta información<br/>o cumple una función?] -->|No, es decorativa| B["alt vacío"]
A -->|Sí| C{¿Es interactiva?<br/>enlace o botón}
C -->|Sí, funcional| D[alt describe la ACCIÓN<br/>no la imagen]
C -->|No| E{¿Qué tipo de<br/>información?}
E -->|Contenido simple| F[alt describe la información]
E -->|Es texto dentro<br/>de la imagen| G[Evítala; si no,<br/>alt con el texto exacto]
E -->|Gráfico/diagrama<br/>complejo| H[alt breve +<br/>descripción larga adyacente]
Recorre este árbol para cada imagen. La primera pregunta —"¿aporta algo o es solo adorno?"— es la más importante y la que más gente se salta.
- Los cinco tipos de imagen
Decorativa
No aporta información: separadores, fondos ornamentales, una foto genérica de relleno junto a un texto que ya lo dice todo. Debe ser ignorada por la tecnología de asistencia, y para eso el alt va vacío pero presente:
<!-- BIEN: alt vacío → NVDA la salta por completo -->
<img src="ornamento.svg" alt="">
<!-- MAL: sin alt → algunos lectores leen el nombre del archivo: "ornamento punto svg" -->
<img src="ornamento.svg">
<!-- MAL: alt redundante que solo genera ruido -->
<img src="ornamento.svg" alt="imagen decorativa de adorno">La diferencia entre alt="" y no poner alt es enorme: alt="" dice explícitamente "no hay nada que anunciar"; omitir el atributo hace que muchos lectores lean la URL del archivo. Alternativa equivalente: role="presentation" (o role="none"), aunque el alt="" es lo más simple y robusto.
Informativa
Transmite información que el texto circundante no da. El alt debe comunicar esa información, de forma concisa:
<!-- La imagen aporta un dato; el alt lo transmite -->
<img src="grafico-crecimiento.png"
alt="Las matrículas crecieron un 40% entre enero y junio">Pregúntate: "si quitara la imagen y la sustituyera por este texto, ¿el lector recibiría lo mismo?". Si la respuesta es sí, tu alt es bueno.
Funcional
La imagen está dentro de un enlace o un botón y representa su acción. Aquí el alt no describe la imagen, describe lo que hace:
<!-- MAL: describe la imagen; Marta oye "logotipo de Cursalia" y no sabe que es un enlace útil -->
<a href="/"><img src="logo.svg" alt="Logotipo de Cursalia"></a>
<!-- BIEN: describe la ACCIÓN del enlace -->
<a href="/"><img src="logo.svg" alt="Cursalia, ir al inicio"></a>
<!-- Icono dentro de botón: el alt/label es la acción -->
<button><img src="lupa.svg" alt="Buscar"></button>Si un <button> solo contiene un icono SVG, oculta el SVG con aria-hidden="true" y pon el nombre en el propio botón con aria-label (como vimos en el reproductor de 05-03).
De texto
Una imagen cuyo contenido es texto (un botón "Comprar" renderizado como imagen, un titular en un JPG). Se debe evitar: no escala, no se puede seleccionar, empeora con el zoom de Sofía y viola el criterio 1.4.5 (Imágenes de texto). Usa texto real con CSS. Si es inevitable (un logo con un lema), el alt debe contener el texto exacto:
<!-- Evítalo. Pero si no hay más remedio: -->
<img src="oferta.png" alt="Rebajas: 50% de descuento hasta el 30 de junio">Compleja
Gráficos, diagramas, mapas, infografías: contienen demasiada información para un alt corto. La técnica es doble: un alt breve que dé el titular, y una descripción larga adyacente (o vinculada con aria-describedby):
<img src="progreso-alumno.png"
alt="Progreso del alumno por módulo"
aria-describedby="desc-progreso">
<div id="desc-progreso">
Módulo 1: completado al 100%. Módulo 2: 80%. Módulo 3: 45%.
Módulos 4 a 7: sin empezar. Progreso total del curso: 46%.
</div>El alt corto ("Progreso del alumno por módulo") permite a Marta decidir si quiere el detalle; la descripción larga, referenciada con aria-describedby, le da los datos completos. Esa descripción, además, beneficia a todos: es texto real, indexable y seleccionable.
- Cómo redactar un buen
alt
altReglas prácticas:
- Conciso. Una frase suele bastar. Los lectores no permiten pausar a mitad de un
altlarguísimo. - Sin "imagen de" / "foto de". La TA ya anuncia que es una imagen; añadir "imagen de..." es redundante y molesto. Escribe directamente el contenido.
- Contextual. El mismo dibujo lleva un
altdistinto en un artículo que en un botón. Piensa en la función. - Sin relleno de palabras clave. El
altno es para SEO forzado; rellenarlo de keywords perjudica a Marta y penaliza igualmente. - Puntúa. Un punto final hace que el lector haga una pausa natural.
| En vez de… | Escribe… |
|---|---|
alt="imagen" |
alt="" (si es decorativa) o el contenido real |
alt="foto de una persona programando con un portátil" |
alt="Desarrolladora escribiendo código" (si aporta) o alt="" (si es relleno) |
alt="logo" en un enlace de inicio |
alt="Cursalia, ir al inicio" |
alt="grafico.png" |
alt="Progreso total del curso: 46%" |
figure y figcaption
figure y figcaptionCuando una imagen lleva un pie visible para todos, usa <figure> con <figcaption>. Ojo: el figcaption no sustituye al alt; cumplen funciones distintas. El alt describe la imagen para quien no la ve; el figcaption es una leyenda para todos.
<figure>
<img src="arbol-accesibilidad.png"
alt="Árbol de accesibilidad derivado del DOM, con roles y nombres">
<figcaption>Figura 3. El navegador construye el árbol de accesibilidad a partir del DOM.</figcaption>
</figure>A veces el figcaption ya describe todo y el alt puede ser breve o vacío para no duplicar; pero por defecto rellena ambos con contenido complementario.
- SVG, iconos e imágenes de fondo CSS
SVG inline. Un <svg> no tiene atributo alt. Para hacerlo accesible como imagen, dale role="img" y un nombre con <title> o aria-label; si es decorativo, aria-hidden="true":
<!-- SVG informativo -->
<svg role="img" aria-labelledby="t1"><title id="t1">Curso completado</title>…</svg>
<!-- SVG decorativo dentro de un botón que ya tiene texto -->
<button>Guardar <svg aria-hidden="true" focusable="false">…</svg></button>El focusable="false" evita que algunos navegadores (viejos Edge/IE) den foco al SVG y creen paradas de tab fantasma.
Iconos. Dos técnicas:
- Icon fonts (una
<i>con un carácter de fuente de iconos): siemprearia-hidden="true"porque el carácter puede leerse como un símbolo raro. El significado va en texto aparte. - SVG es preferible: escala nítido y se controla mejor. Mismo principio: si el icono acompaña a un texto,
aria-hidden; si el icono es la única información (un botón solo-icono), dale nombre conaria-labelen el control.
<!-- Icono decorativo junto a texto: se oculta a la TA -->
<a href="/certificados"><i class="bi bi-award" aria-hidden="true"></i> Certificados</a>
<!-- Botón solo-icono: el nombre va en el control, el icono se oculta -->
<button aria-label="Cerrar"><i class="bi bi-x" aria-hidden="true"></i></button>Imágenes de fondo CSS (background-image). No son accesibles: no están en el árbol de accesibilidad y no admiten alt. Por eso son correctas para pura decoración, pero nunca deben portar información. Si un background-image transmite algo (un icono de estado, un gráfico), es un error: pásalo a un <img> con alt o añade texto alternativo visible/oculto.
- Aplicación a Cursalia
Recorramos las imágenes reales de la plataforma con el árbol de decisión:
| Imagen de Cursalia | Tipo | Alternativa correcta |
|---|---|---|
| Miniatura del curso en la tarjeta del catálogo | Funcional (toda la tarjeta es un enlace) o informativa | Si el título del curso ya está como texto en la tarjeta, la miniatura es decorativa → alt="" (evita que Marta oiga el título dos veces). Si la miniatura fuera el único enlace, alt="Ver curso: Accesibilidad Web". |
| Logo en la cabecera, dentro del enlace de inicio | Funcional | alt="Cursalia, ir al inicio" (describe la acción, no "logo"). |
| Iconos de categoría (bootstrap-icons) junto al nombre | Decorativos (hay texto al lado) | aria-hidden="true" en el icono; el nombre de la categoría lo da el texto. |
| Gráfico de progreso del panel del alumno | Compleja | alt breve ("Progreso por módulo") + descripción larga con los porcentajes vía aria-describedby. |
El caso de la miniatura es el más instructivo: en una tarjeta de catálogo, el título del curso casi siempre ya está en texto, así que darle alt con el mismo título hace que Marta lo oiga dos veces. La miniatura pasa a ser decorativa (alt="") precisamente porque su información ya está cubierta por el texto. De nuevo: la función manda sobre el contenido visual.
Errores Comunes y Consejos
- Omitir el
alten lugar dealt="". Sinalt, muchos lectores leen la URL del archivo. Para decorativas,alt=""explícito. - Escribir "imagen de..." / "foto de...". Redundante: la TA ya anuncia que es una imagen.
- Describir la imagen en un elemento funcional. En un logo-enlace,
alt="logo"no dice a dónde lleva. Describe la acción. - Meter un gráfico complejo en un
altde 300 caracteres. Nadie puede oír eso de un tirón. Usaaltbreve + descripción larga. - Información en
background-image. No llega a la TA. Los fondos CSS solo para decoración. - Duplicar título de curso en la miniatura. Marta lo oye dos veces. Si el texto ya está,
alt="". - Consejo: ante cualquier imagen, hazte dos preguntas en orden: (1) ¿aporta información o función, o es decoración? y (2) ¿es interactiva?. Con esas dos respuestas, el árbol de decisión te da el
altcorrecto.
Ejercicios
Ejercicio 1. Para cada imagen de Cursalia, indica el tipo y el alt (o técnica) adecuado: (a) una línea divisoria ornamental entre secciones; (b) el logo dentro del enlace al inicio; (c) el gráfico de barras del progreso del alumno.
Ejercicio 2. Este código de una tarjeta de catálogo tiene un problema de accesibilidad. Detéctalo y corrígelo.
<a href="/curso/accesibilidad">
<img src="thumb.jpg" alt="Accesibilidad Web">
<h3>Accesibilidad Web</h3>
</a>Ejercicio 3. Tienes un botón que solo contiene un SVG de una papelera para eliminar un elemento. Escribe el HTML accesible.
Soluciones
Solución 1.
(a) Decorativa → <img src="linea.svg" alt=""> (o un fondo CSS, ya que es pura decoración).
(b) Funcional → <a href="/"><img src="logo.svg" alt="Cursalia, ir al inicio"></a>; el alt describe la acción, no "logo".
(c) Compleja → alt="Progreso por módulo" breve + una descripción larga adyacente con los porcentajes de cada módulo, vinculada con aria-describedby.
Solución 2. El problema es la duplicación: el alt de la miniatura repite el título que ya está en el <h3>. Marta oiría "Accesibilidad Web" dos veces. Como la información ya está en texto, la miniatura es decorativa:
Solución 3. El botón solo-icono necesita nombre en el control y el SVG oculto a la TA:
<button type="button" aria-label="Eliminar">
<svg aria-hidden="true" focusable="false"><!-- icono papelera --></svg>
</button>El aria-label="Eliminar" da el nombre accesible (describe la acción); aria-hidden="true" evita que el SVG se anuncie; focusable="false" evita paradas de tab fantasma.
Conclusión
Con esta lección cerramos el Módulo 5. Ya no ves una imagen y te preguntas "¿qué pongo en el alt?": recorres el árbol de decisión —decorativa, informativa, funcional, de texto o compleja— y la función de la imagen te dicta la respuesta. Y con ello cerramos también la fase de construcción del curso: en los módulos 1 a 5 hemos aprendido qué es la accesibilidad, por qué importa, qué exige WCAG y cómo implementarla —estructura semántica, formularios, ARIA, contraste, widgets con JavaScript, teclado, multimedia e imágenes—. Sabemos construir accesible.
Ahora falta la pregunta decisiva: ¿realmente funciona lo que hemos construido? Un aria-expanded puede estar mal sincronizado, un focus trap puede tener una fuga, un alt puede sonar fatal con NVDA. Todo eso hay que verificarlo. En el Módulo 6 aprenderemos a comprobar la accesibilidad de forma sistemática: pruebas manuales (teclado y lector de pantalla), herramientas automatizadas (axe, Lighthouse) y sus límites, pruebas con usuarios reales y tecnologías de asistencia, e interpretación de informes de auditoría. Pasamos de construir a demostrar que Cursalia es accesible de verdad.
Curso de Accesibilidad Web
Módulo 1: Introducción a la Accesibilidad Web
- ¿Qué es la Accesibilidad Web?
- Importancia de la Accesibilidad Web
- Visión General de las Leyes y Normas de Accesibilidad
- Introducción a WCAG
Módulo 2: Comprensión de Discapacidades y Tecnologías de Asistencia
- Tipos de Discapacidades
- Visión General de Tecnologías de Asistencia
- Cómo las Personas con Discapacidades Usan la Web
Módulo 3: Principios del Diseño Accesible
- Perceptible: Hacer el Contenido Disponible a los Sentidos
- Operable: Interfaz de Usuario y Navegación
- Comprensible: Información y Operación
- Robusto: Compatibilidad con Tecnologías Actuales y Futuras
Módulo 4: Implementación de Accesibilidad en HTML y CSS
- HTML Semántico
- Formularios Accesibles
- Uso de Roles y Propiedades ARIA
- Contraste de Color y Redimensionamiento de Texto
Módulo 5: Accesibilidad en JavaScript y Multimedia
- Creación de Widgets de JavaScript Accesibles
- Accesibilidad del Teclado
- Contenido de Video y Audio Accesible
- Proporcionar Alternativas de Texto para Imágenes
Módulo 6: Pruebas y Evaluación de la Accesibilidad
- Técnicas de Pruebas Manuales
- Herramientas de Pruebas Automatizadas
- Pruebas de Usuario con Tecnologías de Asistencia
- Interpretación de Informes de Accesibilidad
