如何将动画帧锁定为1秒
How do I lock animeframe to exactly 1 second?
如果我尝试运行在JSfiddle多次发布的代码,我会得到不同数量的div(我假设animeframe在1秒内没有完全完成)
http://jsfiddle.net/ghjKC/133/ // shim layer with setTimeout fallback
window.requestAnimFrame = (function(){
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(/* function */ callback, /* DOMElement */ element){
return window.setTimeout(callback, 1000 / 60);
};
})();
window.cancelRequestAnimFrame = ( function() {
return window.cancelAnimationFrame ||
window.webkitCancelRequestAnimationFrame ||
window.mozCancelRequestAnimationFrame ||
window.oCancelRequestAnimationFrame ||
window.msCancelRequestAnimationFrame ||
clearTimeout
} )();
var request;
(function animloop(){
console.log("render() should be done here and now");
request = requestAnimFrame(animloop, $("#time").append("<div></div>"));
})();
// cancelRequestAnimFrame to stop the loop in 1sec
console.log("will do cancelRequestAnimFrame in 1sec...")
setTimeout(function(){
console.log("1sec expired doing cancelRequestAnimFrame() now")
cancelRequestAnimFrame(request);
}, 1*1000)
我的问题是如何确保我得到相同的确切数量的div ?
不能保证setTimeout
和requestAnimationFrame
回调的精度。
setTimeout
是相当不精确的。
requestAnimationFrame
取决于系统渲染页面的速度。如果页面非常复杂并且帧速率下降,则回调将被调用的次数远远少于每秒60次。
现在如果你解释一下你的实际问题是什么,我们可以试着找到一个好的解决方案。
您说您希望<div>
的数量恒定,这意味着执行的数量恒定。这是时间无法控制的。根据您的用例,您可以直接控制执行的数量。例如,运行60次回调(理想情况下,requestAnimationFrame
接近15次)。
编辑根据你的评论:如果你想做一个进度条,在1秒内顺利填充,最好的方法是:使用requestAnimationFrame
,第一个参数传递给你的回调是一个高精度的时间。从这个计算你应该填多少进度条。如果时间> 1秒,不要再请求另一帧。
主旨:
var startTime;
function startProgress() {
startTime = null;
requestAnimationFrame(progress);
}
function progress(time) {
if (startTime === null) startTime = time;
// Compute progress since last frame
var ratio = (time - startTime) / 1000; // time is in [ms]
// Here you should update your progress, maybe this:
// Note I've used Math.min because we might go over 100% due to callback time.
$(".progressDiv").width(Math.min(ratio, 1) * 300);
// If we're not done yet, request a new animation frame
if (ratio < 1) requestAnimationFrame(progress);
}
相关文章:
- 显示5秒后隐藏潜水
- X秒后刷新select元素
- 如何每10.6秒从时间戳增加+1
- 如果30秒未单击,请应用CSS一次,将其删除,然后重新迭代
- 设置随机数,然后每5秒随机减少一次,直到达到0(javascript)
- Javascript函数,需要每隔30秒递减一次
- Javascript倒计时计时器倒计时未正确更新秒/分钟
- 显示数字,然后每5秒随机更改一次(javascript)
- 定时循环,使用Javascript在2个循环之间间隔x秒
- 定时循环,间隔10秒
- 如何判断请求/承诺是否需要超过5秒才能完成,angular js
- 3秒后淡出文本
- 仅当javascript的新内容出现时,才每3秒更新一次javascript
- 如果未按下该按钮,则在30秒内自动执行该功能
- 使Javascript滑块每4秒自动滑动一次
- 在JavaScript中相等两个对象.在更改一时,秒会自动更改
- 在单击下一个按钮之前,在JavaScript代码中添加5秒的延迟
- 页面可见性API实际上支持操作系统屏幕锁定吗
- 如何将动画帧锁定为1秒
- 如何在视频播放10秒后锁定内容