Principio 2/2.4 Navegable/2.4.3-B

De WCAG Wiki

2.4.3-B. Contenido dinámico y orden del foco

Discapacidades afectadas

Este criterio puede afectar a distintas personas con discapacidad. A continuación se indican las más relevantes.

Enunciado del criterio (Observatorio de Accesibilidad Web)

  • Si el contenido de una página se modifica dinámicamente, se debe garantizar que el orden del foco continúa siendo lógico y que no se tabula por elementos ocultos o no operables.

Comprensión del criterio

Descripción resumida

Cuando el contenido aparece, desaparece o cambia mediante scripts, el orden de tabulación se debe mantener lógico y el foco debe moverse al contenido visible y relevante.

Objetivo

Asegurar que los usuarios que navegan con teclado y tecnologías de apoyo puedan mantener el contexto cuando el contenido cambia dinámicamente.

Importancia de cumplir el criterio

Si el foco se mueve a elementos ocultos o deja zonas accesibles, los usuarios pueden perder orientación, no completar tareas o quedar atrapados fuera del flujo correcto de interacción.

Referencias WCAG

Recursos de apoyo

  • W3C ARIA Practices — gestión del foco
  • Axe DevTools
  • Accessibility Insights
  • Guías de foco para React, Vue, Angular

Evaluación del criterio

Tipo de evaluación

Evaluación Manual

Procedimiento de evaluación

  1. Identificar componentes dinámicos (modales, menús, tabs, sliders, alertas).
  2. Navegar con teclado y comprobar orden lógico tras la interacción.
  3. Verificar que el foco no llega a elementos ocultos o fuera de contexto.
  4. Comprobar uso correcto de aria-hidden y tabindex para ocultar elementos no visibles.
  5. En elementos emergentes, asegurar que el foco se confina al componente y regresa al origen al cerrarse.

Resultado esperado

El foco permanece en contenido visible, sigue orden lógico y respeta la interacción dinámica sin exponer elementos ocultos.

Ejemplo ilustrativo

✅ Correcto: menú con foco gestionado

<button id="openMenu">Menú</button>
<nav id="menu" hidden aria-hidden="true">
  <a href="#a">Opción A</a>
  <a href="#b">Opción B</a>
</nav>

<script>
const btn = document.getElementById('openMenu');
const menu = document.getElementById('menu');

btn.addEventListener('click', () => {
  menu.hidden = false;
  menu.setAttribute('aria-hidden','false');
  menu.querySelector('a').focus();
});
</script>

❌ Incorrecto: elementos ocultos tabulables

<div style="display:none;">
  <a href="#oculto">Entrada oculta</a>
</div>


Otras herramientas de evaluación

  • Pruebas manuales con teclado
  • Axe DevTools, Accessibility Insights
  • NVDA, JAWS, VoiceOver
  • Inspección DOM para elementos ocultos accesibles










Ejemplos accesibles y no accesibles creados por alumnos

<!DOCTYPE html> Formulario de Reserva - NO Accesible 3.3.2-C

⚠️ PROBLEMA 3.3.2-C: Este formulario NO tiene etiquetas ni instrucciones claras

Reserva de Hotel

⚠️ Problemas de este formulario:
  • No hay etiquetas <label> para ningún campo
  • Algunos placeholders son ambiguos ("Código" - ¿qué código?)
  • No se indica qué campos son obligatorios
  • No hay instrucciones sobre el formato esperado
  • El select dice "Selecciona" pero ¿seleccionar qué?
  • Un campo no tiene ni placeholder ni etiqueta (campo de email)
  • No hay indicación de formato de fecha específico
  • No se explica para qué sirve cada campo

<!DOCTYPE html> Formulario de Reserva - ACCESIBLE 3.3.2-C

✅ ACCESIBLE 3.3.2-C: Este formulario tiene etiquetas e instrucciones claras

Reserva de Hotel

Complete el siguiente formulario para reservar su estadía

Nota: Los campos marcados con * son obligatorios

Ingrese su nombre tal como aparece en su documento de identidad

Enviaremos la confirmación de reserva a este correo

Incluya el código de país (Ej: +34 para España)

¿Cuántas personas se alojarán?

Formato: DD/MM/AAAA (Ej: 15/02/2025)

Formato: DD/MM/AAAA (Ej: 20/02/2025)

Seleccione el tipo de habitación que prefiere

Si tiene un código promocional, ingréselo aquí

Indique cualquier necesidad especial o preferencia (cama extra, piso bajo, accesibilidad, etc.)

✅ Implementación correcta:
  • Cada campo tiene una etiqueta <label> clara asociada
  • Los campos obligatorios están claramente marcados con *
  • Hay instrucciones específicas sobre formato y contenido esperado
  • Los selectores tienen opciones descriptivas, no ambiguas
  • Se explica el propósito de cada campo cuando no es obvio
  • Se proporcionan ejemplos en los placeholders
  • Hay una nota inicial explicando la convención de campos obligatorios
  • Se usan atributos ARIA apropiados (aria-required, aria-describedby)

Comentarios

A continuación se muestran comentarios sobre el criterio 2.4.3-B. Contenido dinámico y orden del foco

Loading comments...