OPÇÃO 1: Use o :focus-visible
pseudo classe
A :focus-visible
pseudo-classe pode ser usada para eliminar os contornos desagradáveis e focar os anéis nos botões e em vários elementos para os usuários que NÃO estão navegando pelo teclado (por exemplo, via toque ou clique do mouse).
/**
* The default focus style is likely provided by Bootstrap or the browser
* but here we override everything else with a visually appealing cross-
* browser solution that works well on all focusable page elements
* including buttons, links, inputs, textareas, and selects.
*/
*:focus {
outline: 0 !important;
box-shadow:
0 0 0 .2rem #fff, /* use site bg color to create whitespace for faux focus ring */
0 0 0 .35rem #069 !important; /* faux focus ring color */
}
/**
* Undo the above focused button styles when the element received focus
* via mouse click or touch, but not keyboard navigation.
*/
*:focus:not(:focus-visible) {
outline: 0 !important;
box-shadow: none !important;
}
Aviso: a partir de 2020, a :focus-visible
pseudo classe não é amplamente suportada nos navegadores . No entanto, o polyfill é muito fácil de usar; veja as instruções abaixo.
OPÇÃO 2: use o .focus-visible
polyfill
Esta solução usa uma classe CSS normal em vez da pseudo-classe mencionada acima e possui amplo suporte ao navegador porque é um polyfill oficial baseado em Javascript .
Etapa 1: adicione as dependências Javascript à sua página HTML
Nota: o polyfill visível ao foco requer um polyfill adicional para vários navegadores mais antigos que não suportam classList :
<!-- place this code just before the closing </html> tag -->
<script src="https://cdn.polyfill.io/v2/polyfill.js?features=Element.prototype.classList"></script>
<script src="https://unpkg.com/focus-visible"></script>
Etapa 2: adicione o seguinte CSS à sua folha de estilo
A seguir está uma versão modificada da solução CSS documentada mais detalhadamente acima.
/**
* Custom cross-browser styles for keyboard :focus overrides defaults.
*/
*:focus {
outline: 0 !important;
box-shadow:
0 0 0 .2rem #fff,
0 0 0 .35rem #069 !important;
}
/**
* Remove focus styles for non-keyboard :focus.
*/
*:focus:not(.focus-visible) {
outline: 0 !important;
box-shadow: none !important;
}
Etapa 3 (opcional): use a classe 'focus-visible' sempre que necessário
Se você possui algum item em que realmente deseja mostrar o anel de foco quando alguém clica ou usa o toque, basta adicionar a focus-visible
classe ao elemento DOM.
<!-- This example uses Bootstrap classes to theme a button to appear like
a regular link, and then add a focus ring when the link is clicked --->
<button type="button" class="btn btn-text focus-visible">
Clicking me shows a focus box
</button>
Recurso:
Demo: