Снизить отказов JQuery Easing

Я использую плагин JQuery Easing и использую эффект ослабления отказов. Мне это нравится, но это невероятно радикально. Мне нужно смягчить его (возможно, удалив отскок и сделав кривые менее резкими.

Я нашел этот пост, но на самом деле я не математик... Может кто-нибудь помочь мне на английском? Мне даже не нужно полностью понимать это, я буду в порядке с кем-то, просто предоставляющим мне функцию.

Я знаю, что должен вставить код, который пробовал, но я даже не знаю, что попробовать, поэтому я предполагаю, что выложу функцию замедления, предоставляемую плагином jQuery Easing.

easeOutBounce: function (x, t, b, c, d) {
    if ((t/=d) < (1/2.75)) {
    return c*(7.5625*t*t) + b;
    } else if (t < (2/2.75)) {
    return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
    } else if (t < (2.5/2.75)) {
    return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
    } else {
    return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
    }
}

1 ответ

Решение

Лучше всего найти функцию смягчения, близкую к тому, что вы хотите, и настроить длительность. Но если вы действительно хотите сделать что-то нестандартное, плагин jQuery easing позволяет указать время с помощью следующей функции:

jQuery.easing.newEasingMethodName (
    x, // Ignored
    current_time,
    start_value,
    end_value,
    total_time
)

Он вызывается в различных точках анимации и должен возвращать позицию, соответствующую истекшему времени анимации. Изучение easeOutBounce Вы можете видеть, что каждый if заявление нормализует прогресс в процентах от общего времени (t/=d фрагмент) и применяет один из 4 форумов для получения текущего значения как функции этого процента.

Проблема заключается в том, что эти функции формул не являются непрерывными - они индивидуально "настроены", чтобы определить, где находится другая точка в этом точном процентном доле завершения на временной шкале. Например, в приведенном ниже фрагменте, если вы выберете "шаг", вы увидите, что анимация переходит с позиции на позицию без промежуточной анимации. Вот что произойдет, если вы просто возьмете одну из if заявления из easeOutBounce блок кода - он пропустил бы от окончания одного шага до начала следующего, который был настроен для запуска на более поздней части временной шкалы, и поэтому ваша анимация могла бы перепрыгнуть повсюду.

Вы можете использовать custom Функция ниже в качестве отправной точки - это просто easeOutBounce переписать, чтобы сделать его немного менее темным.

Удачи.:)

var $div = $('#test');
var $easeMethodName = $('#method-name');
var $animationDuration = $('#animation-duration');

$('button').click(function() {
  $div.toggleClass('expanded');
  var width = $div.hasClass('expanded') ? 400 : 200;
  var duration = parseInt($animationDuration.val(), 10);

  $div.animate({
    width: width
  }, {
    duration: duration,
    easing: $easeMethodName.val()
  });

});

var linear = function(ignore, t, start_value, end_value, d) {
  var pct = t/d;
  return pct * end_value;
};
$.easing.linear = linear;

var step = function(ignore, t, start_value, end_value, d) {
  var pct = t/d * 100;
  var step = Math.round(pct / 25);
  return (step * .25) * end_value + start_value;
};
$.easing.step = step;

// This is the eastOutBounce function, rewritten to make it a little 
// easier to read. Use it as a starting point for modification.
// t is the current time; d is the duration of the animation
var custom = function(ignore, t, start_value, end_value, d) {
  var pct = t/d;
  var step1 = 1/2.75; // ~36%
  var step2 = 2/2.75; // ~73%
  var step3 = 2.5/2.75; // ~90%

  if (pct < step1) {
    return end_value*(7.5625*pct*pct) + start_value;
  } else if (pct < step2) {
    return end_value*(7.5625*(pct-=(1.5/2.75))*pct + .75) + start_value;
  } else if (pct < step3) {
    return end_value*(7.5625*(pct-=(2.25/2.75))*pct + .9375) + start_value;
  } else {
    return end_value*(7.5625*(pct-=(2.625/2.75))*pct + .984375) + start_value;
  }
};
$.easing.custom = custom;
#test {
  width: 200px;
  height: 20px;
  border: 1px solid #900;
  background: #ccc;
  position: relative;
  margin-top: 1em;
}

label, button {
  display: block;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.3/jquery.easing.min.js"></script>

<label>Method name: 
  <select id="method-name">
    <option value="linear">Linear</option><option value="step">Step</option><option value="custom">Custom</option><option value="easeInOutBounce">easeInOutBounce</option>
  </select>
</label>

<label>Duration:
  <input id="animation-duration" value="1000" />
</label>

<button>Animate</button>

<div id="test">
</div>

Другие вопросы по тегам