CSS悬停与JavaScript鼠标悬停


84

有时候,我可以选择使用CSS元素:悬停或JavaScript onmouseover来控制页面上html元素的外观。考虑以下情况,其中div包装了输入

<div>
<input id="input">
</div>

我希望输入将鼠标光标悬停在div上时更改背景色。CSS方法是

<style>
  input {background-color:White;}
  div:hover input {background-color:Blue;}
</style>

<div><input></div>

JavaScript方法是

<div onmouseover="document.getElementById('input').style.backgroundColor='Blue';">
  <input id="input">
</div>

每种方法的优缺点是什么?CSS方法是否适用于大多数Web浏览器?JavaScript比CSS慢吗?


1
CSS方法不需要Javascript。

我建议使用Whatever:hoverhttp
//www.xs4all.nl/~peterned/csshover.html

3
“ JavaScript比CSS慢吗?” 您不会注意到它,但是如果同时运行许多其他脚本(特别是对于手持设备,移动网站而言),则javascript将占用更多资源并可能减慢运行速度,而这并不是它的用途。另一方面,CSS使用较少的资源,并且仅用于表示。您应该只使用javascript来增强网站的导航和功能,但是对于未启用js的用户,它仍然可以导航。我建议使用CSS:hover方法。
Jose Faeti 2011年

1
这是一个古老的问题,因此上面的评论不再有效并且可能从未生效也就不足为奇了。原因之一是缺乏提供高性能样板的良好JS库(请参阅Famo.us)。另一个是,现代浏览器(无论是台式机还是移动设备)中的JS引擎都非常快。有一个基准可以衡量它是本机C编译代码性能的80%。当然也有例外情况,但是JS在浏览器中的出色表现仍然存在。人们真正的“意思”是DOM很慢。JS相当快,他们只是从未意识到。
pmont,2015年

Answers:


59

:hover的问题是IE6仅在链接上支持它。最近,我将jQuery用于此类事情:

$("div input").hover(function() {
  $(this).addClass("blue");
}, function() {
  $(this).removeClass("blue");
});

使事情变得容易得多。可以在IE6,FF,Chrome和Safari中使用。


我做了快速测试...显然IE7不支持div:hover?
约翰

是的,IE7对CSS2的支持程度约为50%。许多网页设计师无法忍受的部分原因。
艾伦(Alan)2009年

但是对于所有这些跟踪器,嗅探器和黑客,他们都尽其所能地滥用沙盒。并不是说它有助于阻止跟踪,而是人们试图使其变得更难理解,这是可以理解的。我知道不允许饼干的人。他们也有正当的理由,只要看一下火警。我仍然支持您的回答,因为我希望人们能在2013年到达这里,意识到他们无论如何都会被跟踪并启用我最喜欢的玩具。
jascha 2013年

我想知道metroui是否使用户能够禁用javascript:p,但是严重的是,chromeos,mozilla的os,metroui都使用javascript。html5,css3,webgl和javascript将在几年内成为创建客户端应用程序的语言。请耐心等待,不久浏览器之外将出现javascript,无需再在浏览器中将其禁用:)
jascha 2013年

32

CSS之一更具可维护性和可读性。


18
它是可维护的,直到您必须在非<a>元素上支持IE6。然后这很痛苦,因为您必须使用JS-hack。但是CSS仍然是我首选的方式。让使用1999浏览器的人拥有1999的体验。
泰森

4
人们应该更新这是最好的解决方案...我建议添加一个标记来检测浏览器,并告诉他们使用IE <7更新
Travis Pessetto 2011年

11

为什么不兼得?使用jQuery制作动画效果,并使用CSS作为后备。这为您带来了jQuery的好处,同时还具有优美的降级效果

CSS:

a {color: blue;}
a:hover {color: red;}

jQuery(使用jQueryUI设置颜色动画):

$('a').hover( 
  function() {
    $(this)
      .css('color','blue')
      .animate({'color': 'red'}, 400);
  },
  function() {
    $(this)
      .animate({'color': 'blue'}, 400);
  }
);

演示


1
对于CSS过渡,我认为,仅当将:Hover应用于较旧的IE浏览器中的非锚定标记时,才应使用javascript作为后备。
亚当·杨格斯

jsbin上的一些更改使该演示无法正常工作。我更新了该演示以引用当前版本的jQuery,然后所有工作再次生效。
kingjeffrey

10

在javascript中执行此操作的另一个好处是,您可以在不同的时间点添加/删除悬停效果-例如,将悬停在表格行上会更改颜色,单击会禁用悬停效果并开始就地编辑模式。


谢谢-这实际上回答了我正在寻找的问题!:-)
Peter S Magnusson

6

很大的不同是,当鼠标移出元素时,“:hover”状态会自动停用。结果,应用于悬停的任何样式都会自动反转。另一方面,使用javascript方法,您必须定义“ onmouseover”和“ onmouseout”事件。如果仅定义“ onmouseover”,则除非您明确定义了“ onmouseout”,否则即使您将鼠标移出,应用的“ onmouseover”样式也将保留。


6

编辑:这个答案不再成立。CSS得到了很好的支持,现在任何网络体验都非常需要Javascript(阅读:JScript),并且很少有人禁用JavaScript。

原始答案是我2009年的观点。

从我的头顶上:

使用CSS,可能对浏览器的支持有疑问。

使用JScript,人们可以禁用jscript(这就是我要做的)。

我相信首选的方法是使用HTML,使用CSS进行布局以及JScript中的任何动态内容。因此,在这种情况下,您可能希望采用CSS方法。


3
为什么要禁用JavaScript?您喜欢千年前的经历吗?
亚历克斯

5
因为存在安全隐患,并且太多网站滥用javascript。我使用一个漂亮的firefox插件“ NoScript”,该插件有选择地允许您仅启用所需站点中的脚本。
艾伦(Alan)2009年

5

两者之间要记住另一个差异。使用CSS,当鼠标移离某个元素时,:hover状态始终处于禁用状态。但是,使用JavaScript,onmouseout当鼠标从元素移到浏览器镶边而不是页面其余部分时,不会触发该事件。

这种情况比您想象的要经常发生,尤其是当您使用自定义悬停状态在页面顶部制作导航栏时。


4

在Internet Explorer中,必须声明一个<!DOCTYPE>,以便:hover选择器可用于除<a>元素之外的其他元素。



2

为了防止使用jQuery进行悬停,我始终使用插件HoverIntent,因为它不会触发事件,直到您将元素暂停一小段时间...如果您不小心运行了,这会停止触发大量的鼠标悬停事件将鼠标悬停在它们上方或只是在选择一个选项时。


0

如果您不需要在禁用javascript的情况下对IE6的100%支持,则可以使用带有IE条件注释的ie7-js之类的东西。然后,您只需使用CSS规则来应用悬停效果。我不知道它是如何工作的,但是它使用javascript来使很多CSS规则正常工作,而这些规则在IE7和8中通常是不起作用的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.