2013-11-03 2 views
0

Мне нужна точность во время анимации, разделенная на этапы.Преобразование jQuery рекурсивный анимировать requestAnimationFrame

Ширина полосы выполнения увеличивается каждые 100 мс на 20 пикселей. Я использую jQuery's animate() для анимации ширины.

Регистрация Date.now(), ясно, что время меняется и неточно.

http://jsfiddle.net/trustweb/az3aE/23/

function animateProgress() { 
    console.log(Date.now() - progressTime); 
    progressTime = Date.now(); 

    progress_width = $(progress).width(); 

    if (progress_width < progressLimit) { 
     $(progress).animate(
      { width: '+=20' }, '' + progressTime, "linear", animateProgress 
     ); 
    } 
} 

Я был reading about requestAnimationFrame, и я предполагаю, что это правильный путь; как я могу преобразовать функцию выше, чтобы использовать requestAnimationFrame, или достичь точного времени каким-то другим способом?

+0

ли ваш реальный случай использования есть что-то чем расширить линию? (Потому что для примера, который вы показываете, я действительно не понимаю, почему вам нужно быть более точным - если вам действительно нужно регистрировать время, чтобы заметить неточность, это действительно не очень неточно.) – nnnnnn

+0

@nnnnnn У меня есть комплекс DOM и да, мне просто нужно нарисовать линию, но выполнить несколько проверок в течение каждого цикла. время регистрации очень неточно, так как в этом примере латентность возрастает и в течение долгого времени будет иметь значение – Mike

ответ

0

Не требуется requestAnimationFrame. Используйте переход вместо и setInterval:

var progressBar = document.getElementById("progress"); 
var start = new Date(); 

var timer = setInterval(function() { 
    var t = new Date() - start; 

    if (t < 500) { 
     progressBar.style.width = (t * 20/100 | 0) + "px"; 
    } else { 
     progressBar.style.width = "100px"; 
     clearInterval(timer); 
    } 
}, 100); 

Demo (если я правильно понимаю - ваша jsFiddle не имеет каких-либо элементов, участвующих, так что трудно сказать)

+1

'setInterval' является« самым точным »из доступных инструментов синхронизации JS, но важно отметить, что даже [' setInterval' имеет значительный дрейф со временем] (http://www.goat1000.com/2011/03/23/how-accurate-is-window.setinterval.html). Некоторые ОС: комбинации браузеров лучше других, но нет Javascript-метода, который даст вам доступ к достоверной точности на миллисекундах. Ради вопроса OPs, я не могу себе представить, что ему нужно что-то лучше этого, но стоит иметь в виду, что вы не можете полагаться на механизмы синхронизации javascript для высокоточных приложений. –

+0

@BenD: Вы можете это сделать; хотя он не гарантированно обновляется с точными интервалами, он гарантированно точно соответствует соответствующей ширине точного времени (потому что я использую «дельту-анимацию» или то, что люди называют ее сейчас). – Ryan

+0

@minitech Я не уверен в этом подходе, можете ли вы применить свое решение к первому jsfiddle? Мне нужно проверять каждый цикл каждый цикл. – Mike