Quero ignorar todas as :hover
declarações CSS se um usuário visitar nosso site por meio de um dispositivo touch. Como o :hover
CSS não faz sentido, e pode até ser perturbador se um tablet o acionar com um clique / toque, pois pode permanecer até o elemento perder o foco. Para ser sincero, não sei por que os dispositivos sensíveis ao toque sentem a necessidade de disparar :hover
em primeiro lugar - mas isso é realidade, então esse problema também é realidade.
a:hover {
color:blue;
border-color:green;
// etc. > ignore all at once for touch devices
}
Então, (como) posso remover / ignorar todas as :hover
declarações CSS de uma só vez (sem precisar conhecer cada uma) para dispositivos touch depois de tê-las declaradas?
Respostas:
tl; dr use isso: https://jsfiddle.net/57tmy8j3/
Se você está interessado no porquê ou em que outras opções existem, continue lendo.
Quick'n'dirty - remove: pairar estilos usando JS
Você pode remover todas as regras CSS que contêm
:hover
Javascript. Isso tem a vantagem de não precisar tocar em CSS e ser compatível mesmo com navegadores mais antigos.Limitações: as folhas de estilo devem estar hospedadas no mesmo domínio (isso significa que não há CDNs). Desativa o foco em dispositivos mistos de mouse e toque como o Surface ou iPad Pro, o que prejudica o UX.
Somente CSS - use consultas de mídia
Coloque todas as suas regras: hover em um
@media
bloco:ou, como alternativa, substitua todas as suas regras de foco instantâneo (compatíveis com navegadores mais antigos):
Limitações: funciona apenas no iOS 9.0+, Chrome para Android ou Android 5.0+ ao usar o WebView.
hover: hover
quebra os efeitos de pairar em navegadores antigos,hover: none
precisa substituir todas as regras CSS definidas anteriormente. Ambos são incompatíveis com dispositivos mistos de mouse e toque .O mais robusto - detectar toque via JS e preceder CSS: regras de foco
Este método precisa anexar todas as regras de foco com
body.hasHover
. (ou um nome de classe de sua escolha)A
hasHover
classe pode ser adicionada usandohasTouch()
o primeiro exemplo:No entanto, isso deve ter as mesmas desvantagens dos dispositivos de toque misto dos exemplos anteriores, o que nos leva à solução definitiva. Ative efeitos de foco instantâneo sempre que um cursor do mouse for movido, desative efeitos de foco instantâneo sempre que um toque for detectado.
Isso deve funcionar basicamente em qualquer navegador e habilita / desabilita os estilos de foco, conforme necessário.
Aqui está o exemplo completo - moderno: https://jsfiddle.net/57tmy8j3/
Legado (para uso com navegadores antigos): https://jsfiddle.net/dkz17jc5/19/
fonte
document.styleSheets
existe, em vez de usar otry/catch
?try/catch
apenas no caso de algum erro estranho aparecer, que poderia travar o script, como deleteRule não funcionando por causa da política de mesma origem ou suporte inadequado no IE (editei o comentário para refletir isso). Mas sim, na maioria dos casos, apenas uma verificação simples deve ser suficiente.Adaptação do ponteiro para o resgate!
Como isso não foi tocado por um tempo, você pode usar:
Veja esta demonstração no navegador da área de trabalho e no telefone . Suportado por modernos dispositivos de toque .
Nota : Lembre-se de que, como a entrada principal (capacidade) de um PC de superfície é um mouse, ele acabará sendo um link azul, mesmo que seja uma tela desanexada (tablet). Os navegadores (sempre) devem sempre padronizar a capacidade da entrada mais precisa.
fonte
Eu encontrei o mesmo problema (no meu caso com navegadores móveis Samsung) e, portanto, me deparei com essa pergunta.
Graças à resposta de Calsal, encontrei algo que, na minha opinião, excluirá praticamente todos os navegadores de desktop porque parece ser reconhecido pelos navegadores móveis que experimentei (veja a captura de tela de uma tabela compilada: tabela de detecção de recurso de ponteiro CSS ).
Os documentos da Web MDN afirmam que
.
O que descobri é o ponteiro: grosso é algo desconhecido para todos os navegadores de desktop na tabela anexa, mas conhecido por todos os navegadores móveis na mesma tabela. Essa parece ser a opção mais eficaz, porque todos os outros valores de palavras-chave de ponteiro fornecem resultados inconsistentes.
Portanto, você pode construir uma consulta de mídia como Calsal descrita, mas ligeiramente modificada. Ele usa uma lógica invertida para descartar todos os dispositivos de toque.
Sass mixin:
CSS compilado:
Também é descrito nesta essência que criei após pesquisar o problema. Codepen para pesquisa empírica.
ATUALIZAÇÃO : Ao escrever esta atualização, 23/08/2018, e apontado por @DmitriPavlutin, essa técnica não parece mais funcionar com a área de trabalho do Firefox.
fonte
De acordo com a resposta de Jason , podemos endereçar apenas dispositivos que não suportam pairar com consultas de mídia css pura. Também podemos abordar apenas dispositivos que suportam pairar, como a resposta de moogal em uma pergunta semelhante, com
@media not all and (hover: none)
. Parece estranho, mas funciona.Eu fiz um mix Sass com isso para facilitar o uso:
Atualização 2019-05-15 : recomendo este artigo do Medium que percorre todos os dispositivos diferentes que podemos segmentar com CSS. Basicamente, é uma mistura dessas regras de mídia, combine-as para destinos específicos:
Exemplo para destinos específicos:
Adoro mixins, é assim que uso o hover mixin para segmentar apenas dispositivos compatíveis:
fonte
Estou lidando com um problema semelhante atualmente.
Há duas opções principais que me ocorrem imediatamente: (1) verificação de cadeia de usuários ou (2) manutenção de páginas móveis separadas usando um URL diferente e que os usuários escolham o que é melhor para eles.
<link rel="mobile.css" />
vez do normal.As cadeias de usuários têm informações de identificação sobre navegador, renderizador, sistema operacional etc. Depende de você decidir quais dispositivos são "sensíveis ao toque" versus não sensíveis ao toque. Você pode encontrar essas informações disponíveis em algum lugar e mapeá-las em seu sistema.
R. Se você tem permissão para ignorar navegadores antigos , basta adicionar uma única regra ao css normal, não móvel, a saber:EDIT : Erk. Depois de fazer algumas experiências, descobri que a regra abaixo também desabilita a capacidade de seguir links nos navegadores da webkit, além de apenas desativar os efeitos estéticos - consulte http://jsfiddle.net/3nkcdeao/.Como tal, você terá para ser um pouco mais seletivo quanto à forma como você modifica as regras para o caso móvel do que eu mostro aqui, mas pode ser um ponto de partida útil:
Como nota explicativa, desabilitar eventos de ponteiro em um pai e ativá-los explicitamente em um filho atualmente faz com que quaisquer efeitos de foco no pai se tornem ativos novamente se um elemento filho entrar
:hover
.Vejo http://jsfiddle.net/38Lookhp/5/
B. Se você estiver dando suporte a renderizadores da Web herdados, terá que fazer um pouco mais de trabalho ao remover as regras que definem estilos especiais durante
:hover
. Para economizar tempo de todos, convém criar um comando de cópia + sediar automatizado que você executa nas folhas de estilo padrão para criar as versões móveis. Isso permitiria que você escrevesse / atualizasse o código padrão e eliminasse quaisquer regras de estilo usadas:hover
na versão móvel de suas páginas.Novamente aqui, você poderá adicionar uma regra extra ou duas às folhas de estilo ou ser forçado a fazer algo um pouco mais complicado usando o sed ou um utilitário semelhante. Provavelmente seria mais fácil de aplicar: não às regras de estilo, como as
div:not(.disruptive):hover {...
que você adicionariaclass="disruptive"
a elementos que fazem coisas irritantes para usuários móveis usando js ou a linguagem do servidor, em vez de alterar o CSS.(II) Na verdade, você pode combinar os dois primeiros e (se você suspeitar que um usuário passou para a versão errada de uma página), pode sugerir que eles entrem / saiam da exibição do tipo móvel ou simplesmente tenham um link em algum lugar permite aos usuários fracassar. Como já foi dito, as consultas @media também podem ser úteis para determinar o que está sendo usado para visitar.
(III) Se você optar por uma solução jQuery depois de saber quais dispositivos são "touch" e quais não são, poderá achar que o hover CSS não é ignorado nos dispositivos touch-screen .
fonte
pointer-events
- isso é incrível! Era exatamente isso que eu procurava, muito obrigado!<a>
links podem estar inacessíveis empointer-events:none
. Com alguma sorte, isso mudará mais tarde - ou o CSS 3.x ou 4.0+ terápointer-events:navigation-only
ou similar.tente isto:
ATUALIZAÇÃO: infelizmente o W3C removeu essa propriedade das especificações ( https://github.com/w3c/csswg-drafts/commit/2078b46218f7462735bb0b5107c9a3e84fb4c4b1 ).
fonte
Você pode usar o Modernizr JS (consulte também esta resposta do StackOverflow ) ou criar uma função JS personalizada:
para detectar o suporte ao evento touch no navegador e, em seguida, atribuir uma
CSS
propriedade regular , percorrendo o elemento com ahtml.no-touch
classe, assim:fonte
html
tag em vez dabody
tag pode facilitar a leitura. Essa é realmente a solução que estou usando atualmente. Obrigado mesmo assim.Foi útil para mim: link
fonte
Essa também é uma solução possível, mas você terá que passar pelo seu css e adicionar uma
.no-touch
classe antes dos seus estilos de foco.Javascript:
Exemplo de CSS:
Fonte
Ps Mas devemos lembrar que há cada vez mais dispositivos de toque no mercado, que também suportam a entrada do mouse ao mesmo tempo.
fonte
Talvez ainda não seja uma solução perfeita (e é com o jQuery), mas talvez seja uma direção / conceito a ser trabalhado: que tal fazer o contrário? O que significa desativar os estados: hover css por padrão e ativá-los se um evento de remoção do mouse for detectado em qualquer lugar do documento. Claro que isso não funciona se alguém desativou js. O que mais poderia dizer contra fazê-lo desta maneira?
Talvez assim:
CSS:
jQuery:
fonte
$('body').one.('mousemove', ...)
Tente isso (eu uso o plano de fundo e a cor de plano de fundo neste exemplo):
css:
fonte
O caminho sujo ... Não é elegante, mas é o caminho mais fácil que pode salvar você.
Remova qualquer coisa que caracterize o foco.
fonte
Se o seu problema for quando você tocar / tocar no Android e em toda a div coberta pela cor transparente azul! Então você precisa apenas mudar o
CURSOR: PONTEIRO; para CURSOR: DEFAULT;
use mediaQuery para ocultar no celular / tablet.
Isso funciona para mim.
fonte
Experimente esta solução fácil de jquery 2019, embora já exista algum tempo;
adicione este plugin à cabeça:
src = "https://code.jquery.com/ui/1.12.0/jquery-ui.min.js"
adicione isso ao js:
$ ("*"). on ("touchend", função (e) {$ (this) .focus ();}); // se aplica a todos os elementos
algumas variações sugeridas para isso são:
$ (": input,: checkbox"). on ("touchend", função (e) {(this) .focus);}); // especificar elementos
$ ("*"). on ("clique, toque", função (e) {$ (this) .focus ();}); // incluir evento de clique
css: corpo {cursor: ponteiro; } // toque em qualquer lugar para finalizar o foco
Notas
Referências:
https://code.jquery.com/ui/
https://api.jquery.com/category/selectors/jquery-selector-extensions/
fonte