我可以通过JavaScript禁用CSS:悬停效果吗?

meo*_*meo 95 javascript css jquery

我试图阻止浏览器:hover通过JavaScript 使用CSS 的效果.

我在我的CSS中设置了aa:hover样式,因为如果JS不可用,我想要一个悬停效果.但是,如果JS 可用的,我要覆盖更平滑一个我的CSS悬停效果(例如使用jQuery的颜色插件.)

我试过这个:

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

我也尝试过return false;,但它不起作用.

这是我的问题的一个例子:http://jsfiddle.net/4rEzz/.链接应该褪色而不会变灰.

正如fudgey所提到的,一种解决方法是重置悬停样式,.css()但是我必须覆盖CSS中指定的每个属性(参见http://jsfiddle.net/raPeX/1/).我正在寻找通用的解决方案.

有谁知道如何做到这一点?

PS:我不想覆盖我为悬停设置的每一种风格.

Pau*_*ite 134

我担心没有纯粹的JavaScript通用解决方案.JavaScript无法关闭CSS :hover状态本身.

您可以尝试以下替代解决方法.如果你不介意在你的HTML和CSS中稍微乱搞,它可以节省你必须通过JavaScript手动重置每个CSS属性.

HTML

<body class="nojQuery">
Run Code Online (Sandbox Code Playgroud)

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 */
}
Run Code Online (Sandbox Code Playgroud)

JavaScript的

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

$(function(){}
    $('body').removeClass('nojQuery');
)
Run Code Online (Sandbox Code Playgroud)

  • 我比noscript解决方案更喜欢这个解决方案,因为当CSS完全包含在外部文件中时它可以工作,并且它在页面加载期间也可以工作,如果CSS首先加载但JS直到稍后才加载.使用jQuery"逐步增强"事物通常会导致页面在完成加载之前点击内容时效果不佳.即使在快速链接上使用快速浏览器,我也会看到很多. (5认同)
  • "我比noscript解决方案更喜欢这个解决方案,因为当CSS完全包含在外部文件中时,这种方法很有效" - `<noscript>`解决方案也是如此.你只需在`<noscript>`中添加`<link>`标签,而不是`<style>`标签.我的解决方案允许您将所有内容保存在一个样式表文件中,而不是多个文件中. (3认同)

Kai*_*ack 14

只是一个较短的答案......

使用仅分配了悬停的第二个类:

HTML

 <a class="myclass myclass_hover" href="#">My anchor</a>
Run Code Online (Sandbox Code Playgroud)

CSS

 .myclass { 
   /* all anchor styles */
 }
 .myclass_hover:hover {
   /* example color */
   color:#00A;
 }
Run Code Online (Sandbox Code Playgroud)

现在您可以使用Jquery删除该类,例如,如果已单击该元素:

JQUERY

 $('.myclass').click( function(e) {
    e.preventDefault();
    $(this).removeClass('myclass_hover');
 });
Run Code Online (Sandbox Code Playgroud)

希望这个答案很有帮助.

  • 加上1.它不是正统的,而是以一种非常崇高的方式解决问题. (3认同)

Ste*_*n P 11

您可以使用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);
Run Code Online (Sandbox Code Playgroud)

使属性!重要并使其成为最后一个CSS定义应覆盖任何先前的定义,除非更具体地定位.在这种情况下,您可能必须插入更多规则.

  • 或者将你的noscript样式表`<link>`标记放在`<noscript>`元素中?那有用,对吗? (2认同)

Jos*_*osh 11

这与aSeptik的答案类似,但这种方法呢?使用<noscript>标记中的JavaScript包装要禁用的CSS代码.这样,如果关闭javaScript,:hover将使用CSS ,否则将使用JavaScript效果.

例:

<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>
Run Code Online (Sandbox Code Playgroud)


Col*_*una 5

我使用了not()CSS 运算符和 jQuery 的addClass()函数。这是一个示例,当您单击列表项时,它将不再悬停:

例如:

HTML

<ul class="vegies">
    <li>Onion</li>
    <li>Potato</li>
    <li>Lettuce</li>
<ul>
Run Code Online (Sandbox Code Playgroud)

CSS

.vegies li:not(.no-hover):hover { color: blue; }
Run Code Online (Sandbox Code Playgroud)

jQuery

$('.vegies li').click( function(){
    $(this).addClass('no-hover');
});
Run Code Online (Sandbox Code Playgroud)