J'ai créé un carrousel avec un bouton précédent et suivant qui sont toujours visibles. Ces boutons ont un état de survol, ils deviennent bleus. Sur les appareils tactiles, comme l'iPad, l'état de survol est collant, de sorte que le bouton reste bleu après avoir appuyé dessus. Je ne veux pas de ça.
Je pourrais ajouter une
no-hover
classeontouchend
pour chaque bouton et rendre mon CSS comme ceci:button:not(.no-hover):hover { background-color: blue; }
mais c'est probablement assez mauvais pour les performances et ne gère pas correctement les appareils comme le Chromebook Pixel (qui a à la fois un écran tactile et une souris).Je pourrais ajouter une
touch
classe audocumentElement
et faire de mon CSS comme ceci:html:not(.touch) button:hover { background-color: blue; }
Mais cela ne fonctionne pas non plus correctement sur les appareils à la fois tactiles et souris.
Ce que je préférerais, c'est supprimer l'état de survol ontouchend
. Mais cela ne semble pas possible. La focalisation sur un autre élément ne supprime pas l'état de survol. Taper manuellement sur un autre élément le fait, mais je n'arrive pas à déclencher cela en JavaScript.
Toutes les solutions que j'ai trouvées me semblent imparfaites. Y a-t-il une solution parfaite?
la source
Une fois que CSS Media Queries Level 4 est implémenté, vous pourrez le faire:
Ou en anglais: "Si le navigateur prend en charge le survol correct / vrai / réel / non émulé (par exemple, il a un périphérique d'entrée principal semblable à une souris), appliquez ce style lorsque vous
button
survolez s."Étant donné que cette partie de Media Queries Level 4 n'a jusqu'à présent été implémentée que dans Chrome de pointe, j'ai écrit un polyfill pour y faire face. En l'utilisant, vous pouvez transformer le CSS futuriste ci-dessus en:
(Une variante de la
.no-touch
technique) Et puis en utilisant du JavaScript côté client du même polyfill qui détecte la prise en charge du survol, vous pouvez basculer la présence de lamy-true-hover
classe en conséquence:la source
C'est un problème courant sans solution parfaite. Le comportement de survol est utile avec une souris et surtout nuisible au toucher. Le problème est aggravé par des appareils prenant en charge le toucher et la souris (simultanément, rien de moins!) Comme le Chromebook Pixel et Surface.
La solution la plus propre que j'ai trouvée est de n'activer le comportement de survol que si l'appareil n'est pas réputé prendre en charge la saisie tactile.
Certes, vous perdez le survol sur les appareils qui peuvent le prendre en charge. Cependant, parfois, le survol a plus d'impact que le lien lui-même, par exemple, vous souhaitez peut-être afficher un menu lorsqu'un élément est survolé. Cette approche vous permet de tester l'existence du toucher et peut-être de joindre conditionnellement un événement différent.
J'ai testé cela sur iPhone, iPad, Chromebook Pixel, Surface et une variété d'appareils Android. Je ne peux pas garantir que cela fonctionnera lorsqu'une entrée tactile USB générique (comme un stylet) est ajoutée au mix.
la source
Avec Modernizr, vous pouvez cibler vos survols spécifiquement pour les appareils sans contact:
(Remarque: cela ne fonctionne pas sur le système d'extraits de code de StackOverflow, vérifiez plutôt le jsfiddle )
Notez que cela
:active
n'a pas besoin d'être ciblé.no-touch
car il fonctionne comme prévu sur les mobiles et les ordinateurs de bureau.la source
.no-touch
est présent sur lahtml
balise. Sinon, cette réponse obtient mon sceau d'approbation.Vous pouvez remplacer l'effet de survol pour les appareils qui ne prennent pas en charge le survol. Comme:
Testé et vérifié sur iOS 12
Pointe du chapeau à https://stackoverflow.com/a/50285058/178959 pour le signaler.
la source
la source
De 4 façons de gérer le survol collant sur mobile : Voici un moyen d'ajouter ou de supprimer dynamiquement une
can touch
classe " " au document en fonction du type d'entrée actuel de l'utilisateur. Il fonctionne également avec les appareils hybrides où l'utilisateur peut basculer entre le tactile et une souris / trackpad:la source
J'allais publier ma propre solution, mais en vérifiant si quelqu'un l'avait déjà postée, j'ai trouvé que @Rodney l'avait presque fait. Cependant, il a raté une dernière étape cruciale qui l'a rendu unie, du moins dans mon cas. Je veux dire, moi aussi j'ai pris la même
.fakeHover
classe d'ajout / suppression viamouseenter
etmouseleave
détection d'événement, mais cela seul, en soi , agit presque exactement comme "authentique":hover
. Je veux dire: lorsque vous appuyez sur un élément de votre table, il ne détectera pas que vous l'avez "quitté" - gardant ainsi l'état "fakehover".Ce que j'ai fait était simplement d'écouter
click
, aussi, alors quand je "tape" sur le bouton, je déclenche manuellement unmouseleave
.Si c'est mon code final:
De cette façon, vous conservez votre
hover
fonctionnalité habituelle lorsque vous utilisez une souris en "survolant" simplement vos boutons. Eh bien, presque tout: le seul inconvénient est que, après avoir cliqué sur le bouton avec la souris, il ne sera pas enhover
état. Un peu comme si vous cliquiez et retiriez rapidement le pointeur du bouton. Mais dans mon cas, je peux vivre avec ça.la source
C'est ce que j'ai trouvé jusqu'ici après avoir étudié le reste des réponses. Il devrait pouvoir prendre en charge les utilisateurs tactiles uniquement, souris uniquement ou hybrides.
Créez une classe de survol distincte pour l'effet de survol. Par défaut, ajoutez cette classe de survol à notre bouton.
Nous ne voulons pas détecter la présence du support tactile et désactiver tous les effets de survol dès le début. Comme mentionné par d'autres, les appareils hybrides gagnent en popularité; les gens peuvent avoir un support tactile mais veulent utiliser une souris et vice versa. Par conséquent, supprimez la classe de survol uniquement lorsque l'utilisateur touche réellement le bouton.
Le problème suivant est le suivant: que se passe-t-il si l'utilisateur souhaite revenir à l'utilisation d'une souris après avoir touché le bouton? Pour résoudre cela, nous devons trouver un moment opportun pour rajouter la classe de survol que nous avons supprimée.
Cependant, nous ne pouvons pas le rajouter immédiatement après l'avoir supprimé, car l'état de survol est toujours actif. Nous pouvons également ne pas vouloir détruire et recréer le bouton entier.
J'ai donc pensé à utiliser un algorithme d'attente occupé (en utilisant setInterval) pour vérifier l'état de survol. Une fois l'état de survol désactivé, nous pouvons ensuite rajouter la classe de survol et arrêter l'attente occupée, nous ramenant à l'état d'origine où l'utilisateur peut utiliser la souris ou le toucher.
Je sais que l'attente occupée n'est pas terrible, mais je ne sais pas s'il y a un événement approprié. J'ai envisagé de l'ajouter à l'événement mouseleave, mais ce n'était pas très robuste. Par exemple, lorsqu'une alerte apparaît après avoir touché le bouton, la position de la souris change mais l'événement mouseleave n'est pas déclenché.
Edit: Une autre approche que j'ai essayée est d'appeler
e.preventDefault()
dans ontouchstart ou ontouchend. Il semble arrêter l'effet de survol lorsque le bouton est touché, mais il arrête également l'animation de clic sur le bouton et empêche la fonction onclick d'être appelée lorsque le bouton est touché, vous devez donc les appeler manuellement dans le gestionnaire ontouchstart ou ontouchend. Pas une solution très propre.la source
Cela m'a été utile: lien
la source
Ajoutez ce code JS à votre page:
maintenant dans votre CSS avant chaque survol, ajoutez la classe hover comme ceci:
Si l'appareil est tactile, la classe body sera vide, sinon sa classe sera survolée et les règles seront appliquées!
la source
document.body.className = 'ontouchstart' in window ? '' : 'hover';
C'est le bon point de départ. Étape suivante: appliquer / supprimer la classe nohover sur les événements suivants (démo avec jQuery)
Remarque: si vous souhaitez appliquer d'autres classes à l'élément de bouton, le: not (.nohover) dans le CSS ne fonctionnera plus comme prévu. Ensuite, vous devez ajouter à la place une définition séparée avec la valeur par défaut et la balise! Important pour remplacer le style de survol: .nohover {background-color: white! Important}
Cela devrait même gérer correctement les appareils comme le Chromebook Pixel (qui possède à la fois un écran tactile et une souris)! Et je ne pense pas que ce soit un tueur de performances majeur ...
la source
Une solution qui a fonctionné pour moi:
Ajoutez ce code à votre feuille de style.
Je voulais me débarrasser du fond gris qui apparaît sur iOS Safari lorsqu'un lien est cliqué. Mais il semble faire plus. Maintenant, un clic sur un bouton (avec une
:hover
pseudoclasse!) S'ouvre tout de suite! Je ne l'ai testé que sur un iPad, je ne sais pas si cela fonctionnera sur d'autres appareils.la source
Je pense avoir trouvé une solution élégante (minimum js) pour un problème similaire:
En utilisant jQuery, vous pouvez déclencher le survol du corps (ou tout autre élément), en utilisant
.mouseover()
Donc, j'attache simplement un gestionnaire this à l'
ontouchend
événement de l'élément comme ceci:Cependant, cela ne supprime que: survolez la pseudo-classe de l'élément après qu'un autre événement tactile a été déclenché, comme un balayage ou un autre toucher
la source
J'ai une belle solution que je voudrais partager. Vous devez d'abord détecter si l'utilisateur est sur mobile comme ceci:
Ensuite, ajoutez simplement:
Et en CSS:
la source
J'ai traversé le même problème, mon application était compatible pour toutes les tailles d'écran avait beaucoup d'effets de survol dans les appareils basés sur la taille de l'écran de bureau / la souris, et plus tard, j'ai réalisé que les appareils tactiles causaient une condition connue sous le nom de collant -hover et c'était un obstacle pour que l'application fonctionne correctement pour les utilisateurs d'appareils tactiles.
Nous utilisions SCSS dans notre application. et j'ai défini un mixin pour prendre en charge les appareils tactiles.
puis j'ai placé toutes mes classes css sous l'extrait de code ci-dessous.
Par exemple, nous avions une classe pour animer une icône, et qui se déclenchait une fois que nous survolions l'icône comme vous pouvez le voir à partir de css, mais dans l'appareil tactile, il était affecté par l'effet de survol collant, puis je l'ai placé à l'intérieur @ include hover-support () afin de garantir que le survol s'applique uniquement aux appareils prenant en charge le survol.
la source
Voici un code JavaScript simple qui n'oblige pas le développeur à modifier le CSS ou à écrire de nouvelles règles CSS. J'ai écrit ceci pour les boutons Bootstrap avec
class="btn"
, mais cela fonctionnera avec n'importe quel bouton qui a un nom de classe spécifique.Les étapes sont:
document.styleSheets
.btn
et:hover
L'élimination de toutes les
.btn :hover
règles CSS garantit qu'il n'y aura aucun effet de survol visuel sur un bouton.Étape 1: Détecter le périphérique tactile
Vérifiez la requête multimédia pour la présence de
(hover: none)
:Étape 2: Supprimer les règles CSS contenant `btn` et`: hover`
Le code complet est sur GitHub et npm .
Démo en direct sur terrymorse.com .
la source
@media (hover:none)
ou lorsque l'utilisateur touche l'écran pour la première fois. Vous pouvez l'essayer sur la page de démonstration en direct pour en être sûr.Vous pouvez définir la couleur d'arrière-plan sur l'
:active
état et donner:focus
l'arrière-plan par défaut.si vous définissez la couleur d'arrière-plan via
onfocus/ontouch
, le style de couleur reste une fois l':focus
état disparu.Vous avez également besoin d'une réinitialisation
onblur
pour restaurer le bg par défaut lorsque la mise au point est perdue.la source
Cela a fonctionné pour moi: mettez le style de survol dans une nouvelle classe
Ensuite, ajoutez / supprimez la classe au fur et à mesure des besoins
Répétez pour les événements touchstart et touchend. Ou quels que soient les événements que vous souhaitez pour obtenir le résultat souhaité, par exemple, je voulais que l'effet de survol soit basculé sur un écran tactile.
la source
Basé sur la réponse de Darren Cooks qui fonctionne également si vous déplacez votre doigt sur un autre élément.
Voir Le doigt de l'élément de recherche est activé pendant un événement Touchend
Codepen Demo
la source
Vous pouvez essayer de cette façon.
javascript:
css:
la source
Ce que j'ai fait jusqu'à présent dans mes projets était d'annuler les
:hover
modifications sur les appareils tactiles:Tous les noms de classe et les couleurs nommées juste à des fins de démonstration ;-)
la source
Cela fonctionne parfaitement en 2 étapes.
Définissez votre balise corporelle comme ceci
<body ontouchstart="">
. Je ne suis pas fan de ce "hack", mais il permet à Safari sur iOS de réagir instantanément aux touches. Je ne sais pas comment, mais ça marche.Configurez votre classe tactile comme ceci:
Vous pouvez également supprimer toute animation de votre classe palpable. Android Chrome semble être un peu plus lent qu'iOS.
Cela entraînera également l'application de l'état actif si l'utilisateur fait défiler la page tout en touchant votre classe.
la source
Certains des
:hover
:focus
:active
problèmes persistants ou bloqués sur les appareils mobiles peuvent être causés par l'absence<meta name="viewport" content="width=device-width">
lorsque les navigateurs tentent de manipuler l'écran.la source
La solution pour moi était après touchend était de cloner et de remplacer le nœud ... je déteste faire cela mais même essayer de repeindre l'élément avec offsetHeight ne fonctionnait pas
la source
Cela peut être accompli en échangeant une classe HTML. Cela devrait être moins sujet aux problèmes que de supprimer tout l'élément, en particulier avec de grands liens d'image, etc.
Nous pouvons également décider si nous voulons survoler états de soient déclenchés lors du défilement tactile (touchmove) ou même ajouter un délai pour les retarder.
Le seul changement significatif dans notre code sera l'utilisation d'une classe HTML supplémentaire, par exemple
<a class='hover'></a>
sur les éléments qui implémentent le nouveau comportement.HTML
CSS
JS (avec jQuery)
Exemple
https://codepen.io/mattrcouk/pen/VweajZv
-
Cependant, je n'ai aucun appareil avec la souris et le toucher pour le tester correctement.
la source
À partir de 2020, vous pouvez ajouter des styles de survol dans la requête multimédia
Cette requête multimédia indique que les styles fonctionneront sur les navigateurs qui n'émulent pas: survolez donc cela ne fonctionnera PAS sur les navigateurs tactiles.
la source