scrollTo.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334
  1. import raf from './raf';
  2. import getScroll, { isWindow } from './getScroll';
  3. import { easeInOutCubic } from './easings';
  4. export default function scrollTo(y) {
  5. var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  6. var _options$getContainer = options.getContainer,
  7. getContainer = _options$getContainer === void 0 ? function () {
  8. return window;
  9. } : _options$getContainer,
  10. callback = options.callback,
  11. _options$duration = options.duration,
  12. duration = _options$duration === void 0 ? 450 : _options$duration;
  13. var container = getContainer();
  14. var scrollTop = getScroll(container, true);
  15. var startTime = Date.now();
  16. var frameFunc = function frameFunc() {
  17. var timestamp = Date.now();
  18. var time = timestamp - startTime;
  19. var nextScrollTop = easeInOutCubic(time > duration ? duration : time, scrollTop, y, duration);
  20. if (isWindow(container)) {
  21. container.scrollTo(window.pageXOffset, nextScrollTop);
  22. } else if (container instanceof HTMLDocument || container.constructor.name === 'HTMLDocument') {
  23. container.documentElement.scrollTop = nextScrollTop;
  24. } else {
  25. container.scrollTop = nextScrollTop;
  26. }
  27. if (time < duration) {
  28. raf(frameFunc);
  29. } else if (typeof callback === 'function') {
  30. callback();
  31. }
  32. };
  33. raf(frameFunc);
  34. }