UNPKG

react-static

Version:

A progressive static site generator for React

79 lines (64 loc) 2.52 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; exports.default = scrollTo; var _raf = require('raf'); var _raf2 = _interopRequireDefault(_raf); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // var ease = function ease(t) { return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t; }; var defaultOptions = { duration: 800, offset: 0, context: typeof window !== 'undefined' && window }; var getTop = function getTop(element, offset, contextScrollHeight, contextVisibleHeight) { return Math.min(element.getBoundingClientRect().top + window.pageYOffset + offset, contextScrollHeight - contextVisibleHeight); }; var getPosition = function getPosition(start, end, elapsed, duration, easeFn) { if (elapsed > duration) return end; return start + (end - start) * easeFn(elapsed / duration); }; function scrollTo(element, options) { var _defaultOptions$optio = _extends({}, defaultOptions, options), duration = _defaultOptions$optio.duration, offset = _defaultOptions$optio.offset, context = _defaultOptions$optio.context; var start = window.pageYOffset; var innerHeight = void 0; var scrollHeight = void 0; if (context !== window) { innerHeight = context.offsetHeight; scrollHeight = context.scrollHeight; } else { innerHeight = window.innerHeight; scrollHeight = document.body.scrollHeight; } var clock = Date.now() - 1; return new Promise(function (resolve) { var step = function step() { var elapsed = Date.now() - clock; var end = typeof element === 'number' ? parseInt(element) : getTop(element, offset, scrollHeight, innerHeight); if (context !== window) { context.scrollTop = getPosition(start, end, elapsed, duration, ease); } else { window.scroll(0, getPosition(start, end, elapsed, duration, ease)); } if (typeof duration === 'undefined' || elapsed > duration) { resolve(); return; } // Sanity check to prevent taking over the scroll once we prematurely got to the element if (start === end) { resolve(); return; } (0, _raf2.default)(step); }; (0, _raf2.default)(step); }); }