对使用 javascript setInterval 来执行动画作业感到困惑
Confuse about using javascript setInterval to do animate job
我尝试使用setInterval
在javascript中实现动画效果,我希望div
的宽度增加200px
(盒子的原点宽度为100px
(1000ms
:
var MAX = 300, duration = 1000;
var inc = parseFloat( MAX / duration );
var div = $('div')[0];
var width = parseInt(div.style.width, 10);
function animate (id) {
width += inc;
if (width >= MAX) {
clearInterval(id);
console.timeEnd("animate");
}
div.style.width = width + "px";
}
console.time("animate");
var timer = setInterval(function () {
animate(timer);
}, 0)
我用console.time
来计算需要多少时间,但是,它总是需要 3 秒或更长时间,而不是 1 秒。
那么我的代码有什么问题呢?
演示在这里
但是当我使用 jquery Animate 时,它就像我指出的时间一样:
console.time("animate");
$('div').animate({
width: '300px'
}, {
duration: 1000,
complete: function () {
console.timeEnd("animate");
}
})
这是演示
那么为什么jquery可以实现它呢?秘诀是什么?
"秘诀"是计算每帧需要采取的步骤。
下面是一个更新的示例(进行了一些优化(:
http://jsfiddle.net/AbdiasSoftware/nVgTj/7/
//init some values
var div = $('div')[0].style;
var height = parseInt(div.height, 10);
var seconds = 1;
//calc distance we need to move per frame over a time
var max = 300;
var steps = (max- height) / seconds / 16.7;
//16.7ms is approx one frame (1000/60)
//loop
function animate (id) {
height += steps; //use calculated steps
div.height = height + "px";
if (height < max) {
requestAnimationFrame(animate);
}
}
animate();
请注意,正如hh54188所指出的,requestAnimationFrame
尚未在所有浏览器中都可用(Chrome和Firefox支持前缀(。
您可以使用此 polyfill,它允许您无论如何都使用调用,但如果requestAnimationFrame
不可用,则会优雅地回退到setTimeout
。
http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/
@Ken说的解决方案是可用的,但浏览器不支持requestAnimationFrame
,它可能无法工作;
我在代码中犯的错误是,我计算的增加每 1 毫秒增加一次,但计时器每 4 毫秒执行一次我的动画函数(根据最小延迟(。
所以对于一些保险,我们最好手动设置定时器延迟,比如13ms
(jquery动画中的间隔(,增加应该是:
var inc = parseFloat( MAX / duration ) * 13;
使用 13 * perOneMillisecond
作为匹配13ms
间隔的增加
这是演示,然后您可以检查时间成本几乎与jquery一样(但仍然慢一些,为什么?
- 如何设置html元素填充的动画
- 如何使用动画实现纸张推车
- 如何在生成下载文件时显示加载动画
- 剑道网格jQuery动画()问题
- EaseJS拖放;放下(动画CC)电影剪辑的鼠标坐标
- jQuery Lazy加载动画滚动
- jquery动画可以通过编程链接吗
- Javascript将数学动画化
- 动画.CSS重播
- 制作一个不带HTML a标记但在动画播放完毕后指向其他页面的超链接
- cron作业与Javascript计时事件
- 如何使用jQuery在动画中期加速动画
- 使用数据上的角度更改设置集合的第一个元素的动画
- 如何使用css动画/javascript使具有背景图像的元素出现
- 如何使用css动画从中心增加边界线
- JQuery动画延长容器不起作用
- 动画CSS进度条
- JavaScript动画从不执行
- 更多延迟动画
- 对使用 javascript setInterval 来执行动画作业感到困惑