Operable Navegable Nivel AA WCAG 2.0, 2.1, 2.2

2.4.7 Enfoque visible

Meta Los usuarios saben qué elemento tiene el foco del teclado en cada momento.
Qué hacer Asegurar que cada elemento que reciba el foco tenga un indicador visual claro y persistente.
Por qué importa Sin un indicador de enfoque, los usuarios videntes de teclado no pueden operar la página.

Criterio de éxito oficial

2.4.7 Enfoque visible Nivel AA

Cualquier interfaz de usuario operable mediante teclado tiene un modo de operación en el que el indicador de foco del teclado es visible.

WCAG 2.2 añade 2.4.11 y 2.4.13

WCAG 2.2 añadió dos criterios más estrictos: 2.4.11 Apariencia del foco (AA) que exige contraste mínimo del indicador, y 2.4.13 Apariencia del foco (AAA) que exige mayor área. El criterio 2.4.7 es el umbral mínimo: el indicador debe existir, aunque sea el del navegador por defecto.

¿Qué es?

Cuando un usuario navega con Tab, el indicador de foco señala qué elemento está activo en cada momento. Es el equivalente visual del cursor del ratón para los usuarios de teclado. Sin él, navegar por la página es como moverse a ciegas.

Campo de texto

Borde azul + outline amarillo

Botón

Outline oscuro con desplazamiento

Enlace

Doble anillo: amarillo + oscuro

¿Por qué es importante?

El mayor error de los diseñadores CSS es eliminar el indicador de foco con outline: none o outline: 0 porque «queda feo». Esto hace el sitio completamente inutilizable para cualquier usuario que navegue con teclado.

Un indicador de foco bien diseñado puede ser visualmente atractivo y accesible al mismo tiempo. No son mutuamente excluyentes.

¿Quién se ve afectado?

Personas con discapacidades motoras: Usan el teclado o dispositivos alternativos. El indicador de foco es la única pista visual de dónde están en la página.

Personas con déficit de atención: Un indicador visible y claro les ayuda a seguir su posición mientras navegan.

Usuarios de teclado por preferencia: Usuarios avanzados y power users que prefieren el teclado también necesitan el indicador para una navegación eficiente.

Cómo implementar 2.4.7

Usar :focus-visible en lugar de eliminar outline

La pseudoclase :focus-visible muestra el indicador solo cuando es necesario (navegación por teclado), no al hacer clic con ratón:

CSS
/* ✗ NUNCA hacer esto */
*:focus {
  outline: none;
}

/* ✓ Correcto: indicador visible y bien diseñado */
:focus-visible {
  outline: 3px solid #003D6B;
  outline-offset: 3px;
}

/* ✓ En fondos oscuros: usar color de alto contraste */
.dark-bg :focus-visible {
  outline: 3px solid #FFD700;
  outline-offset: 3px;
}

Estilos de indicador recomendados

Outline clásico
Botón
Outline 3px sólido, offset 3px. El más sencillo y efectivo.
Cambio de fondo
Botón
Cambio de color + box-shadow. Útil para botones con fondo oscuro.
Borde grueso
Botón
Border 3px visible. Alternativa cuando outline no encaja en el diseño.
Doble anillo
Botón
Outline amarillo + box-shadow oscuro. Máxima visibilidad en cualquier fondo.

No confiar solo en los estilos del navegador

Los estilos de foco por defecto del navegador varían entre plataformas y pueden no ser suficientemente visibles en todos los contextos. Define siempre estilos explícitos en tu CSS.

Ejemplos prácticos

Correcto Outline personalizado visible

Un sitio usa :focus-visible { outline: 3px solid #003D6B; outline-offset: 3px; } globalmente. Todos los elementos interactivos tienen un indicador de foco claro y consistente cuando se navega con teclado.

Correcto Indicador diferente para fondo oscuro

La navegación principal tiene fondo azul oscuro. Los elementos dentro usan :focus-visible { outline: 3px solid #FFD700; } para que el indicador contraste correctamente sobre el fondo oscuro.

Fallo outline: none en todos los elementos

Una hoja de estilos de reset incluye * { outline: none; }. Ningún elemento del sitio muestra indicador de foco al navegar con teclado. El sitio es completamente inutilizable con teclado.

Técnicas recomendadas

Técnicas suficientes para CE 2.4.7
CódigoTécnicaTipo
G149Usar componentes de interfaz de usuario que reciben foco usando un indicador de foco proporcionado por el agente de usuarioSuficiente
G165Usar un indicador de foco predeterminado que tenga suficiente contraste para ser visible contra todos los fondosSuficiente
G195Usar un indicador de foco de autor visible y de alto contrasteSuficiente
C15Usar CSS para cambiar la presentación de un componente de interfaz de usuario cuando recibe focoSuficiente
SCR31Usar script para cambiar el color de fondo o el borde de los elementos que reciben focoSuficiente

Errores comunes

F55: Usar script para eliminar el foco cuando lo recibe.
F78: El indicador de enfoque del teclado no es visible por la supresión del CSS en el autor.
  • Usar outline: none o outline: 0 en selectores globales como *, a, button.
  • Usar JavaScript para eliminar el foco (element.blur()) inmediatamente después de recibirlo.
  • Indicador de foco con contraste insuficiente contra el fondo (solo outline gris sobre fondo blanco).
  • No definir estilos de foco alternativos para componentes que usan fondos oscuros.

Criterios de éxito relacionados