RequestAnimationFrame - 我应该使用 DOMHighResTimeStamp 参数吗?
RequestAnimationFrame - should I use the DOMHighResTimeStamp parameter?
我一直在努力研究如何使用 requestAnimationFrame,结果我很困惑。
根据 Mozilla,如果你有一个名为 'step' 的动画函数,你用 requestAnimationFrame(step)
调用,step
接受一个毫秒数的参数, DOMHighResTimeStamp 参数。
然而我在网上看到的关于如何使用 requestAnimationFrame 的每个示例都没有使用这个参数。一些示例坚持认为您可以假设 step
函数每秒将 运行 60 次,因此它们根本不使用任何 time
概念。其他人通过使用 new Date();
将他们自己的 "number of milliseconds" 与参数分开 - 我想修改这些示例以使用参数代替是很容易的。
假设函数每秒 运行 60 次是否可以?似乎......对我来说不明智。 Mozilla 说 "The number of callbacks is usually 60 times per second, but will generally match the display refresh rate in most web browsers as per W3C recommendation",这让我对这个假设感到不舒服。为什么人们使用他们自己的 new Date()
方法而不是使用参数来获取毫秒?
嗯,之前还有一些其他的答案和评论,但由于某些原因,人们删除了它们。我最终弄清楚了如何正确使用时间戳并发布了一个答案 here
我把答案抄过来:
我想我已经为您找到了答案。它基于 this library
首先,我会从该站点获取一个功能
function inOutQuad(n){
n *= 2;
if (n < 1) return 0.5 * n * n;
return - 0.5 * (--n * (n - 2) - 1);
};
然后,我会使用示例代码的修改形式,像这样
function startAnimation(domEl){
var stop = false;
// animating x (margin-left) from 20 to 300, for example
var startx = 20;
var destx = 300;
var duration = 1000;
var start = null;
var end = null;
function startAnim(timeStamp) {
start = timeStamp;
end = start + duration;
draw(timeStamp);
}
function draw(now) {
if (stop) return;
if (now - start >= duration) stop = true;
var p = (now - start) / duration;
val = inOutQuad(p);
var x = startx + (destx - startx) * val;
$(domEl).css('margin-left', `${x}px`);
requestAnimationFrame(draw);
}
requestAnimationFrame(startAnim);
}
我可能会改变 'stop' 的计算方式,我可能会写一些东西来确保它以 destx
结束,等等,但这是基本格式
显示在 this jsfiddle
我真的为这个感到骄傲。一段时间以来,我一直想弄清楚这一点。很高兴我有理由这样做。
我一直在努力研究如何使用 requestAnimationFrame,结果我很困惑。
根据 Mozilla,如果你有一个名为 'step' 的动画函数,你用 requestAnimationFrame(step)
调用,step
接受一个毫秒数的参数, DOMHighResTimeStamp 参数。
然而我在网上看到的关于如何使用 requestAnimationFrame 的每个示例都没有使用这个参数。一些示例坚持认为您可以假设 step
函数每秒将 运行 60 次,因此它们根本不使用任何 time
概念。其他人通过使用 new Date();
将他们自己的 "number of milliseconds" 与参数分开 - 我想修改这些示例以使用参数代替是很容易的。
假设函数每秒 运行 60 次是否可以?似乎......对我来说不明智。 Mozilla 说 "The number of callbacks is usually 60 times per second, but will generally match the display refresh rate in most web browsers as per W3C recommendation",这让我对这个假设感到不舒服。为什么人们使用他们自己的 new Date()
方法而不是使用参数来获取毫秒?
嗯,之前还有一些其他的答案和评论,但由于某些原因,人们删除了它们。我最终弄清楚了如何正确使用时间戳并发布了一个答案 here
我把答案抄过来:
我想我已经为您找到了答案。它基于 this library
首先,我会从该站点获取一个功能
function inOutQuad(n){
n *= 2;
if (n < 1) return 0.5 * n * n;
return - 0.5 * (--n * (n - 2) - 1);
};
然后,我会使用示例代码的修改形式,像这样
function startAnimation(domEl){
var stop = false;
// animating x (margin-left) from 20 to 300, for example
var startx = 20;
var destx = 300;
var duration = 1000;
var start = null;
var end = null;
function startAnim(timeStamp) {
start = timeStamp;
end = start + duration;
draw(timeStamp);
}
function draw(now) {
if (stop) return;
if (now - start >= duration) stop = true;
var p = (now - start) / duration;
val = inOutQuad(p);
var x = startx + (destx - startx) * val;
$(domEl).css('margin-left', `${x}px`);
requestAnimationFrame(draw);
}
requestAnimationFrame(startAnim);
}
我可能会改变 'stop' 的计算方式,我可能会写一些东西来确保它以 destx
结束,等等,但这是基本格式
显示在 this jsfiddle
我真的为这个感到骄傲。一段时间以来,我一直想弄清楚这一点。很高兴我有理由这样做。