Comment faire pour supprimer/ignorer :hover css style sur les appareils tactiles
Je veux ignorer toutes les :hover
déclarations CSS si un utilisateur visite notre site web via touch. Parce que le :hover
CSS n'a pas de sens, et il peut même être gênant si une tablette déclenche sur cliquez/tapez sur, car alors il pourrait s'en tenir jusqu'à ce que l'élément perd le focus. Pour être honnête, je ne sais pas pourquoi les appareils tactiles sentir la nécessité de déclencher :hover
en premier lieu - mais c'est la réalité, ce problème est en réalité aussi.
a:hover {
color:blue;
border-color:green;
//etc. > ignore all at once for touch devices
}
Alors, comment puis-je supprimer/ignorer toutes les CSS :hover
déclarations à la fois (sans avoir à connaître chacun) pour les appareils tactiles d'après les avoir déclarés?
- Ceci est similaire à Comment prévenir collant effets de survol pour les boutons sur les appareils tactiles - cependant, plus général
- Je contourner cela avec une solution php où je découvre si l'appareil est mobile ou non, et d'utiliser la bonne feuille de style avec les divers changements sur cette base. Cela ne répond pas à votre question. Vous pouvez éventuellement utiliser @media queries, mais ce n'est pas garanti de fonctionner lorsque les téléphones et les tablettes ont la pleine résolution hd.
- Double Possible de Désactiver les effets de survol sur les navigateurs mobiles
Vous devez vous connecter pour publier un commentaire.
Il existe de multiples solutions pour ce problème.
Rapide n'dirty - supprimer :hover styles à l'aide de JS
Vous pouvez supprimer toutes les règles CSS contenant
:hover
à l'aide de Javascript. Cela a l'avantage de ne pas avoir à toucher CSS et être compatible même avec les anciens navigateurs.Limitations: les feuilles de style doivent être hébergées sur le même domaine (ce qui signifie pas d'Cdn). Désactive plane sur les souris & appareils tactiles comme la Surface, qui fait mal au UX.
CSS uniquement utiliser des requêtes de média
Placez tous vos :hover règles dans un
@media
bloc:ou sinon, remplacer tous vos hover règles (compatible avec les anciens navigateurs):
Limitations: ne fonctionne que sur iOS 9.0+, Chrome pour Android ou Android 5.0+ lors de l'utilisation de WebView.
hover: hover
pauses effets de survol sur les navigateurs plus anciens,hover: none
besoins écrasant tous définies précédemment règles CSS. Les deux sont incompatible avec un mélange de souris & appareils tactiles.Le plus robuste - utilisation spéciale de la classe CSS et de détecter le contact via JS
Cette méthode doit précéder toutes les hover règles
body.hasHover
. (ou un nom de classe de votre choix)La
hasHover
classe peuvent être ajoutés à l'aide dehasTouch()
de premier exemple: leCependant, cela a le même problème avec un mélange de toucher les appareils comme les exemples précédents, qui nous apporte la solution ultime. Activer le survol des effets à chaque fois que le curseur de la souris est déplacé, désactiver les effets de survol à chaque fois qu'une touche est détectée.
Cela devrait fonctionner essentiellement dans n'importe quel navigateur et active/désactive la fonction hover styles en tant que de besoin. Essayer ici: https://jsfiddle.net/dkz17jc5/19/
document.styleSheets
existe au lieu d'utiliser letry/catch
?try/catch
juste au cas où certains impairs d'erreur s'affiche, que l'on pouvait faire planter le script, comme deleteRule pas de travail en raison de la même origine politique ou feuilletée appui sur IE (édité le commentaire pour refléter le fait que). Mais oui, dans la plupart des cas, une simple vérification devrait être suffisant.var touch = (('ontouchstart' in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0));
@import url('path/to/stylesheet.css')
. Je suis curieux de savoir pourquoi.li, a:hover { border: 1px solid red; }
selectorText
seraitli, a:hover
. En utilisant ce code tous lesli
perd de leur frontière. Seulementa:hover
devraient perdre de leur frontière.JS: var styleSheet = document.styleSheets[si]; if (styleSheet && styleSheet.href && ~styleSheet.href.indexOf(location.href) && styleSheet.rules ) { ... }
Pointeur d'adaptation à la rescousse!
Depuis cela n'a pas été touché dans un certain temps, vous pouvez utiliser:
Voir ce démo dans votre navigateur de bureau et le navigateur de votre téléphone. Pris en charge par modernes, les appareils tactiles.
Note: Gardez à l'esprit que, depuis une Surface de PC d'entrée primaire (capacité) est une souris, il finira par être un lien bleu, même si c'est une maison individuelle (comprimés) écran. Les navigateurs (doivent) toujours par défaut la plus précise d'entrée de capacité.
Je fais face à un problème similaire actuellement.
Il y a deux principal options qui se produisent à moi immédiatement: (1) l'utilisateur de la chaîne de contrôle, ou (2) le maintien de séparer les pages mobiles en utilisant une URL différente et d'avoir les utilisateurs à choisir ce qui est mieux pour eux.
<link />
au lieu de le style normal.Utilisateur chaînes d'informations sur l'identification du navigateur, moteur de rendu, système d'exploitation, etc. Il serait à vous de décider quels sont les dispositifs de "toucher" par rapport aux non-tactile. Vous pouvez être en mesure de trouver cette information disponible quelque part et carte dans votre système.
A. Si vous êtes autorisé à ignorer les vieux navigateurs, vous avez juste à ajouter une seule règle à la normale, non mobiles, css, à savoir:MODIFIER: Erk. Après avoir fait quelques essais, j'ai découvert les dessous de la règle désactive également la possibilité de suivre les liens dans webkit-navigateurs en plus de la simple cause de l'effet esthétique pour être désactivée, voir http://jsfiddle.net/3nkcdeao/en tant Que tel, vous aurez besoin d'être un peu plus sélectif sur la façon de modifier les règles pour le cas de mobile que ce que je montre ici, mais il peut être un point de départ utile:
Au passage, la désactivation de l'aiguille des événements sur un parent, puis de l'activer explicitement sur un enfant provoque actuellement aucune placez-les effets sur la mère de redevenir actif si un enfant-élément entre dans
:hover
.Voir http://jsfiddle.net/38Lookhp/5/
B. Si vous êtes à l'appui de l'héritage web-moteurs de rendu, vous aurez à faire un peu plus de travail le long de la lignes de la suppression de toutes les règles qui définissent les styles spéciaux au cours de
:hover
. Pour sauver tout le monde de temps, vous pourriez juste voulez construire un système automatisé de copie + seding commande que vous exécutez sur votre standard des feuilles de style pour créer les versions mobiles. Qui vous permettra de simplement écrire/mise à jour le code standard et récurez n'importe quel style-règles d'utilisation:hover
pour la version mobile de vos pages.Encore une fois ici, vous pouvez peut-être juste ajouter une règle supplémentaire ou deux pour les feuilles de style ou être forcé à faire quelque chose de légèrement plus compliqué de sed ou un utilitaire similaire. Il serait probablement plus facile à appliquer :ne pas vos règles de style comme
div:not(.disruptive):hover {...
dans lequel vous ajoutezclass="disruptive"
à des éléments faisant des choses ennuyeuses pour les utilisateurs mobiles à l'aide de js ou la langue du serveur, au lieu de munging le CSS.(II) Vous pouvez combiner les deux premières et (si vous pensez qu'un utilisateur a erré à la mauvaise version d'une page), vous pouvez suggérer qu'ils passent dans le mobile-type d'affichage, ou tout simplement avoir un lien quelque part qui permet aux utilisateurs de flop en arrière et en avant. Comme déjà indiqué, @media queries pourrait aussi être quelque chose à regarder à utiliser dans la détermination de ce qui est utilisé pour visiter.
(III) Si vous êtes pour un jQuery solution une fois que vous savez quels sont les dispositifs de "toucher" et qui ne le sont pas, vous pourriez trouver CSS hover ne pas être ignoré sur les appareils à écran tactile utile.
pointer-events
- c'est incroyable! C'est exactement ce que je cherchais, merci beaucoup!<a>
des liens peuvent être inaccessibles enpointer-events:none
. Avec un peu de chance, cela va changer plus tard – ou CSS 3.x ou 4.0+ aurapointer-events:navigation-only
ou similaire.J'ai rencontré le même problème (dans mon cas avec Samsung mobile navigateurs) et donc je suis tombé sur cette question.
Grâce à Calsal réponse j'ai trouvé quelque chose qui, je crois, d'exclure pratiquement tous les navigateurs de bureau, car il semble être reconnu par les navigateurs mobiles que j'ai essayé (voir capture d'écran d'un tableau établi: CSS pointeur de fonction tableau de détection ).
MDN web docs état que
.
Ce que j'ai découvert, c'est que pointeur: grosse est quelque chose qui est inconnu à tous les navigateurs de bureau dans le tableau ci-joint, mais connu de tous les navigateurs mobiles dans la même table. Ce qui semble être le plus efficace choix, car tous les autres pointeur mot-clé les valeurs de donner des résultats incohérents.
Par conséquent, vous pouvez créer une requête de média comme Calsal décrit, mais légèrement modifié. Il rend l'utilisation de l'inversion de la logique de la règle de tous les appareils tactiles.
Mixin Sass:
Compilé CSS:
Il est également décrite dans ce gist j'ai créé après des recherches sur le problème.
Codepen pour la recherche empirique.
Mise à JOUR:
En date de rédaction de cette mise à jour, 2018-08-23, et souligné par @DmitriPavlutin cette technique ne semble plus fonctionner avec Firefox desktop.
essayez ceci:
Mise à JOUR: malheureusement, le W3C a supprimé cette propriété de le specs (https://github.com/w3c/csswg-drafts/commit/2078b46218f7462735bb0b5107c9a3e84fb4c4b1).
Vous pouvez utiliser Modernizr JS (voir aussi ce StackOverflow répondre), ou d'en faire un personnalisé JS fonction:
à détecter l'appui de la touche événement dans le navigateur, puis d'affecter une régulière
CSS
de la propriété, de la traversée de l'élément avec lahtml.no-touch
classe, comme ceci:html
tag au lieu de labody
balise peut faire un peu mieux à lire. C'est effectivement la solution que j'utilise actuellement. Merci à vous de toute façon.C'est aussi une solution de contournement possible, mais vous devrez passer par votre css et ajouter un
.no-touch
classe avant votre vol stationnaire styles.Javascript:
CSS Exemple:
Source
P. s. Mais rappelons-nous, il y a de plus en plus tactile des appareils sur le marché, qui sont aussi de soutenir les actions de la souris en même temps.
Ce ne serait pas une solution parfaite, encore (et c'est avec jQuery) mais peut-être que la direction /le concept de travailler sur ce sujet de faire l'inverse? Ce qui signifie désactivation de l' :hover css états par défaut et de les activer si un événement est détecté n'importe où sur le document. Bien sûr, cela ne fonctionne pas si quelqu'un a désactivé js. Quoi d'autre peut s'exprimer à l'encontre de cette façon de ronde?
Peut-être comme ceci:
CSS:
jQuery:
$('body').one.('mousemove', ...)
Selon Jasons répondre nous permet de répondre qu'à des appareils qui ne supportent pas de passer pur css media queries. Nous pouvons également aborder uniquement les périphériques qui prennent en charge stationnaire, comme moogals répondre à une question similaire, avec
@media not all and (hover: none)
. Il semble bizarre, mais ça fonctionne.J'ai fait un mixin Sass de ce pour une utilisation plus facile:
Mise à jour 2019-05-15: je recommande cet article de la Moyenne qui passe à travers tous les différents appareils que nous pouvons cibler avec les CSS. En gros c'est un mix de ces règles, de les combiner pour objectifs spécifiques:
Exemple pour des objectifs spécifiques:
J'aime mixin, c'est comment je l'utilise:
Il a été utile pour moi: lien
Essayez ceci (j'en arrière-plan et la couleur d'arrière-plan dans cet exemple):
css:
Essayer ce facile 2019 jquery solution, bien que son été un certain temps;
ajouter ce plugin à la tête:
src="https://code.jquery.com/ui/1.12.0/jquery-ui.min.js"
ajouter à js:
$("*").sur("touchend", function(e) { $(this).focus(); }); //s'applique à tous les éléments
certains ont suggéré les variations sont les suivantes:
$(":entrée :case").sur("touchend", function(e) {(ce).l'accent);}); //spécifier les éléments
$("*").on("click, touchend", function(e) { $(this).focus(); }); //inclure cliquez sur l'événement
css: body { curseur: pointeur; } //touchez n'importe où à la fin de l'accent
Notes
Références:
https://code.jquery.com/ui/
https://api.jquery.com/category/selectors/jquery-selector-extensions/