通常(至少对于 jQuery)这不是在循环中完成的,而是在一系列回调中完成的。
伪javascript:
function startAnimation(element, endPosition, duration) {
var startPosition = element.position;
var startTime = getCurrentTime();
function animate() {
var timeElapsed = getCurrentTime() - startTime;
if (timeElapsed > duration) {
element.position = endPosition;
stopTimer();
} else {
// interpolate based on time
element.position = startPosition +
(endPosition - startPosition) * timeElapsed / duration;
}
}
startRepeatingTimerWithCallbackAndInterval(animate, 1.0 / 30.0);
}
也可以使用对象而不是闭包来存储起始数据。
这并不能完全回答问题中的所有要点,但它是一个起点。