2012-05-13 3 views
5

Предположим, у меня есть div, и я использую .animate({opacity:0},400, function(){}); для своих детей. Возможно ли получить оставшееся время для анимации? например, 200 мс, или 0, если нет анимации? Спасибо.Есть ли способ получить оставшееся время анимации?

+1

Просто из любопытства ... почему вам нужно это значение? –

+1

@ RokoC.Buljan. Думаю, это хобби. Он время анимации коллекции. – gdoron

+0

У меня проблема с очередью обратных вызовов для детей - она ​​не всегда срабатывает, и определить, к какой дочерней очереди ее нелегко определить, поэтому я хотел попробовать с помощью setTimeout сделать ее более надежной. – Anonymous

ответ

6

Чтобы помочь вам лучше понять, как вы можете использовать step функцию [а отправленный gdoron]
Я создал пример использования шаг функцию, чтобы получить оставшееся время:

(нажмите кнопку get state!, чтобы остановить анимацию и получить оставшееся время!)

demo with distance
demo with opacity

Distance пример JQuery:

var time = 4000; 
var distance = 300; 
var currentTime = 0; 

$('#ball').animate({ 
    left: distance 
}, { 
    duration: time, 
    step: function (now, fx) { 

     currentTime = Math.round((now * time)/distance); 
     var data = fx.prop + ' ' + Math.round(now) + '; <b>' + currentTime + 'ms</b> '; 

     $('body').append('<p>' + data + '</p>'); 
    }, 
    easing: 'linear' 
}); 

$('#getTime').click(function() { 
    $('#ball').stop(); 
    $('body').prepend('<p>currentTime is:' + currentTime + ' ms; REMAINING: ' + (time - currentTime) + 'ms</p>'); 
}); 
  • Вы можете увидеть, как я использовал fx.prop внутри animation step, чтобы получить свойство (left), который в настоящее время анимированный.
  • Вы можете увидеть, как: зная время анимации и расстояние (непрозрачность, независимо от ...) можно легко извлечь «остановлен/пауза» состояние некоторой простой математике ((now*time)/distance) и благодаря возвращенной now стоимости ,
+0

Спасибо, это очень полезно! И кажется, что это не сильно ударит по производительности, если мы ограничим функцию шага только записью переменной. Во всяком случае, это не будет называться каждые 1 мс или что-то еще. – Anonymous

+0

@ user1125062 Он не должен, потому что мы получаем доступ только к тому, что уже запускает нашу анимацию. –

3

Я понятия не имею, почему вам это нужно, но step может помочь вам извлечь это значение:

Шаг Функция

Вторая версия .animate() обеспечивает вариант шага - функция обратного вызова, которая запускается на каждом этапе анимации. Эта функция полезна для включения пользовательских типов анимации или изменения анимации по мере ее появления. Он принимает два аргумента (теперь и fx), и это устанавливается для анимированного элемента DOM.

Теперь: числовое значение свойства анимируемый на каждый шаге
FX: ссылка на объект-прототипа jQuery.fx, который содержит ряд свойств, такие как эль для анимированного элемента, начала и заканчивается для первого и последнего значения анимированного свойства, соответственно, и prop для анимированного свойства.

docs

+0

Хммм, но что я должен делать с этим? :) – Anonymous

+0

@ пользователь1125062. Вы можете получить текущее значение, первое значение, последнее значение и т. Д., Просто играйте с ним. В любом случае, я уверен, что есть другие способы делать то, что вы пытаетесь сделать ... – gdoron

+0

Без setInterval или этого метода нет, AFAIK. Это единственный способ получить это. – inhan

3

Слушайте, не обращая внимания на функцию step, о которой все говорят. Я когда-то нуждался в том, что вы делали, и написал свой собственный, что просто положил его назад, спрогнозировав время, оставшееся после просмотра общего времени анимации (должно быть известно вам, поскольку вы когда-то дали этот номер jQuery) и quotient текущая и целевая непрозрачность. Затем просто умножьте это частное с общим временем анимации, получив сумму, вычитаемую из общего времени. Просто как тот.

Псевдо-код:

func calculate-time-left-in-a-running-fade-in-animation: 
{ 
    var current_opacity = $elem.css('opacity'); 
    var target_opacity = this.getTargetOpacity(); 

    var total = this.getTotalAnimationTime(); 

    var quotient = current_opacity/target_opacity; 
    return total - quotient * total; 
} 
+0

Интересный подход, не правда ли! Хотя, если точность была важна, шаг - это единственный путь. – Anonymous

+0

Получение значения атрибута самостоятельно или использование переменной now является тем же самым, если анимация приостановлена. В шаге-примере jQuery @roXon дано будет много накладных расходов, на каждом шаге анимации. Могут даже ввести глобальные переменные, например, на самом деле. Если вы планируете приостанавливать анимацию перед вычислением (опять как это было в примере) и затем программно возобновлять анимацию, тогда совершенно нет никакой разницы. Я бы даже сказал, что получение этого вычисленного значения под запущенной анимацией даст одинаковые результаты. –

+0

Сохраненный продукт шаговой логики, вычисленное значение оставшегося времени, не похож на живой список, значение не обновляется до предельно точного значения. И это будет не что иное, как «старое» вычисление, которое вы используете всякий раз, когда вы его используете. У вас даже будет средний человек, ответственный за преодоление этого информационного разрыва, ступенчатую функцию, которая должна теоретически пресекать точность. Но если вы вместо этого сделаете то же самое вычисление, когда вам нужно знать оставшееся время, не было бы даже более точным? И еще дешевле, как в удобочитаемости кода, так и в обработке накладных расходов. –

Смежные вопросы