Enfoque de estilo

El indicador de enfoque (a menudo representado por un "anillo de enfoque") identifica el estado centrado en tu página. Para los usuarios que no pueden usar un mouse, este es sumamente importante porque actúa como sustituto de la puntero del mouse.

Si el indicador de enfoque predeterminado del navegador no coincide con tu diseño, puedes usar CSS para cambiar el estilo. Recuerda tener en cuenta a los usuarios de tu teclado.

Usa :focus para mostrar siempre un indicador de enfoque

La :focus se aplica cada vez que un elemento se enfoca, independientemente de la entrada dispositivo (mouse, teclado, pluma stylus, etc.) o el método utilizado para enfocarlo. Por ejemplo: el <div> que aparece a continuación tiene un tabindex que lo hace enfocable. También cuenta con un estilo personalizado para su estado :focus:

div[tabindex="0"]:focus {
  outline: 4px dashed orange;
}

Independientemente de que uses un mouse para hacer clic en ella o un teclado para acceder a ella, <div> siempre se verá igual.

Desafortunadamente, los navegadores pueden ser inconsistentes con la forma en que aplican el foco. Si un elemento no recibe el foco puede depender del navegador y del sistema en un sistema de archivos.

Por ejemplo, el <button> que aparece a continuación también tiene un estilo personalizado para su :focus. para cada estado.

button:focus {
  outline: 4px dashed orange;
}

Si haces clic en <button> con un mouse en Chrome en macOS, deberías ver su estilo de enfoque personalizado. Sin embargo, no verás el estilo de enfoque personalizado si Haz clic en <button> en Safari para macOS. Esto se debe a que, en Safari, el elemento no se enfoca cuando haces clic en él.

Debido a que el comportamiento del enfoque es incoherente, puede que se requieran algunas pruebas. en diferentes dispositivos para garantizar que tus estilos de enfoque sean aceptables para los usuarios.

Usa :focus-visible para mostrar un indicador de enfoque de manera selectiva

La nueva herramienta :focus-visible se aplica cada vez que un elemento recibe el foco y el navegador determina mediante una heurística que mostrar un indicador de enfoque sería beneficiosos para el usuario. En particular, si la interacción más reciente del usuario fue a través del teclado y cuando se presionaba la tecla no se incluía un meta, ALT / OPTION, o la tecla CONTROL, :focus-visible coincidirá.

El botón del siguiente ejemplo mostrará un indicador de enfoque de forma selectiva. Si haces clic con el mouse, los resultados son diferentes a los que usas un teclado para acceder a él.

button:focus-visible {
  outline: 4px dashed orange;
}

Usa :focus-within para aplicar diseño al elemento superior de un elemento enfocado

El :focus-within se aplica a un elemento, ya sea cuando este recibe o cuando otro elemento dentro de él lo recibe.

Se puede usar para resaltar una parte de la página y dibujar la la atención del usuario en esa área. Por ejemplo, el siguiente formulario recibe el foco cuando se selecciona el formulario y también cuando cualquiera de sus botones de selección seleccionado.

form:focus-within {
  background: #ffecb3;
}

Cuándo mostrar un indicador de enfoque

Una buena regla general es preguntarse: "Si haces clic en este control mientras usando un dispositivo móvil, ¿esperarías que mostrara un teclado?"

Si la respuesta es "sí", entonces el control probablemente siempre debería mostrar un enfoque independientemente del dispositivo de entrada que se use para enfocarlo. Un buen ejemplo el elemento <input type="text"> El usuario deberá enviar la entrada al elemento a través del teclado, independientemente de cómo el elemento de entrada recibió originalmente el foco está puesto, por lo que es útil mostrar siempre un indicador de enfoque.

Si la respuesta es "no", el control puede elegir mostrar de forma selectiva indicador. Un buen ejemplo es el elemento <button>. Si un usuario hace clic en él con un mouse o una pantalla táctil, la acción se completó y es posible que un indicador ser necesarias. Sin embargo, si el usuario navega con un teclado, es útil para mostrar un indicador de enfoque para que el usuario pueda decidir si desea o no Haz clic en el control con las teclas ENTER o SPACE.

Evita outline: none

La forma en que los navegadores deciden cuándo dibujar un indicador de enfoque es, francamente, muy confusas. Cambiar la apariencia de un elemento <button> con CSS o dar un elemento tabindex hará que el comportamiento del anillo de enfoque predeterminado del navegador su participación.

Un antipatrón muy común consiste en quitar el indicador de enfoque mediante CSS, como las siguientes:

/* Don't do this!!! */
:focus {
  outline: none;
}

Una mejor manera de solucionar este problema es usar una combinación de :focus y el polyfill :focus-visible. El primer bloque de código que aparece a continuación demuestra cómo funciona el polyfill, y la app de ejemplo que aparece debajo proporciona un ejemplo de cómo usar el polyfill para cambiar el indicador de enfoque de un botón.

/*
  This will hide the focus indicator if the element receives focus via the
  mouse, but it will still show up on keyboard focus.
*/
.js-focus-visible :focus:not(.focus-visible) {
  outline: none;
}

/*
  Optionally: Define a strong focus indicator for keyboard focus.
  If you choose to skip this step, then the browser's default focus
  indicator will be displayed instead.
*/
.js-focus-visible .focus-visible {
  
}