Addaw, ir a inicio Donar

Técnica CSS WCAG 2.2

C40Crear un indicador de foco de dos colores que se vea sobre cualquier fondo

Nombre oficial en el W3C: Crear un indicador del foco de dos colores para garantizar un contraste suficiente con todos los componentes

En pocas palabras

El indicador de foco es el recuadro que marca qué elemento está seleccionado con el teclado. Si se dibuja con dos colores muy distintos, uno claro y otro oscuro, siempre se verá al menos uno. Así sirve el mismo estilo para fondos blancos, de color y oscuros.

Por qué es importante

Quien navega con teclado necesita ver en todo momento dónde está. Un foco de un solo color puede verse bien sobre blanco y desaparecer sobre una franja del mismo tono.

Crear un estilo distinto para cada fondo lleva tiempo y es fácil olvidar alguno. Un foco de dos colores resuelve el problema de una vez en toda la web.

Cómo se hace

  1. Elija dos colores con un contraste entre sí de al menos 9:1, por ejemplo blanco y azul marino. Así uno de ellos tendrá siempre al menos 3:1 con cualquier fondo liso.
  2. Dibuje una banda con outline y la otra con box-shadow, dentro de :focus-visible o :focus.
  3. Dé a cada banda al menos 2 píxeles de grosor.
  4. No use outline: none para dejar solo la sombra: en el modo de alto contraste de Windows las sombras desaparecen.
  5. Dibuje el indicador fuera del componente y sobre fondo liso. Sobre imágenes o degradados hay que revisar el contraste a mano.

Ejemplo práctico

Sirve para webs con franjas de distintos colores, como portadas de ayuntamientos, páginas de producto o landings. Un único estilo de foco de dos colores se ve sobre fondos claros, de color y oscuros. No hace falta crear una clase para cada sección.

Así no: Foco de un solo color que desaparece en algunas franjas

Todos los enlaces usan un contorno lila #744E9A de 3 px. Sobre la franja blanca se ve bien (6,4:1). Sobre la franja lila, el contraste es 1:1, y sobre la oscura #0B2239, 2,5:1. El foco no se distingue en dos de las tres secciones.

Captura de pantalla del ejemplo incorrecto: Foco de un solo color que desaparece en algunas franjas
Así se ve el ejemplo incorrecto.

La demostración contiene, a propósito, el error de accesibilidad que se explica.

