我试图先水平div
水平,然后垂直。但是使用requestAnimationFrame
的问题在于,它同时执行两个动画,使div
对角移动。
以下是小提琴链接:https://jsfiddle.net/akonchady/z4qmkuyc/22/
我做错了什么?
注意:如果我按第二次调用给出超时,它会按预期工作:
animate('abc', 'marginLeft', 250, 1000);
setTimeout(function() {
animate('abc', 'marginTop', 250, 1000);
}, 3000);
但是我想避免超时。如何使用requestAnimationFrame
?
答案 0 :(得分:1)
JavaScript中的大多数
functions
都是同步的(将按顺序执行)。但是使用asynchronous
函数(不会等待早期函数完成),使用callbacks
来控制执行流程。
要在第一个动画完成后调用发送function
,请使用callback
function animate(id, styleAttr, finalValue, duration, callback) {
var ele = document.getElementById('abc'),
startTime = +new Date, //Not sure how readable this is ?
delta = null,
req = null;
(function timeout() {
elapsedTime = +new Date - startTime;
if (elapsedTime >= duration) {
cancelAnimationFrame(req);
ele.style[styleAttr] = finalValue + 'px';
if (typeof callback !== 'undefined') {
callback();
}
return;
} else {
delta = finalValue / duration;
ele.style[styleAttr] = delta * elapsedTime + 'px';
}
req = requestAnimationFrame(timeout);
})();
}
animate('abc', 'marginLeft', 250, 1000, function() {
animate('abc', 'marginTop', 250, 1000);
});

#abc {
width: 100px;
height: 100px;
background-color: red;
}

<div id='abc'>
</div>
&#13;