Como outras respostas afirmaram, o iOS Safari não aciona a :active
pseudo-classe a menos que um evento de toque seja anexado ao elemento, mas até agora esse comportamento tem sido "mágico". Encontrei esta pequena sinopse na Biblioteca do Desenvolvedor Safari que explica isso (grifo meu):
Você também pode usar a -webkit-tap-highlight-color
propriedade CSS em combinação com a definição de um evento de toque para configurar os botões para se comportarem de forma semelhante à área de trabalho. No iOS, os eventos do mouse são enviados tão rapidamente que o estado inativo ou ativo nunca é recebido. Portanto, o :active
pseudo-estado é acionado apenas quando há um evento de toque definido no elemento HTML - por exemplo, quando ontouchstart é definido no elemento da seguinte maneira:
<button class="action" ontouchstart=""
style="-webkit-tap-highlight-color: rgba(0,0,0,0);">
Testing Touch on iOS
</button>
Agora, quando o botão é tocado e mantido pressionado no iOS, o botão muda para a cor especificada sem a cor cinza transparente ao redor aparecer.
Em outras palavras, definir um ontouchstart
evento (mesmo se estiver vazio) é dizer explicitamente ao navegador para reagir a eventos de toque.
Na minha opinião, esse é um comportamento falho e provavelmente remonta ao tempo em que a web "móvel" era basicamente inexistente (dê uma olhada nas capturas de tela na página vinculada para ver o que quero dizer), e tudo era orientado para o mouse. É interessante notar que outros navegadores móveis mais recentes, como no Android, exibem muito bem o pseudo-estado `: active 'no toque, sem quaisquer hacks como o que é necessário para iOS.
(Observação: se você quiser usar seus próprios estilos personalizados no iOS, também pode desativar a caixa cinza translúcida padrão que o iOS usa no lugar do :active
pseudo-estado usando a -webkit-tap-highlight-color
propriedade CSS, conforme explicado na mesma página vinculada acima .)
Depois de alguma experimentação, a solução esperada de definir um ontouchstart
evento no <body>
elemento para o qual todos os eventos de toque borbulham não funciona totalmente. Se o elemento estiver visível na janela de visualização quando a página for carregada, ele funcionará bem, mas rolar para baixo e tocar em um elemento que estava fora da janela de visualização não aciona o :active
pseudo-estado como deveria. Então, em vez de
<!DOCTYPE html>
<html><body ontouchstart></body></html>
anexe o evento a todos os elementos em vez de depender do evento borbulhando no corpo (usando jQuery):
$('body *').on('touchstart', function (){});
No entanto, não estou ciente das implicações de desempenho disso, então tome cuidado.
EDIT: Há uma falha séria com esta solução: até mesmo tocar em um elemento enquanto rola a página irá ativar o :active
pseudo estado. A sensibilidade é muito forte. O Android resolve isso introduzindo um pequeno atraso antes que o estado seja mostrado, que é cancelado se a página for rolada. À luz disso, sugiro usar isso apenas em elementos selecionados. No meu caso, estou desenvolvendo um aplicativo da web para uso em campo que é basicamente uma lista de botões para navegar nas páginas e enviar ações. Como a página inteira é basicamente composta de botões em alguns casos, isso não funcionará para mim. No entanto, você pode definir o :hover
pseudo-estado para preencher isso. Depois de desativar a caixa cinza padrão, funciona perfeitamente.
ontouchstart
sem o=""
? (HTML5)