Ver el código del ejemplo incorrecto
<style>
  .franja { padding: 16px; }
  .clara { background: #FFFFFF; color: #412c56; }
  .lila { background: #744E9A; color: #FFFFFF; }
  .oscura { background: #0B2239; color: #FFFFFF; }
  .franja a { color: inherit; font-weight: bold; }
  a:focus-visible { outline: 3px solid #744E9A; outline-offset: 3px; }
</style>
<div class="franja clara"><a href="#">Ver trámites en línea</a></div>
<div class="franja lila"><a href="#">Pedir cita previa</a></div>
<div class="franja oscura"><a href="#">Contactar con el ayuntamiento</a></div>

Así sí: Foco de dos colores con outline y box-shadow

El indicador combina dos bandas de 2 px: una interior blanca (outline) y otra exterior #0B2239 (box-shadow). Entre sí tienen un contraste de 16,1:1, mayor que 9:1. Por eso una de las dos alcanza siempre 3:1 con cualquier fondo liso. Como se mantiene el outline, el foco sigue viéndose en el modo de colores forzados, que elimina las sombras.

Pruébelo aquí:

Ver el código del ejemplo correcto
<style>
  .franja { padding: 16px; }
  .clara { background: #FFFFFF; color: #412c56; }
  .lila { background: #744E9A; color: #FFFFFF; }
  .oscura { background: #0B2239; color: #FFFFFF; }
  .franja a { color: inherit; font-weight: bold; }
  a:focus-visible { outline: 2px solid #FFFFFF; outline-offset: 0; box-shadow: 0 0 0 4px #0B2239; }
</style>
<div class="franja clara"><a href="#">Ver trámites en línea</a></div>
<div class="franja lila"><a href="#">Pedir cita previa</a></div>
<div class="franja oscura"><a href="#">Contactar con el ayuntamiento</a></div>

Cómo comprobarlo

Teclado

  1. Recorra con Tab los componentes de cada fondo de la página: claros, de color y oscuros.
  2. Compruebe que en todos ellos se distingue al menos una de las dos bandas del indicador.

Herramientas del navegador

  1. Abra las herramientas de desarrollo (F12) y seleccione un enlace. Active :focus-visible con el botón :hov del panel Estilos.
  2. En Calculado (Computed), revise los colores y grosores de outline y box-shadow. Cada banda debe medir al menos 2 px. Los dos colores deben tener entre sí un contraste de 9:1 o más.
  3. En el panel Renderizado (Rendering), emule forced-colors: active. Compruebe que el indicador sigue visible aunque desaparezca la sombra.

Validación automática

  1. axe DevTools, WAVE y Lighthouse no analizan los estilos de foco ni su contraste. No detectan un indicador que se pierde sobre un fondo concreto.
  2. Calcule a mano el contraste entre los dos colores con un analizador de contraste. Revise la visibilidad sobre cada fondo real de la página, sobre todo si hay imágenes o degradados.

Errores frecuentes en auditorías

  • Usar solo box-shadow con outline: none. En el modo de colores forzados de Windows la sombra desaparece y no queda indicador.
  • Elegir dos colores con poco contraste entre sí, por ejemplo un lila y un azul corporativos. Así no se garantiza el 3:1 sobre cualquier fondo.
  • Usar bandas de 1 px, que no llegan al grosor mínimo. O usar un outline-offset negativo que dibuja el indicador dentro del componente, sobre una imagen o un degradado.
  • Dejar que overflow: hidden recorte el indicador en carruseles y tarjetas. Solo queda visible una banda en parte del contorno.
Ver el texto completo del W3C (traducción al español)

Esta es una traducción no oficial al español de la técnica C40 de Techniques for WCAG 2.2, del W3C. Puede contener errores. El único documento oficial y normativo es la versión original en inglés, publicada en el sitio web del W3C.

Aplicabilidad

CSS.

Descripción

El objetivo de esta técnica es crear un indicador del foco de dos colores que tenga un contraste suficiente con cualquier color de fondo liso. Esta técnica puede evitar la necesidad de usar varias clases para garantizar un contraste suficiente del indicador del foco cuando se muestra sobre fondos distintos.

Los autores pueden aplicar esta técnica en sitios que usan diversos colores de fondo. Aunque es posible crear indicadores del foco de distintos colores para distintas partes de una página, esto puede llevar mucho tiempo y es fácil pasar por alto algunos componentes. Sin embargo, si el indicador del foco utiliza dos colores muy contrastados entre sí (un color claro y un color oscuro), puede reutilizarse el mismo indicador, ya que al menos uno de los dos colores tendrá siempre contraste suficiente con cualquier color de fondo.

Siempre que los dos colores del indicador tengan entre sí una relación de contraste de al menos 9:1, se garantiza que al menos uno de los dos colores alcanzará un contraste de 3:1 con cualquier color de fondo liso.

Esta técnica solo garantiza que el indicador superará la comprobación si todo el indicador se dibuja sobre el fondo, no dentro del contorno del componente enfocado, y si todo el fondo situado detrás del indicador es un único color liso. Por ejemplo, si el fondo es una imagen o un degradado, o si el indicador se superpone parcialmente a otro componente de la interfaz de usuario, puede que siga siendo necesario comparar el indicador píxel a píxel con el fondo.

En CSS, los indicadores de dos colores pueden implementarse combinando las propiedades outline y box-shadow con las pseudoclases :focus o :focus-visible.

Evite establecer outline: none para usar box-shadow por sí solo. Los agentes de usuario suelen suprimir la propiedad box-shadow en los modos de colores forzados, por lo que los autores deberían evitar depender únicamente de box-shadow para implementar los indicadores del foco. Si se necesita un estilo basado solo en box-shadow, considere combinarlo con una propiedad outline: 2px transparent solid para garantizar la compatibilidad con los modos de colores forzados.

Ejemplos

Este ejemplo muestra una implementación sencilla en la que los estilos de foco se aplican a todos los componentes enfocables. Al usarlo en un sitio web más complejo, habría que asegurarse de que estos estilos no quedan anulados por otros estilos más específicos.

Un indicador grueso de dos colores

En este ejemplo, el indicador consta de dos bandas de color liso. Como cada banda de color tiene 2 píxeles CSS de grosor, cualquiera de las dos bandas es lo bastante grande para cumplir por sí sola el requisito de tamaño mínimo del indicador. Siempre que uno de los dos colores tenga un contraste de cambio de 3:1 con los píxeles situados detrás y alrededor del indicador del foco, el indicador cumplirá tanto el criterio de conformidad Aspecto del Enfoque como el de Contraste no textual.

*:focus {
	/* inner indicator */
	outline: 2px #F9F9F9 solid;
	outline-offset: 0;
	/* outer indicator */
	box-shadow: 0 0 0 4px #193146;
}

Ejemplo práctico de un indicador grueso de dos colores

Pruebas

Procedimiento

Para cada componente de la interfaz de usuario enfocable:

  1. Comprobar que los dos colores del indicador del foco tienen entre sí una relación de contraste de 9:1 o mayor.
  2. Comprobar que cada banda de color tiene al menos 2 píxeles CSS de grosor.
  3. Comprobar que el indicador solo aparece sobre un único color de fondo liso a la vez.

Resultados esperados

  • Las comprobaciones n.º 1, n.º 2 y n.º 3 son verdaderas.

Recursos

Cómo lo comprobamos en ADDAW

En cada auditoría de ADDAW revisamos esta técnica página a página y le entregamos los errores con capturas y la forma de corregirlos.

Solicitar una auditoría

Basado en la técnica C40 del W3C (WCAG 2.2). Explicación y ejemplos: ADDAW. Traducción no oficial del texto del W3C © W3C, licencia de documentos del W3C. ¿Ha visto un error? Escríbanos.