J'écris un site Web qui doit être utilisé à la fois depuis des ordinateurs de bureau et des tablettes. Lorsqu'il est visité à partir d'un ordinateur de bureau, je veux que les zones cliquables de l'écran s'illuminent avec :hover
Avec une tablette, il n'y a pas de souris, donc je ne veux pas d'effets de survol.
Le problème est que, lorsque je touche quelque chose sur la tablette, le navigateur dispose manifestement d'une sorte de "curseur de souris invisible" qu'il déplace à l'endroit où j'ai touché, puis le laisse là - de sorte que la chose que je viens de toucher s'allume avec un effet de survol jusqu'à ce que je touche quelque chose d'autre.
Comment puis-je obtenir les effets de survol lorsque j'utilise la souris, mais les supprimer lorsque j'utilise l'écran tactile ?
Au cas où quelqu'un aurait l'intention de le suggérer, je ne veux pas utiliser le reniflage des user-agents. Le même appareil pourrait être équipé d'un écran tactile et d'une souris (ce qui n'est peut-être pas si courant aujourd'hui, mais le sera beaucoup plus à l'avenir). Je ne m'intéresse pas à l'appareil, mais à la façon dont il est utilisé : souris ou écran tactile.
J'ai déjà essayé d'accrocher le touchstart
, touchmove
et touchend
et appeler preventDefault()
sur chacun d'entre eux, ce qui supprime le "curseur invisible de la souris" de temps en temps ; mais si je tape rapidement d'avant en arrière entre deux éléments différents, après quelques tapotements, le "curseur de la souris" commencera à se déplacer et les effets de survol s'allumeront de toute façon -- c'est comme si mon preventDefault
n'est pas toujours honorée. Je ne vous ennuierai pas avec les détails, sauf si cela est nécessaire - je ne suis même pas sûr que ce soit la bonne approche à adopter ; si quelqu'un a une solution plus simple, je suis tout ouïe.
Edit : Ceci peut être reproduit avec un CSS standard. :hover
mais voici une reproduction rapide pour référence.
<style>
.box { border: 1px solid black; width: 150px; height: 150px; }
.box:hover { background: blue; }
</style>
<div class="box"></div>
<div class="box"></div>
Si vous passez la souris sur l'une ou l'autre des cases, elle aura un fond bleu, ce que je veux. Mais si vous tapez sur l'une des cases, l'arrière-plan sera également bleu, ce que j'essaie d'éviter.
J'ai également posté un échantillon ici qui fait ce qui précède et accroche également les événements de souris de jQuery. Vous pouvez l'utiliser pour voir que les événements de tapotement se déclenchent également. mouseenter
, mousemove
et mouseleave
.
7 votes
@Blender, avez-vous lu la question ? J'ai déjà expliqué pourquoi le reniflage de l'agent utilisateur est un mauvais choix.
0 votes
Hey Joe, avez-vous trouvé une solution à ce problème ?
0 votes
Je cherchais ce genre de question, je suis content de l'avoir trouvé !
0 votes
Voir aussi cette question, qui traite de la désactivation du survol sur tous les appareils tactiles, et pas seulement sur les mobiles : stackoverflow.com/questions/23885255/