Com algum HTML como este:
<p>Some Text</p>
Então, alguns CSS como este:
p {
color:black;
}
p:hover {
color:red;
}
Como posso permitir que um toque longo em um dispositivo habilitado para toque replique o foco? Posso alterar a marcação / usar JS etc, mas não consigo pensar em uma maneira fácil de fazer isso.
Respostas:
OK, eu resolvi isso! Envolve alterar um pouco o CSS e adicionar algumas JS.
Usando o jQuery para facilitar:
Em inglês: quando você inicia ou termina um toque, ative
hover_effect
ou desative a turma .Em seguida, em seu HTML, adicione um foco de classe a qualquer coisa com a qual você queira que isso funcione. No seu CSS, substitua qualquer instância de:
com
E apenas para maior utilidade, adicione isso ao seu CSS também:
Para parar o navegador, solicitando que você copie / salve / selecione a imagem ou o que for.
Fácil!
fonte
toggle
as coisas vai atrapalhar se o usuário toca um elemento e arrasta para outro (por exemplo, se eles tocaram o item errado e estão tentando cancelar o toque)touchend
epreventDefault()
no meu site e funciona bem, mas agora os menus não são fechados automaticamente ao tocar fora do alvo.touchstart
ouvinte no corpo (ou similar), mas me perguntei se havia uma maneira melhor. Obrigado!Tudo o que você precisa fazer é vincular o touchstart a um pai. Algo assim vai funcionar:
Você não precisa fazer nada na função, deixe em branco. Isso será suficiente para colocar o mouse em contato, então um toque se comporta mais como: hover e menos como: active. Magia para iOS.
fonte
Tente o seguinte:
E no seu CSS:
Com esse código, você não precisa de uma classe .hover extra!
fonte
Para responder à sua pergunta principal: "Como simular um foco instantâneo com navegadores ativados por toque no toque?"
Basta permitir 'clicar' no elemento (tocando na tela) e acionar o
hover
evento usando JavaScript.Isso deve funcionar, desde que haja um
hover
evento no seu dispositivo (mesmo que normalmente não seja usado).Atualização: Acabei de testar essa técnica no meu iPhone e ela parece funcionar bem. Experimente aqui: http://jsfiddle.net/mathias/YS7ft/show/light/
Se você deseja usar um 'toque longo' para acionar o foco, pode usar o snippet de código acima como ponto de partida e se divertir com temporizadores e outras coisas;)
fonte
Solução melhorada
Primeiro, fui com a abordagem de Rich Bradshaw , mas depois começaram a aparecer problemas. Ao fazer o e.preventDefault () no evento 'touchstart' , a página não rola mais e, nem a pressão prolongada é capaz de disparar o menu de opções, nem o zoom duplo clique é capaz de concluir a execução.
Uma solução poderia ser descobrir qual evento está sendo chamado e apenas e.preventDefault () no último, 'touchend' . Como o 'touchmove' do scroll vem antes do 'touchend', ele permanece como padrão e o 'click' também é impedido, pois vem com as senhas na cadeia de eventos aplicadas ao dispositivo móvel, da seguinte forma:
Mas então, quando o menu de opções aparece, ele não aciona mais o 'toque' responsável por alternar entre a classe e, da próxima vez, o comportamento do foco será o contrário, totalmente confuso.
Uma solução seria, novamente, descobrir condicionalmente em qual evento estamos, ou apenas realizar eventos separados, e usar addClass () e removeClass () respectivamente em 'touchstart' e 'touchend' , garantindo que ele sempre comece e termine por respectivamente adicionando e removendo em vez de decidir condicionalmente. Para finalizar, também vincularemos o retorno de chamada de remoção ao tipo de evento 'focusout' , permanecendo responsável por limpar a classe de foco de qualquer link que possa permanecer ativada e nunca revisitada novamente, da seguinte forma:
Atenção: Alguns erros ainda ocorrem nas duas soluções anteriores e, também pense (não testado), o zoom duplo clique também falha.
Arrumado e esperançosamente livre de erros (não :)) Solução Javascript
Agora , por um segundo, mais limpo, organizado e responsivo, use apenas javascript (sem combinação entre a classe .hover e pseudo: hover) e de onde você pode chamar diretamente seu comportamento do ajax no evento universal (móvel e desktop) 'click' , Encontrei uma pergunta muito bem respondida, da qual finalmente entendi como misturar eventos de toque e mouse sem vários retornos de chamada de eventos, inevitavelmente alterando os eventos uns dos outros na cadeia de eventos. Aqui está como:
fonte
O
hover
efeito do mouse não pode ser implementado no dispositivo de toque. Quando eu apareci com a mesma situaçãosafari
ios
, usei:active
no css para fazer efeito.ie
No meu caso, está funcionando. Pode ser que também seja o caso que pode ser usado sem o uso de javascript. Apenas tente.
fonte
Adicione esse código e defina a classe "tapHover" para os elementos que você gostaria de trabalhar dessa maneira. Na primeira vez que você toca em um elemento, ele obtém o pseudoclasse ": pairar" e a classe "tapped". O evento Click será impedido. Segunda vez que você tocar no mesmo elemento, clique em evento será acionado.
fonte
Sem o JS específico do dispositivo (ou melhor, do navegador), tenho certeza de que você está sem sorte.
Edit: pensei que você queria evitar isso até que eu reler sua pergunta. No caso do Mobile Safari, você pode se registrar para obter todos os eventos de toque semelhantes ao que você pode fazer com os UIView-s nativos. Não consegue encontrar a documentação no momento, mas tentará.
fonte
Uma maneira de fazer isso seria fazer o efeito de foco quando o toque iniciar e remover o efeito de foco quando o toque se mover ou terminar.
É o que a Apple tem a dizer sobre o manuseio do toque em geral, já que você menciona o iPhone.
fonte
Meu gosto pessoal é atribuir os
:hover
estilos ao:focus
estado também, como:Depois, com o seguinte HTML:
E o seguinte JavaScript:
fonte
Resolvido 2019 - Passe o mouse sobre o Touch
Agora parece melhor evitar usar o hover completamente com o ios ou o touch em geral. O código abaixo aplica seu css desde que o toque seja mantido e sem outros menus desdobráveis do ios. Faça isso;
Jquery add: $ ("p"). On ("touchstart", função (e) {$ (this) .focus (); e.preventDefault ();});
CSS: substitua p: hover por p: focus e adicione p: active
Opções;
substitua o jquery p selector por qualquer classe etc
para que o efeito permaneça, mantenha p: pairar também e adicione body {cursor: ponter;} para que um toque em qualquer lugar o termine
tente eventos de clique e mouseover, bem como toque inicial no mesmo código (mas não testado)
remover e.preventDefault (); para permitir que os usuários utilizem submenus ios, por exemplo, copiar
Notas
testado apenas para elementos de texto, o ios pode tratar entradas etc. de maneira diferente
testado apenas no iphone XR ios 12.1.12 e ipad 3 ios 9.3.5, usando o Safari ou o Chrome.
fonte
Uma mistura de Javascript nativo e jQuery:
fonte
Solução mais fácil que encontrei: eu tinha algumas tags <span> com as regras: hover css. Eu mudei para <a href = "javascript: void (0)"> e voilà. Os estilos de foco no iOS começaram a funcionar.
fonte
Use também pode usar CSS, adicione foco e ativo (para IE7 e inferior) ao link oculto. Exemplo de um menu ul dentro de uma div com menu de classe:
É tarde e não testado, deve funcionar ;-)
fonte