scrollTo.js 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. var getScrollTop = require('./getScrollTop');
  2. var setScrollTop = require('./setScrollTop');
  3. var requestAnimFrame = (function () {
  4. return window.requestAnimationFrame ||
  5. window.webkitRequestAnimationFrame ||
  6. window.mozRequestAnimationFrame ||
  7. function (callback) {
  8. window.setTimeout(callback, 1000 / 60);
  9. };
  10. })();
  11. /**
  12. *
  13. * @desc 在${duration}时间内,滚动条平滑滚动到${to}指定位置
  14. * @param {Number} to
  15. * @param {Number} duration
  16. */
  17. function scrollTo(to, duration) {
  18. if (duration < 0) {
  19. setScrollTop(to);
  20. return;
  21. };
  22. var diff = to - getScrollTop();
  23. if (diff === 0) return;
  24. var step = diff / duration * 10;
  25. requestAnimationFrame(
  26. function () {
  27. if (Math.abs(step) > Math.abs(diff)) {
  28. setScrollTop(getScrollTop() + diff);
  29. return;
  30. };
  31. setScrollTop(getScrollTop() + step);
  32. if (diff > 0 && getScrollTop() >= to || diff < 0 && getScrollTop() <= to) {
  33. return;
  34. };
  35. scrollTo(to, duration - 16);
  36. });
  37. };
  38. module.exports = scrollTo;