JavaScript:实现精确的动画最终值?

JavaScript:实现精确的动画最终值?,javascript,jquery,animation,interface,core-animation,Javascript,Jquery,Animation,Interface,Core Animation,我目前正在尝试编写自己的JavaScript库。我正在编写一个动画回调,但是我很难得到精确的结束值,特别是当动画持续时间变小的时候。p> 现在,我只针对位置动画(左、上、右、下)。当我的动画完成时,对于速度更快的动画,它们的误差为5px~,对于1000毫秒以上的动画,误差为0.5px~。这是回调的大部分,下面是注释 var current = parseFloat( this[0].style[prop] || 0 ) // If our target value is greater

我目前正在尝试编写自己的JavaScript库。我正在编写一个动画回调,但是我很难得到精确的结束值,特别是当动画持续时间变小的时候。p> 现在,我只针对位置动画(左、上、右、下)。当我的动画完成时,对于速度更快的动画,它们的误差为5px~,对于1000毫秒以上的动画,误差为0.5px~。这是回调的大部分,下面是注释

var current = parseFloat( this[0].style[prop] || 0 )
    // If our target value is greater than the current
    , gt = !!( value > current )
    , delta = ( Math.abs(current - value) / (duration / 13) ) * (gt ? 1 : -1)
    , elem = this[0]
    , anim = setInterval( function(){
        elem.style[prop] = ( current + delta ) + 'px';
        current = parseFloat( elem.style[prop] );
        if ( gt && current >= value || !gt && current <= value ) clearInterval( anim );
     }, 13 );
var current=parseFloat(此[0]。样式[prop]| | 0)
//如果我们的目标值大于当前值
,gt=!!(值>当前值)
,delta=(当前值)/(持续时间/13))*(gt?1:-1)
,elem=this[0]
,anim=setInterval(函数(){
元素样式[prop]=(当前+增量)+“px”;
current=parseFloat(元素样式[prop]);

如果(gt&¤t>=value | | |!gt&¤t,您可能会遇到舍入错误,最终累积的值将不同于您预期的值。您可以查看一个非常简单的动画库,并了解它们用于克服此问题的方法(以及一些缓和技术).这是Thomas Fuchs的Emile,大约有50行代码:


除了Alex所说的,您通常最好使用基于时间的计算,而不是尝试进行离散的步骤。这确保了准确性,并允许动画以合理的速度运行,而浏览器的速度不够快,无法每n微秒可靠地回叫您一次

function animate(element, prop, period, value) {
    var v0= parseFloat(element.style[prop] || 0); // assume pre-set in px
    var dv= value-v0;
    var t0= new Date().getTime();
    var anim= setInterval(function() {
        var dt= (new Date().getTime()-t0)/period;
        if (dt>=1) {
            dt= 1;
            clearInterval(anim);
        }
        element.style[prop]= v0+dv*dt+'px';
    }, 16);
}