Last active
June 18, 2016 04:11
-
-
Save icodeforlove/95d14fd41425e227f7aaaf91643d6822 to your computer and use it in GitHub Desktop.
nice set of easing javascript functions
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function EasingClamp (func) { | |
return function (k) { | |
k = Math.min(Math.max(func(k), 0), 1); | |
return isNaN(k) ? 0 : k; | |
}; | |
} | |
var Easing = { | |
Linear: { | |
None: EasingClamp(function (k) { | |
return k; | |
}) | |
}, | |
Quadratic: { | |
In: EasingClamp(function (k) { | |
return k * k; | |
}), | |
Out: EasingClamp(function (k) { | |
return k * (2 - k); | |
}), | |
InOut: EasingClamp(function (k) { | |
if ((k *= 2) < 1) { | |
return 0.5 * k * k; | |
} | |
return - 0.5 * (--k * (k - 2) - 1); | |
}) | |
}, | |
Cubic: { | |
In: EasingClamp(function (k) { | |
return k * k * k; | |
}), | |
Out: EasingClamp(function (k) { | |
return --k * k * k + 1; | |
}), | |
InOut: EasingClamp(function (k) { | |
if ((k *= 2) < 1) { | |
return 0.5 * k * k * k; | |
} | |
return 0.5 * ((k -= 2) * k * k + 2); | |
}) | |
}, | |
Quartic: { | |
In: EasingClamp(function (k) { | |
return k * k * k * k; | |
}), | |
Out: EasingClamp(function (k) { | |
return 1 - (--k * k * k * k); | |
}), | |
InOut: EasingClamp(function (k) { | |
if ((k *= 2) < 1) { | |
return 0.5 * k * k * k * k; | |
} | |
return - 0.5 * ((k -= 2) * k * k * k - 2); | |
}) | |
}, | |
Quintic: { | |
In: EasingClamp(function (k) { | |
return k * k * k * k * k; | |
}), | |
Out: EasingClamp(function (k) { | |
return --k * k * k * k * k + 1; | |
}), | |
InOut: EasingClamp(function (k) { | |
if ((k *= 2) < 1) { | |
return 0.5 * k * k * k * k * k; | |
} | |
return 0.5 * ((k -= 2) * k * k * k * k + 2); | |
}) | |
}, | |
Sinusoidal: { | |
In: EasingClamp(function (k) { | |
return 1 - Math.cos(k * Math.PI / 2); | |
}), | |
Out: EasingClamp(function (k) { | |
return Math.sin(k * Math.PI / 2); | |
}), | |
InOut: EasingClamp(function (k) { | |
return 0.5 * (1 - Math.cos(Math.PI * k)); | |
}) | |
}, | |
Exponential: { | |
In: EasingClamp(function (k) { | |
return k === 0 ? 0 : Math.pow(1024, k - 1); | |
}), | |
Out: EasingClamp(function (k) { | |
return k === 1 ? 1 : 1 - Math.pow(2, - 10 * k); | |
}), | |
InOut: EasingClamp(function (k) { | |
if (k === 0) { | |
return 0; | |
} | |
if (k === 1) { | |
return 1; | |
} | |
if ((k *= 2) < 1) { | |
return 0.5 * Math.pow(1024, k - 1); | |
} | |
return 0.5 * (- Math.pow(2, - 10 * (k - 1)) + 2); | |
}) | |
}, | |
Circular: { | |
In: EasingClamp(function (k) { | |
return 1 - Math.sqrt(1 - k * k); | |
}), | |
Out: EasingClamp(function (k) { | |
return Math.sqrt(1 - (--k * k)); | |
}), | |
InOut: EasingClamp(function (k) { | |
if ((k *= 2) < 1) { | |
return - 0.5 * (Math.sqrt(1 - k * k) - 1); | |
} | |
return 0.5 * (Math.sqrt(1 - (k -= 2) * k) + 1); | |
}) | |
}, | |
Elastic: { | |
In: EasingClamp(function (k) { | |
let s; | |
let a = 0.1; | |
const p = 0.4; | |
if (k === 0) { | |
return 0; | |
} | |
if (k === 1) { | |
return 1; | |
} | |
if (!a || a < 1) { | |
a = 1; | |
s = p / 4; | |
} else { | |
s = p * Math.asin(1 / a) / (2 * Math.PI); | |
} | |
return - (a * Math.pow(2, 10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p)); | |
}), | |
Out: EasingClamp(function (k) { | |
let s; | |
let a = 0.1; | |
const p = 0.4; | |
if (k === 0) { | |
return 0; | |
} | |
if (k === 1) { | |
return 1; | |
} | |
if (!a || a < 1) { | |
a = 1; | |
s = p / 4; | |
} else { | |
s = p * Math.asin(1 / a) / (2 * Math.PI); | |
} | |
return (a * Math.pow(2, - 10 * k) * Math.sin((k - s) * (2 * Math.PI) / p) + 1); | |
}), | |
InOut: EasingClamp(function (k) { | |
let s; | |
let a = 0.1; | |
const p = 0.4; | |
if (k === 0) { | |
return 0; | |
} | |
if (k === 1) { | |
return 1; | |
} | |
if (!a || a < 1) { | |
a = 1; | |
s = p / 4; | |
} else { | |
s = p * Math.asin(1 / a) / (2 * Math.PI); | |
} | |
if ((k *= 2) < 1) { | |
return - 0.5 * (a * Math.pow(2, 10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p)); | |
} | |
return a * Math.pow(2, -10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p) * 0.5 + 1; | |
}) | |
}, | |
Back: { | |
In: EasingClamp(function (k) { | |
const s = 1.70158; | |
return k * k * ((s + 1) * k - s); | |
}), | |
Out: EasingClamp(function (k) { | |
const s = 1.70158; | |
return --k * k * ((s + 1) * k + s) + 1; | |
}), | |
InOut: EasingClamp(function (k) { | |
const s = 1.70158 * 1.525; | |
if ((k *= 2) < 1) { | |
return 0.5 * (k * k * ((s + 1) * k - s)); | |
} | |
return 0.5 * ((k -= 2) * k * ((s + 1) * k + s) + 2); | |
}) | |
}, | |
Bounce: { | |
In: EasingClamp(function (k) { | |
return 1 - Easing.Bounce.Out(1 - k); | |
}), | |
Out: EasingClamp(function (k) { | |
if (k < (1 / 2.75)) { | |
return 7.5625 * k * k; | |
} else if (k < (2 / 2.75)) { | |
return 7.5625 * (k -= (1.5 / 2.75)) * k + 0.75; | |
} else if (k < (2.5 / 2.75)) { | |
return 7.5625 * (k -= (2.25 / 2.75)) * k + 0.9375; | |
} else { | |
return 7.5625 * (k -= (2.625 / 2.75)) * k + 0.984375; | |
} | |
}), | |
InOut: EasingClamp(function (k) { | |
if (k < 0.5) { | |
return Easing.Bounce.In(k * 2) * 0.5; | |
} | |
return Easing.Bounce.Out(k * 2 - 1) * 0.5 + 0.5; | |
}) | |
} | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment