easing.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. var each = require('./each');
  2. var upperFirst = require('./upperFirst');
  3. exports.linear = function(t) {
  4. return t;
  5. };
  6. var pow = Math.pow;
  7. var sqrt = Math.sqrt;
  8. var sin = Math.sin;
  9. var min = Math.min;
  10. var asin = Math.asin;
  11. var PI = Math.PI;
  12. var fns = {
  13. sine: function(t) {
  14. return 1 + sin((PI / 2) * t - PI / 2);
  15. },
  16. circ: function(t) {
  17. return 1 - sqrt(1 - t * t);
  18. },
  19. elastic: function(t, m) {
  20. m = m || DEFAULT_ELASTICITY;
  21. if (t === 0 || t === 1) return t;
  22. var p = 1 - min(m, 998) / 1000;
  23. var st = t / 1;
  24. var st1 = st - 1;
  25. var s = (p / (2 * PI)) * asin(1);
  26. return -(pow(2, 10 * st1) * sin(((st1 - s) * (2 * PI)) / p));
  27. },
  28. back: function(t) {
  29. return t * t * (3 * t - 2);
  30. },
  31. bounce: function(t) {
  32. var pow2,
  33. bounce = 4;
  34. while (t < ((pow2 = pow(2, --bounce)) - 1) / 11) {}
  35. return (
  36. 1 / pow(4, 3 - bounce) - 7.5625 * pow((pow2 * 3 - 2) / 22 - t, 2)
  37. );
  38. }
  39. };
  40. each(['quad', 'cubic', 'quart', 'quint', 'expo'], function(name, i) {
  41. fns[name] = function(t) {
  42. return pow(t, i + 2);
  43. };
  44. });
  45. var DEFAULT_ELASTICITY = 400;
  46. each(fns, function(fn, name) {
  47. name = upperFirst(name);
  48. exports['in' + name] = fn;
  49. exports['out' + name] = function(t, m) {
  50. return 1 - fn(1 - t, m);
  51. };
  52. exports['inOut' + name] = function(t, m) {
  53. return t < 0.5 ? fn(t * 2, m) / 2 : 1 - fn(t * -2 + 2, m) / 2;
  54. };
  55. exports['outIn' + name] = function(t, m) {
  56. return t < 0.5
  57. ? (1 - fn(1 - 2 * t, m)) / 2
  58. : (fn(t * 2 - 1, m) + 1) / 2;
  59. };
  60. });
  61. module.exports = exports;