iOS e Android são inteligentes o suficiente para usar :hover
e :focus
estilizar os botões, mas de uma maneira única. Há muito tempo meus projetos são atormentados por estados de foco em botões e links que persistem depois que os usuários os tocam. Você também pode ter encontrado isso …
O que eu criei foi uma cadeia de classes adicionadas pelo Modernizr que limitam o acesso :hover
e as :focus
classes aos .no-touch
navegadores, enquanto adicionam os mesmos estilos a um :active
estado quando .touch
está presente, bem como um .no-js
fallback.
Como a cadeia de aulas é complicada, transformei tudo em um mixin SASS bacana. Aqui está o mixin:
/*
* Provide a hover effect for non-touch devices, turn it into an Active state for mobile, and maintain a fallback.
* @requires Modernizr as a JS dependency to get .no-touch classes
* Adds styles via @content
*/
@mixin touch-hover() {
.no-js &:hover, // the fallback
.no-js &:focus,
.js.no-touch &:hover, // enhanced for no-touch
.js.no-touch &:focus,
.js.touch &:active { // relay same styles to active for touch devices
@content;
}
}
Para usar, ele pode ser colocado dentro de uma a
declaração, assim:
a {
color: blue;
@include touch-hover() {
color: purple;
}
}
Para aplicá-lo a uma classe específica, o mixin deve ser aplicado dentro dessa classe, desta forma (já que depende do &
operador):
.anchor {
@include touch-hover() {
color: purple;
}
}
O resultado é o esperado em dispositivos desktop / ponteiro do mouse. Para telas sensíveis ao toque, entretanto, os estilos de foco são aplicados apenas quando o botão é tocado. Eles desaparecem depois que a torneira é concluída.
Isso foi testado, mas não extensivamente. Eu gostaria de ouvir comentários sobre quais navegadores ignoram essas regras e o que acontece quando você tem um dispositivo que suporta eventos de toque e ponteiro ao mesmo tempo.