Je souhaite ignorer toutes les :hover
déclarations CSS si un utilisateur visite notre site Web via un appareil tactile. Parce que le :hover
CSS n'a pas de sens, et il peut même être dérangeant si une tablette le déclenche par clic / tap, car il pourrait alors rester jusqu'à ce que l'élément perde le focus. Pour être honnête, je ne sais pas pourquoi les appareils tactiles ressentent le besoin de se déclencher :hover
en premier lieu - mais c'est la réalité, donc ce problème est également la réalité.
a:hover {
color:blue;
border-color:green;
// etc. > ignore all at once for touch devices
}
Alors, (comment) puis-je supprimer / ignorer toutes les :hover
déclarations CSS à la fois (sans avoir à connaître chacune d'elles) pour les appareils tactiles après les avoir déclarées?
Réponses:
tl; dr utilisez ceci: https://jsfiddle.net/57tmy8j3/
Si vous êtes intéressé par la raison ou les autres options disponibles, lisez la suite.
Quick'n'dirty - supprimer: survoler les styles à l'aide de JS
Vous pouvez supprimer toutes les règles CSS contenant
:hover
utilisation de Javascript. Cela a l'avantage de ne pas avoir à toucher CSS et d'être compatible même avec les navigateurs plus anciens.Limitations: les feuilles de style doivent être hébergées sur le même domaine (cela signifie pas de CDN). Désactive les survols sur les périphériques mixtes souris et tactiles tels que Surface ou iPad Pro, ce qui nuit à l'UX.
CSS uniquement - utiliser des requêtes multimédias
Placez toutes vos règles: hover dans un
@media
bloc:ou bien, remplacez toutes vos règles de survol (compatible avec les anciens navigateurs):
Limitations: fonctionne uniquement sur iOS 9.0+, Chrome pour Android ou Android 5.0+ lors de l'utilisation de WebView.
hover: hover
interrompt les effets de survol sur les anciens navigateurs,hover: none
doit remplacer toutes les règles CSS précédemment définies. Les deux sont incompatibles avec les périphériques mixtes souris et tactiles .Le plus robuste - détecter le toucher via JS et ajouter CSS: règles de survol
Cette méthode doit précéder toutes les règles de survol avec
body.hasHover
. (ou un nom de classe de votre choix)La
hasHover
classe peut être ajoutée en utilisant àhasTouch()
partir du premier exemple:Cependant, cela aurait les mêmes inconvénients avec les dispositifs tactiles mixtes que les exemples précédents, ce qui nous amène à la solution ultime. Activez les effets de survol chaque fois qu'un curseur de souris est déplacé, désactivez les effets de survol chaque fois qu'un contact est détecté.
Cela devrait fonctionner essentiellement dans n'importe quel navigateur et activer / désactiver les styles de survol selon les besoins.
Voici l'exemple complet - moderne: https://jsfiddle.net/57tmy8j3/
Legacy (à utiliser avec les anciens navigateurs): https://jsfiddle.net/dkz17jc5/19/
la source
document.styleSheets
existe au lieu d'utiliser letry/catch
?try/catch
juste au cas où une erreur étrange apparaîtrait, qui pourrait planter le script, comme deleteRule ne fonctionnant pas en raison d'une politique de même origine ou d'un support irrégulier sur IE (modifié le commentaire pour refléter cela). Mais oui, dans la plupart des cas, une simple vérification devrait suffire.Adaptation du pointeur à la rescousse!
Comme cela n'a pas été touché depuis un certain temps, vous pouvez utiliser:
Regardez cette démo à la fois dans le navigateur de votre ordinateur et dans celui de votre téléphone . Pris en charge par les appareils tactiles modernes .
Remarque : gardez à l'esprit que, puisque l'entrée principale (capacité) d'un Surface PC est une souris, elle finira par être un lien bleu, même s'il s'agit d'un écran (tablette) détaché. Les navigateurs utiliseront (devraient) toujours par défaut la capacité d'entrée la plus précise.
la source
J'ai rencontré le même problème (dans mon cas avec les navigateurs mobiles Samsung) et je suis donc tombé sur cette question.
Merci à la réponse de Calsal j'ai trouvé quelque chose qui, je pense, exclura pratiquement tous les navigateurs de bureau car il semble être reconnu par les navigateurs mobiles que j'ai essayés (voir capture d'écran d'un tableau compilé: tableau de détection des fonctionnalités du pointeur CSS ).
Les documents Web MDN indiquent que
.
Ce que j'ai découvert est ce pointeur: grossier est quelque chose qui est inconnu de tous les navigateurs de bureau dans le tableau ci-joint mais connu de tous les navigateurs mobiles dans le même tableau. Cela semble être le choix le plus efficace car toutes les autres valeurs de mot-clé de pointeur donnent des résultats incohérents.
Par conséquent, vous pouvez créer une requête multimédia comme Calsal décrit mais légèrement modifiée. Il utilise une logique inversée pour exclure tous les appareils tactiles.
Sass mixin:
CSS compilé:
Il est également décrit dans cet essentiel que j'ai créé après avoir étudié le problème. Codepen pour la recherche empirique.
MISE À JOUR : Au moment de la rédaction de cette mise à jour, 2018-08-23, et soulignée par @DmitriPavlutin, cette technique ne semble plus fonctionner avec le bureau Firefox.
la source
Selon la réponse de Jason, nous ne pouvons adresser que les périphériques qui ne prennent pas en charge le survol avec des requêtes multimédias css pures. Nous pouvons également adresser uniquement les périphériques qui prennent en charge le survol , comme la réponse de moogal à une question similaire, avec
@media not all and (hover: none)
. Ça a l'air bizarre mais ça marche.J'en ai fait un mixin Sass pour une utilisation plus facile:
Mise à jour 2019-05-15 : Je recommande cet article de Medium qui passe par tous les différents appareils que nous pouvons cibler avec CSS. Fondamentalement, il s'agit d'un mélange de ces règles multimédias, combinez-les pour des cibles spécifiques:
Exemple pour des cibles spécifiques:
J'adore les mixins, c'est ainsi que j'utilise mon mixin hover pour cibler uniquement les périphériques qui le prennent en charge:
la source
Je suis confronté à un problème similaire actuellement.
Il y a deux options principales qui me viennent immédiatement à l'esprit: (1) la vérification de la chaîne utilisateur, ou (2) le maintien de pages mobiles séparées en utilisant une URL différente et en demandant aux utilisateurs de choisir ce qui est le mieux pour eux.
<link rel="mobile.css" />
style au lieu du style normal.Les chaînes utilisateur ont des informations d'identification sur le navigateur, le moteur de rendu, le système d'exploitation, etc. Ce serait à vous de décider quels appareils sont «tactiles» ou non tactiles. Vous pourrez peut-être trouver ces informations quelque part et les mapper dans votre système.
R. Si vous êtes autorisé à ignorer les anciens navigateurs , il vous suffit d'ajouter une seule règle au css normal, non mobile, à savoir:EDIT : Erk. Après avoir fait quelques expériences, j'ai découvert que la règle ci-dessous désactive également la possibilité de suivre les liens dans les navigateurs Webkit en plus de désactiver simplement les effets esthétiques - voir http://jsfiddle.net/3nkcdeao/En tant que tel, vous aurez pour être un peu plus sélectif quant à la façon dont vous modifiez les règles du boîtier mobile que ce que je montre ici, mais cela peut être un point de départ utile:
En guise de remarque, la désactivation des événements de pointeur sur un parent, puis leur activation explicite sur un enfant, fait que tous les effets de survol sur le parent redeviennent actifs si un élément enfant entre
:hover
.Voir http://jsfiddle.net/38Lookhp/5/
B. Si vous prenez en charge les moteurs de rendu Web hérités, vous devrez faire un peu plus de travail pour supprimer toutes les règles qui définissent des styles spéciaux pendant
:hover
. Pour gagner du temps à tout le monde, vous voudrez peut-être simplement créer une commande de copie + sédation automatisée que vous exécuterez sur vos feuilles de style standard pour créer les versions mobiles. Cela vous permettrait simplement d'écrire / mettre à jour le code standard et de supprimer toutes les règles de style utilisées:hover
pour la version mobile de vos pages.Là encore, vous pourrez peut-être ajouter une ou deux règles supplémentaires aux feuilles de style ou être obligé de faire quelque chose d'un peu plus compliqué en utilisant sed ou un utilitaire similaire. Ce serait probablement plus facile à appliquer: pas à vos règles de style comme
div:not(.disruptive):hover {...
dans lesquelles vous ajouteriezclass="disruptive"
des éléments à des choses ennuyeuses pour les utilisateurs mobiles utilisant js ou le langage serveur, au lieu de modifier le CSS.(II) Vous pouvez en fait combiner les deux premiers et (si vous pensez qu'un utilisateur a erré vers la mauvaise version d'une page), vous pouvez lui suggérer de basculer dans / hors de l'affichage de type mobile, ou simplement d'avoir un lien quelque part qui permet aux utilisateurs de flop d'avant en arrière. Comme déjà indiqué, les requêtes @media peuvent également être utiles pour déterminer ce qui est utilisé pour visiter.
(III) Si vous êtes partant pour une solution jQuery une fois que vous savez quels appareils sont "tactiles" et lesquels ne le sont pas, vous pouvez trouver utile que le survol CSS n'est pas ignoré sur les appareils à écran tactile .
la source
pointer-events
- c'est incroyable! C'est exactement ce que je cherchais, merci beaucoup!<a>
liens peuvent être inaccessibles souspointer-events:none
. Avec un peu de chance, cela changera plus tard - ou CSS 3.x ou 4.0+ aurapointer-events:navigation-only
ou similaire.essaye ça:
MISE À JOUR: malheureusement, le W3C a supprimé cette propriété des spécifications ( https://github.com/w3c/csswg-drafts/commit/2078b46218f7462735bb0b5107c9a3e84fb4c4b1 ).
la source
Vous pouvez utiliser Modernizr JS (voir également cette réponse StackOverflow ) ou créer une fonction JS personnalisée:
pour détecter la prise en charge de l' événement tactile dans le navigateur, puis attribuer une
CSS
propriété régulière , en parcourant l'élément avec lahtml.no-touch
classe, comme ceci:la source
html
balise au lieu de labody
balise pourrait rendre la lecture un peu meilleure. C'est en fait la solution que j'utilise actuellement. Merci quand même.Cela m'a été utile: lien
la source
C'est également une solution de contournement possible, mais vous devrez parcourir votre css et ajouter une
.no-touch
classe avant vos styles de survol.Javascript:
Exemple CSS:
La source
Ps Mais nous devons nous rappeler que de plus en plus d'appareils tactiles arrivent sur le marché, qui prennent également en charge la saisie de la souris en même temps.
la source
Ce n'est peut-être pas encore une solution parfaite (et c'est avec jQuery) mais c'est peut-être une direction / un concept sur lequel travailler: qu'en est-il du faire l'inverse? Ce qui signifie désactiver les états: hover css par défaut et les activer si un événement mousemove est détecté n'importe où sur le document. Bien sûr, cela ne fonctionne pas si quelqu'un a désactivé js. Qu'est-ce qui pourrait empêcher de procéder de cette façon?
Peut-être comme ça:
CSS:
jQuery:
la source
$('body').one.('mousemove', ...)
Essayez ceci (j'utilise background et background-color dans cet exemple):
css:
la source
La manière sale ... Pas élégante, mais la manière la plus simple qui peut vous sauver.
Supprimez tout ce qui caractérise le survol.
la source
Si votre problème est lorsque vous touchez / appuyez sur Android et tout le div couvert par une couleur bleue transparente! Ensuite, vous devez simplement changer le
CURSEUR: POINTER; vers CURSOR: DEFAULT;
utilisez mediaQuery pour vous cacher dans le téléphone mobile / tablette.
Cela fonctionne pour moi.
la source
Essayez cette solution jquery 2019 facile, bien que cela existe depuis un certain temps;
ajoutez ce plugin à la tête:
src = "https://code.jquery.com/ui/1.12.0/jquery-ui.min.js"
ajoutez ceci à js:
$ ("*"). on ("touchend", function (e) {$ (this) .focus ();}); // s'applique à tous les éléments
Voici quelques variantes suggérées:
$ (": input,: checkbox,"). on ("touchend", function (e) {(this) .focus);}); // spécifier des éléments
$ ("*"). on ("cliquer, toucher", function (e) {$ (this) .focus ();}); // inclure l'événement de clic
css: corps {curseur: pointeur; } // touchez n'importe où pour mettre fin à un focus
Remarques
Références:
https://code.jquery.com/ui/
https://api.jquery.com/category/selectors/jquery-selector-extensions/
la source