【发布时间】:2011-11-10 07:06:50
【问题描述】:
我正在使用 jQuery 和 jQuery-ui 并希望为各种对象的各种属性设置动画。
为了解释这里的问题,我将它简化为一个 div,当用户将鼠标悬停在它上面时,它会从蓝色变为红色。
使用animate() 时,我能够获得我想要的行为,但是这样做时,我制作动画的样式必须在动画代码中,因此与我的样式表是分开的。 (参见示例 1)
另一种方法是使用addClass() 和removeClass(),但我无法重新创建使用animate() 可以获得的确切行为。 (参见示例 2)
示例 1
让我们看看我有animate()的代码:
$('#someDiv')
.mouseover(function(){
$(this).stop().animate( {backgroundColor:'blue'}, {duration:500});
})
.mouseout(function(){
$(this).stop().animate( {backgroundColor:'red'}, {duration:500});
});
它显示了我正在寻找的所有行为:
- 在红色和蓝色之间平滑动画。
- 当用户将鼠标快速移入和移出 div 时,没有动画“排队”。
- 如果用户在动画仍在播放时将鼠标移出/移入,则它会在当前的“中途”状态和新的“目标”状态之间正确缓和。
但是由于样式更改是在animate() 中定义的,我必须在那里更改样式值,并且不能让它指向我的样式表。这种定义样式的“碎片化”确实让我很困扰。
示例 2
这是我目前使用addClass() 和removeClass 的最佳尝试(请注意,要使动画正常工作,您需要jQuery-ui):
//assume classes 'red' and 'blue' are defined
$('#someDiv')
.addClass('blue')
.mouseover(function(){
$(this).stop(true,false).removeAttr('style').addClass('red', {duration:500});
})
.mouseout(function(){
$(this).stop(true,false).removeAttr('style').removeClass('red', {duration:500});
});
这展示了我最初要求的属性 1. 和 2.,但是 3 不起作用。
我明白原因:
当动画addClass() 和removeClass() 时,jQuery 会为元素添加一个临时样式,然后递增适当的值,直到它们达到提供的类的值,然后才实际添加/删除类。
因此,我必须删除样式属性,否则如果动画中途停止,样式属性将保留并永久覆盖任何类值,因为标签中的样式属性比类样式更重要。
但是,当动画完成一半时,它还没有添加新的类,因此在这个解决方案中,当用户在动画完成之前移动鼠标时,颜色会跳转到之前的颜色。
理想情况下我想要的是能够做这样的事情:
$('#someDiv')
.mouseover(function(){
$(this).stop().animate( getClassContent('blue'), {duration:500});
})
.mouseout(function(){
$(this).stop().animate( getClassContent('red'), {duration:500});
});
getClassContent 只会返回所提供类的内容。关键是这样我就不必到处保留样式定义,而是可以将它们保存在样式表中的类中。
【问题讨论】:
-
您需要支持哪些版本的IE?你会对 IE9 满意吗?还是需要低支持?
-
老实说,我根本不关心 IE。这一切都只在 webkit 浏览器(safari/chrome)上进行了测试。
-
getClassContent长什么样子?
标签: javascript jquery css jquery-ui jquery-animate