【发布时间】:2018-04-18 20:55:20
【问题描述】:
我有以下 JSFiddle,其中通过使用 requestAnimationFrame,一个元素会沿着 x 轴不断地在其容器的边缘反弹; https://jsfiddle.net/anhd08so/
基本上,在每一帧上,我将定义的速度 (vx) 添加到位置 (x)。然后我检查新位置是否超出范围,如果是,我设置为最小值,并将vx反转为另一个方向。
var x = 50;
var vx = 5;
var step = function(){
x = x + vx;
if(x < 0) {
x = 1;
vx = Math.abs(vx);
} else if(x > 400) {
x = 400;
vx = -Math.abs(vx);
}
el.css("left", x);
requestAnimationFrame(step);
};
这行得通,但方向的改变真的很突然,不现实。我想添加缓动,以便元素在接近边缘时逐渐减速,并在另一个方向再次加速。
我尝试用vx = vx - vx * 0.3 替换Math.abs 之类的东西来做到这一点,虽然它确实减慢了速度,但当它走另一条路时,它再也不会获得等量的反向速度。
这对于 CSS 过渡/关键帧来说当然是小菜一碟,但我的用例需要在代码中逐帧定义运动。
如何为这个动作添加缓动,让元素改变方向看起来更真实?
【问题讨论】:
-
为什么不使用正弦函数?例如,
var t = 0; var step = function() { var x = Math.floor(Math.cos(t)*198+200.5); t += 0.03; /*...*/ } -
这看起来更有希望!如果舞台或项目的大小不同,198 和 200.5 是什么关系?
-
嗯,正弦函数(或余弦,在这种情况下)在 -1 和 +1 之间变化。所以如果你想覆盖从-200到+200的范围,你应该乘以200(所以它覆盖了-200到+200的范围),然后加上200(给你从0到400的范围)。我稍微降低了乘数,因为您移动的条的宽度为 2px,如果您坚持 200 的幅度,它将与封闭矩形的末端重叠。但是您可以输入任何您喜欢的数字。值 0.03 会影响运动的速度。把它改成0.06,动画会快一倍。
标签: javascript animation math