Sobre ese borde que el navegador le puso a mi botón sin mi permiso

Software mar. 10, 2021

Más conocido como outline. Es un indicador que el navegador automáticamente pone alrededor de los elementos interactivos de una página cuando se les hace focus. Por ejemplo, aparece al clickear en un input:

Me ayuda a ver rápidamente sobre qué input estoy escribiendo, así que bien. Pero con los botones podría traer algunos problemas.

Dependiendo del navegador y dispositivo, clickear un botón lo puede dejar con focus. Esto dejaría el outline visible y podría verse extraño con respecto al diseño de la página y del botón en particular. Por ejemplo que el botón para abrir un dropdown quede con el borde después de abrirlo:

Así se vería el dropdown de cuenta de github después de clickearlo
Y así se ve normalmente

Ya entonces si no me gusta cómo se ve, con un poco de css lo saco no más, ¿cierto?

.btn:focus {
    outline: 0;
}

Wait wait, antes de eso hay que considerar otro factor. Si sacamos el outline, vamos a estar afectando a la accesibilidad de nuestro sitio 😱.

Los usuarios que necesitan o prefieren usar solo el teclado para interactuar con la página pueden usar Tab para moverse por los elementos interactivos de esta. Sin el outline o algún estilo custom, no va a haber un indicativo visual de que a nuestro botón se le hizo focus con un Tab.

Ya, pero entonces, si no queremos que se vea el outline al clickear, pero no queremos alienar a esos usuarios de teclado, ¿qué cresta se puede hacer?

Hay otro estado que nos puede servir, focus-visible .

:focus-visible

Es una pseudo clase que aplica justamente en este caso: que el elemento tiene focus y ese focus debería ser evidente, como es el caso del Tab. No tiene tan buena covertura en los browsers, pero hay polyfills que pueden ayudar.

En el siguiente codepen se puede ver la diferencia entre el estilo de focus por defecto del navegador y uno hecho con :focus-visible . Prueba clickeando y accediendo a los botones por Tab.

Como mencioné antes, el efecto del focus cambia dependiendo del navegador. Recomiendo probar con Chrome, dónde se ve realmente la diferencia.

Con tailwind

En Platanus llevamos un buen rato usando tailwindcss y nos encanta. Así que obvio que tengo que mencionar cómo se puede usar :focus-visible con este framework.

Al igual que con los otros estados (focus:, hover:, etc.), existe la utility focus-visible: que podemos anteponer a las clases que queremos afectar.

También, a partir de tailwind V2, tenemos clases para controlar el ancho, color y offset (y otras propiedades) de un "ring": parecido al outline, pero hecho a partir de box-shadow . Una de sus gracias es que siempre se ajusta al border-radius del elemento.

En el siguiente Tailwind Play hay un ejemplo parecido al del codepen anterior, pero usando solo clases de tailwind. Juegue!

Tailwind Play
An advanced online playground for Tailwind CSS that lets you use all of Tailwind’s build-time features directly in the browser.

Entonces, qué hay que hacer con el outline?

Como todo, depende. Puedes usar focus-visible para que se aplique tal cual solo al usar Tab, puedes desactivarlo y aplicar algún cambio distinto para indicar el focus: un cambio de color de fondo, de border o de box-shadow, etc.

Lo que quiero enfatizar es que el outline tiene una razón de ser. Derechamente sacarlo sin incluir una alternativa puede impactar la experiencia de algunos usuarios, así que ideal ponerle algo.

¡Genial! Te has suscrito con éxito.
¡Genial! Ahora, completa el checkout para tener acceso completo.
¡Bienvenido de nuevo! Has iniciado sesión con éxito.
Éxito! Su cuenta está totalmente activada, ahora tienes acceso a todo el contenido.