1001Ferramentas
🎯Dev

Focus-Visible CSS Snippet

Gera snippet CSS focus-visible com cor de outline customizada (WCAG 2.4.7).

CSS

Tirar o contorno feio sem cegar quem usa teclado

O contorno padrão que o navegador desenha em volta do elemento focado é o principal recurso de quem navega por teclado: sem ele, não dá para saber onde se está. Mesmo assim, a primeira coisa que muita folha de estilo faz é apagá-lo com outline none, porque ele também aparece ao clicar com o mouse, o que incomoda no visual.

A pseudo-classe focus-visible resolve o impasse. O navegador aplica ela apenas quando entende que o indicador é útil — foco por teclado, sim; clique de mouse em botão, não. Escolha a cor e a espessura e a página monta o par de regras: zera o contorno padrão e desenha o seu em focus-visible, com deslocamento para o contorno não encostar na borda do elemento.

Sobre a escolha da cor e da espessura, a WCAG 2.2 traz um critério novo, o 2.4.11, que pede contraste mínimo de 3 para 1 entre o indicador de foco e o que estava ali antes, além de área mínima. Dois pixels costumam bastar; um pixel numa cor de baixo contraste passa despercebido em tela clara. E cuidado com border-radius: contorno em elemento arredondado acompanha a curva nos navegadores atuais, mas em versões antigas sai retangular.

Perguntas frequentes

Posso usar box-shadow em vez de outline?
Pode, e às vezes fica melhor visualmente, mas há um custo: box-shadow desaparece no modo de alto contraste forçado do Windows, enquanto outline sobrevive. Quem usa sombra costuma acrescentar um outline transparente, que fica invisível no modo normal e reaparece no alto contraste.
focus-visible funciona em todos os navegadores?
Nos atuais, sim, incluindo Safari desde a versão 15.4. Para navegador antigo, o padrão seguro é declarar primeiro uma regra com focus comum e depois sobrescrever com focus-visible: quem não entende a segunda fica com o indicador sempre visível, que é o defeito menos grave.
E o :focus-within?
É outra coisa: ele casa com o elemento que contém o foco, não com o que está focado. Serve para destacar o cartão ou o campo inteiro quando algo dentro dele recebe foco — útil combinado com focus-visible, não substituto dele.

Ferramentas Relacionadas