window.requestAnimationFrame polyfill (with high resolution timing, very precise)
'use strict'; | |
// requestAnimationFrame polyfill by Erik Möller. | |
// Fixes from Paul Irish, Tino Zijdel, Andrew Mao, Klemen Slavic, Darius Bacon and Joan Alba Maldonado. | |
// Adapted from https://gist.github.com/paulirish/1579671 which derived from | |
// http://paulirish.com/2011/requestanimationframe-for-smart-animating/ | |
// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating | |
// Added high resolution timing. This window.performance.now() polyfill can be used: https://gist.github.com/jalbam/cc805ac3cfe14004ecdf323159ecf40e | |
// MIT license | |
// Gist: https://gist.github.com/jalbam/5fe05443270fa6d8136238ec72accbc0 | |
(function() { | |
var vendors = ['webkit', 'moz', 'ms', 'o'], vp = null; | |
for (var x = 0; x < vendors.length && !window.requestAnimationFrame && !window.cancelAnimationFrame; x++) | |
{ | |
vp = vendors[x]; | |
window.requestAnimationFrame = window.requestAnimationFrame || window[vp + 'RequestAnimationFrame']; | |
window.cancelAnimationFrame = window.cancelAnimationFrame || window[vp + 'CancelAnimationFrame'] || window[vp + 'CancelRequestAnimationFrame']; | |
} | |
if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) || !window.requestAnimationFrame || !window.cancelAnimationFrame) //iOS6 is buggy. | |
{ | |
var lastTime = 0; | |
window.requestAnimationFrame = function(callback, element) | |
{ | |
var now = window.performance.now(); | |
var nextTime = Math.max(lastTime + 16, now); //First time will execute it immediately but barely noticeable and performance is gained. | |
return setTimeout(function() { callback(lastTime = nextTime); }, nextTime - now); | |
}; | |
window.cancelAnimationFrame = clearTimeout; | |
} | |
}()); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment