Подтвердить что ты не робот

Функция ускорения jQuery - понимание переменных

Как работает функция ослабления jQuery? Возьмем, к примеру:

easeInQuad = function (x, t, b, c, d) {
    return c*(t/=d)*t + b;
};

Как это работает? Что делает каждый параметр? Как я мог бы реализовать некоторое безумное ослабление для анимации?

Также как я могу добавить шаблон ослабления к jQuery, загрузив его в $.easing достаточно хорошо?

4b9b3361

Ответ 1

Согласно источнику jQuery 1.6.2, значение функции ослабления выглядит следующим образом. Функция вызывается в разные моменты времени во время анимации. В моменты он называется,

  • x и t говорят, что сейчас время, относительно начала анимации. x выражается как число с плавающей запятой в диапазоне [0,1], где 0 - начало, а 1 - конец. t выражается в миллисекундах с начала анимации.
  • d - продолжительность анимации, как указано в анимированном вызове, в миллисекундах.
  • b = 0 и c = 1.

Функция ослабления должна возвращать число с плавающей запятой в диапазоне [0,1], называть его r. Затем jQuery вычисляет x=start+r*(end-start), где start и end являются начальным и конечным значениями свойства, как указано в вызове animate, и устанавливает значение свойства x.

Насколько я вижу, jQuery не дает вам прямого контроля, когда вызывается функция шага анимации, она позволяет вам только сказать: "Если я вызван в момент времени t, тогда я должен быть до сих пор через весь анимация." Поэтому вы не можете, например, попросить, чтобы ваш объект перерисовывался чаще, в моменты, когда он движется быстрее. Кроме того, я не знаю, почему другие люди говорят, что b - начальное значение, а c - это изменение - это не то, что говорит исходный код jQuery.

Если вы хотите определить свою собственную функцию ослабления, чтобы сделать то же самое, что и easeInQuad, например,

$.extend(jQuery.easing,{myfunc:function(x,t,b,c,d) { return x*x; }})

$('#marker').animate({left:'800px'},'slow','myfunc');

Ответ 2

Конкретный пример,

Предположим, что наше начальное значение 1000, и мы хотим достичь 400 в 3s:

var initialValue = 1000,
    destinationValue = 400,
    amountOfChange = destinationValue - initialValue, // = -600
    duration = 3,
    elapsed;

Перейдите от 0s до 3s:

elapsed = 0
$.easing.easeInQuad(null, elapsed, initialValue, amountOfChange, duration)
//> 1000

elapsed = 1
$.easing.easeInQuad(null, elapsed, initialValue, amountOfChange, duration)
//> 933.3333333333334

elapsed = 2
$.easing.easeInQuad(null, elapsed, initialValue, amountOfChange, duration)
//> 733.3333333333334

elapsed = 3
$.easing.easeInQuad(null, elapsed, initialValue, amountOfChange, duration)
//> 400

Итак, по сравнению с синопсисом:

$.easing.easeInQuad = function (x, t, b, c, d) {...}

можно вывести:

 x       t          b              c            d
 |       |          |              |            |
null  elapsed  initialValue  amountOfChange  duration

NB1: Важно то, что elapsed (t) и duration (d) должны быть выражены в одном и том же блоке, например: здесь "секунды" для нас, но может быть "мс" или что-то еще. Это справедливо и для initialValue (b) и amountOfChange (c), поэтому для подведения итогов:

 x       t          b              c            d
 |       |          |              |            |
null  elapsed  initialValue  amountOfChange  duration
         ^          ^              ^            ^
         +----------|----=unit=----|------------+
                    +----=unit=----+

NB2: Как @DamonJW, я не знаю, почему x здесь. Он не появляется в уравнениях Penner и делает похоже, не используется в результате: пусть всегда устанавливает его в null

Ответ 3

t: текущее время, b: начальное значение, c: изменение от начального значения до конечного значения, d: продолжительность.

Вот как это работает: http://james.padolsey.com/demos/jquery/easing/ (кривая, представляющая при изменении свойства CSS).

Вот как я мог бы реализовать некоторое безумное ослабление: http://www.timotheegroleau.com/Flash/experiments/easing_function_generator.htm (математика не мой сильный костюм)

Вы бы распространились как любой из них: http://code.google.com/p/vanitytools/source/browse/trunk/website/js/custom_easing.js?spec=svn29&r=29 - достаточно хорошо!

Ответ 5

Посмотрел код jQuery 1.11. Параметр x, по-видимому, означает "процент", независимо от начального значения времени. Таким образом, x всегда (0 <= x <= 1) (означает абстрактный коэффициент), а t - x * d (означает время, прошедшее).