getRequestAnimationFrame.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. var availablePrefixs = ['moz', 'ms', 'webkit'];
  2. function requestAnimationFramePolyfill() {
  3. var lastTime = 0;
  4. return function (callback) {
  5. var currTime = new Date().getTime();
  6. var timeToCall = Math.max(0, 16 - (currTime - lastTime));
  7. var id = window.setTimeout(function () {
  8. callback(currTime + timeToCall);
  9. }, timeToCall);
  10. lastTime = currTime + timeToCall;
  11. return id;
  12. };
  13. }
  14. export default function getRequestAnimationFrame() {
  15. if (typeof window === 'undefined') {
  16. return function () {};
  17. }
  18. if (window.requestAnimationFrame) {
  19. // https://github.com/vuejs/vue/issues/4465
  20. return window.requestAnimationFrame.bind(window);
  21. }
  22. var prefix = availablePrefixs.filter(function (key) {
  23. return "".concat(key, "RequestAnimationFrame") in window;
  24. })[0];
  25. return prefix ? window["".concat(prefix, "RequestAnimationFrame")] : requestAnimationFramePolyfill();
  26. }
  27. export function cancelRequestAnimationFrame(id) {
  28. if (typeof window === 'undefined') {
  29. return null;
  30. }
  31. if (window.cancelAnimationFrame) {
  32. return window.cancelAnimationFrame(id);
  33. }
  34. var prefix = availablePrefixs.filter(function (key) {
  35. return "".concat(key, "CancelAnimationFrame") in window || "".concat(key, "CancelRequestAnimationFrame") in window;
  36. })[0];
  37. return prefix ? (window["".concat(prefix, "CancelAnimationFrame")] || window["".concat(prefix, "CancelRequestAnimationFrame")]).call(this, id) : clearTimeout(id);
  38. }