好的,我正在更改CSS的“left”属性的值,像这样:
s_list.style.left = left - amount + 'px';
s_list是一个UL元素的变量。此行代码在点击按钮时执行。但效果是瞬间的,太快了,无法看到任何动画效果。是否有什么方法可以用纯JS来减慢速度或添加可配置的延迟以改变这种情况?
要查看我的演示,请访问:
http://jsfiddle.net/benhowdle89/RCkPq/
并可能建议一种解决方案!
好的,我正在更改CSS的“left”属性的值,像这样:
s_list.style.left = left - amount + 'px';
s_list是一个UL元素的变量。此行代码在点击按钮时执行。但效果是瞬间的,太快了,无法看到任何动画效果。是否有什么方法可以用纯JS来减慢速度或添加可配置的延迟以改变这种情况?
要查看我的演示,请访问:
http://jsfiddle.net/benhowdle89/RCkPq/
并可能建议一种解决方案!
对于基本动画,可以使用setTimeout
或setInterval
。然而,在现代浏览器中它们已经过时了。一个更有效的方法来实现动画效果是使用requestAnimationFrame
。
function animate(things){
//Do stuff here.
requestAnimationFrame(animate);
}
"这有什么不同?"
,那么,requestAnimationFrame
仅在用户能够看到元素时才重新绘制屏幕。如果用户在另一个标签页上或向下滚动页面,则它不会重新绘制。它可以节省计算机的内存。if ( !window.requestAnimationFrame ) {
window.requestAnimationFrame = ( function() {
return window.webkitRequestAnimationFrame || //webkit
window.mozRequestAnimationFrame || //mozilla
window.oRequestAnimationFrame || //opera
window.msRequestAnimationFrame || //IE!
function(callback, element) {
window.setTimeout( callback, 1000 / 60 ); //not supported
};
} )();
}
演示:
http://jsfiddle.net/DerekL/4wLsC/
http://jsfiddle.net/DerekL/4wLsC/4/
- 循环播放图片 (仍未使用 jQuery!)setInterval
或一系列setTimeout
,其中每个步骤都将元素移动几个像素,以实现动画效果。function move(){
s_list.style.left = s_list.style.left - amount/10 + 'px';
if (s_list.style.left.slice(0, -2) > desired_offset){
setTimeout(move,10);
}
}
这将元素移动 amount/10 像素,并重复此操作,直到达到所需位置。amount/10 可以更改为任何您想要的速率/速度。
编辑:添加了 .slice 用于字符串/数字比较(感谢 Wex)
双重编辑:请听下面评论中的 Wex 的建议。
s_list.style.left = s_list.style.left - amount/10
的中间值存储在临时变量中来改进此解决方案,如果它大于所需的偏移量,则将当前值设置为临时值;否则将当前值设置为所需的偏移量(这样就不会有溢出)。 - Wex
requestAnimationFrame
。 ;) - Derek 朕會功夫