react-static
Version:
A progressive static site generator for React
79 lines (64 loc) • 2.52 kB
JavaScript
;
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);
});
}