No Webkit no iPhone / iPad / iPod, a especificação do estilo de uma pseudo classe: active para uma <a>
tag não é acionada quando você toca no elemento. Como posso fazer com que isso seja acionado? Código de exemplo:
<style>
a:active {
background-color: red;
}
</style>
<!-- snip -->
<a href="#">Click me</a>
iphone
css
webkit
mobile-safari
pseudo-class
Jesse Rusak
fonte
fonte
ontouchstart
sem o=""
? (HTML5)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):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 deanexe o evento a todos os elementos em vez de depender do evento borbulhando no corpo (usando jQuery):
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.fonte
Adicione um manipulador de eventos para ontouchstart em sua tag <a>. Isso faz com que o CSS funcione magicamente.
fonte
Isso funciona para mim:
Nota: se você fizer este truque, também vale a pena remover a cor de realce de toque padrão que o Mobile Safari aplica usando a seguinte regra CSS.
fonte
Em 8 de dezembro de 2016, a resposta aceita (
<body ontouchstart="">...</body>
) não funciona para mim no Safari 10 (iPhone 5s): Esse hack só funciona para os elementos que estavam visíveis no carregamento da página.No entanto, adicionando:
para
head
que funcione da maneira que desejo, com a desvantagem de que agora todos os eventos de toque durante a rolagem também acionam o:active
pseudo-estado nos elementos tocados. (Se isso for um problema para você, considere a:hover
solução alternativa do FighterJet .)fonte
Isso funciona para mim, adicione ao seu CSS no elemento que você deseja destacar
fonte
Você está usando todas as pseudo-classes ou apenas uma? Se você estiver usando pelo menos dois, verifique se eles estão na ordem certa ou todos quebram:
..naquela ordem. Além disso, se você estiver apenas usando: active, adicione um: link, mesmo se não estiver estilizando-o.
fonte
Publiquei uma ferramenta que deve resolver esse problema para você.
Superficialmente, o problema parece simples, mas na realidade o comportamento de toque e clique precisa ser personalizado bastante extensivamente, incluindo funções de tempo limite e coisas como "o que acontece quando você rola uma lista de links" ou "o que acontece quando você pressiona o link e depois mova o mouse / dedo para longe da área ativa "
Isso deve resolver tudo de uma vez: https://www.npmjs.com/package/active-touch
Você precisará ter seus: estilos ativos atribuídos à classe .active ou escolher seu próprio nome de classe. Por padrão, o script funcionará com todos os elementos do link, mas você pode sobrescrevê-lo com sua própria matriz de seletores.
Comentários e contribuições honestas e úteis, muito apreciadas!
fonte
Para aqueles que não querem usar o ontouchstart, você pode usar este código
fonte
Tentei essa resposta e suas variantes, mas nenhuma parecia funcionar de maneira confiável (e não gosto de depender de 'mágica' para coisas como essa). Então, fiz o seguinte, que funciona perfeitamente em todas as plataformas, não apenas na Apple:
:active
para.active
.Fez uma lista de todos os elementos afetados e adicionou
pointerdown/mousedown/touchstart
manipuladores de eventos para aplicar a.active
classe epointerup/mouseup/touchend
manipuladores de eventos para removê-los. Usando jQuery:Isso foi um pouco tedioso, mas agora tenho uma solução que é menos vulnerável a rupturas entre as versões do Apple OS. (E quem precisa de algo assim?)
fonte
Uma solução é confiar em, em
:target
vez de:active
:O estilo será acionado quando a âncora for direcionada pelo url atual, que é robusto mesmo em dispositivos móveis. A desvantagem é que você precisa de outro link para limpar a âncora no url. Exemplo completo:
fonte
Não 100% relacionado a esta questão, mas você também pode usar css sibling hack para fazer isso
HTML
SCSS
Se você gostaria de usar puro html / css tooltip
fonte
fonte