J'écris un site Web destiné à être utilisé à la fois sur des ordinateurs de bureau et des tablettes. Lorsqu'il est visité depuis un bureau, je veux que les zones cliquables de l'écran s'allument avec des :hover
effets (couleur d'arrière-plan différente, etc.) 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 a évidemment une sorte de "curseur de souris invisible" qui se déplace vers l'emplacement que j'ai tapé, puis le laisse là - donc la chose que je viens d'appuyer s'allume avec un effet de survol jusqu'à ce que je touche autre chose.
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 penserait à le suggérer, je ne veux pas utiliser le sniffing user-agent. Le même appareil pourrait avoir à la fois un écran tactile et une souris (peut-être pas si courant aujourd'hui, mais bien plus encore à l'avenir). Je ne suis pas intéressé par l'appareil, je suis intéressé par la façon dont il est actuellement utilisé: souris ou écran tactile.
Je l' ai déjà essayé accrocher les touchstart
, touchmove
, et les touchend
événements et appelant preventDefault()
à tous, qui ne supprime la « invisible curseur de la souris » de temps en temps; mais si je tape rapidement dans les deux sens entre deux éléments différents, après quelques tapotements, il commencera à déplacer le "curseur de la souris" et à allumer les effets de survol de toute façon - c'est comme si mon preventDefault
n'était pas toujours honoré. Je ne vous ennuierai pas avec les détails sauf si 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 toute oreille.
Edit: Cela peut être reproduit avec du CSS standard :hover
, mais voici une rapide repro 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 des cases, il obtiendra un arrière-plan bleu, ce que je veux. Mais si vous appuyez sur l'une des cases, cela obtiendra également un fond bleu, ce que j'essaie d'éviter.
J'ai également publié ici un exemple qui fait ce qui précède et qui accroche également les événements de souris de jQuery. Vous pouvez l'utiliser pour voir que les événements tap se déclencheront également mouseenter
, mousemove
et mouseleave
.