Puis-je désactiver un effet CSS:hover via JavaScript?

j'essaie d'empêcher le navigateur d'utiliser L'effet :hover du CSS, via JavaScript.

j'ai mis les styles a et a:hover dans mon CSS, parce que je veux un effet de vol stationnaire, si JS n'est pas disponible. Mais si JS est disponible, je veux écraser mon effet de hover CSS avec un plus lisse (en utilisant le plugin couleur jQuery par exemple.)

j'ai essayé ceci:

$("ul#mainFilter a").hover(
     function(e){ e.preventDefault(); ...do my stuff... }, 
     function(e){ e.preventDefault(); ...do my stuff... });

J'ai aussi essayé avec return false; , mais il ne fonctionne pas.

voici un exemple de mon problème: http://jsfiddle.net/4rEzz / . Le lien devrait juste disparaître sans devenir gris.

comme mentionné par fudgey, une solution de rechange serait de réinitialiser les styles de vol stationnaire en utilisant .css() mais je devrais écraser chaque propriété simple, spécifiée dans le CSS (voir ici: http://jsfiddle.net/raPeX/1 / ). Je suis la recherche d'une solution générique.

est-ce que quelqu'un sait faire ça?

PS: Je ne veux pas écraser tous les styles que j'ai mis pour le hover.

90
demandé sur meo 2010-05-02 22:53:49

9 réponses

il n'y a pas de solution générique JavaScript pure, je le crains. JavaScript n'est pas capable de désactiver l'état CSS :hover lui-même.

Vous pouvez essayer la solution de remplacement. Si cela ne vous dérange pas de vous balader un peu dans votre HTML et CSS, cela vous évite d'avoir à réinitialiser toutes les propriétés CSS manuellement via JavaScript.

HTML

<body class="nojQuery">

CSS

/* Limit the hover styles in your CSS so that they only apply when the nojQuery 
class is present */

body.nojQuery ul#mainFilter a:hover {
    /* CSS-only hover styles go here */
}

JavaScript

// When jQuery kicks in, remove the nojQuery class from the <body> element, thus
// making the CSS hover styles disappear.

$(function(){}
    $('body').removeClass('nojQuery');
)
129
répondu Paul D. Waite 2010-05-05 00:09:56

juste une réponse plus courte...

utiliser une deuxième classe qui a seulement le vol stationnaire assigné:

HTML

 <a class="myclass myclass_hover" href="#">My anchor</a>

CSS

 .myclass { 
   /* all anchor styles */
 }
 .myclass_hover:hover {
   /* example color */
   color:#00A;
 }

Maintenant, vous pouvez utiliser Jquery pour supprimer la classe, par exemple, si l'élément a été cliqué:

JQUERY

 $('.myclass').click( function(e) {
    e.preventDefault();
    $(this).removeClass('myclass_hover');
 });

J'espère que cette réponse est utile.

12
répondu Kai Noack 2014-09-24 18:30:32

vous pouvez manipuler les feuilles de style et les règles de feuille de style eux-mêmes avec javascript

var sheetCount = document.styleSheets.length;
var lastSheet = document.styleSheets[sheetCount-1];
var ruleCount;
if (lastSheet.cssRules) { // Firefox uses 'cssRules'
    ruleCount = lastSheet.cssRules.length;
}
else if (lastSheet.rules) { / /IE uses 'rules'
    ruleCount = lastSheet.rules.length;
}
var newRule = "a:hover { text-decoration: none !important; color: #000 !important; }";
// insert as the last rule in the last sheet so it
// overrides (not overwrites) previous definitions
lastSheet.insertRule(newRule, ruleCount);

faire les attributs !important et en faisant de cette définition la toute dernière définition CSS devrait l'emporter sur toute autre définition antérieure, à moins qu'elle ne soit plus spécifiquement ciblée. Vous pourriez avoir à insérer plus de règles dans ce cas.

11
répondu Stephen P 2010-05-04 23:02:44

c'est similaire à la réponse d'aSeptik, mais qu'en est-il de cette approche? Envelopper le code CSS que vous voulez désactiver en utilisant JavaScript dans les étiquettes <noscript> . De cette façon, si javaScript est désactivé, le CSS :hover sera utilisé, sinon L'effet JavaScript sera utilisé.

exemple:

<noscript>
<style type="text/css">
ul#mainFilter a:hover {
  /* some CSS attributes here */
}
</style>
</noscript>
<script type="text/javascript">
$("ul#mainFilter a").hover(
     function(o){ /* ...do your stuff... */ }, 
     function(o){ /* ...do your stuff... */ });
</script>
11
répondu Josh 2010-05-05 13:51:38

j'utiliserais CSS pour empêcher l'événement :hover de changer l'apparence du lien.

a{
  font:normal 12px/15px arial,verdana,sans-serif;
  color:#000;
  text-decoration:none;
}

ce simple CSS signifie que les liens seront toujours noirs et non soulignés. Je ne peux pas dire à partir de la question si le changement dans l'apparence est la seule chose que vous voulez contrôler.

3
répondu Christopher Altman 2010-05-02 18:59:48

j'ai utilisé l'opérateur css not() et la fonction addClass() de jQuery. Voici un exemple, lorsque vous cliquez sur un élément de liste, il ne sera plus hover:

par exemple:

HTML

<ul class="vegies">
    <li>Onion</li>
    <li>Potato</li>
    <li>Lettuce</li>
<ul>

CSS

.vegies li:not(.no-hover):hover { color: blue; }

jQuery

$('.vegies li').click( function(){
    $(this).addClass('no-hover');
});
2
répondu CodingCaio 2016-04-03 14:29:44

essayez juste de définir la couleur du lien:

$("ul#mainFilter a").css('color','#000');

Edit: ou mieux encore, utiliser le CSS, comme Christopher a suggéré de

1
répondu Mottie 2010-05-02 19:02:15

en fait une autre façon de résoudre cela pourrait être, en écrasant la CSS avec insertRule .

il donne la possibilité d'injecter des règles CSS à une feuille de style existante/nouvelle. Dans mon exemple concret, il ressemblerait à ceci:

//creates a new `style` element in the document
var sheet = (function(){
  var style = document.createElement("style");
  // WebKit hack :(
  style.appendChild(document.createTextNode(""));
  // Add the <style> element to the page
  document.head.appendChild(style);
  return style.sheet;
})();

//add the actual rules to it
sheet.insertRule(
 "ul#mainFilter a:hover { color: #0000EE }" , 0
);

démo avec mon exemple original de 4 ans: http://jsfiddle.net/raPeX/21 /

1
répondu meo 2014-11-12 13:53:26

je recommande de remplacer toutes les propriétés :hover par :active quand vous détectez que l'appareil supporte le toucher. Suffit d'appeler cette fonction lorsque vous le faites que touch() .

function touch() {
  if ('ontouchstart' in document.documentElement) {
    for (var sheetI = document.styleSheets.length - 1; sheetI >= 0; sheetI--) {
      var sheet = document.styleSheets[sheetI];
      if (sheet.cssRules) {
        for (var ruleI = sheet.cssRules.length - 1; ruleI >= 0; ruleI--) {
          var rule = sheet.cssRules[ruleI];

          if (rule.selectorText) {
            rule.selectorText = rule.selectorText.replace(':hover', ':active');
          }
        }
      }
    }
  }
}
1
répondu Shobhit Sharma 2017-07-04 12:09:08