@schoolbelle/common
Version:
54 lines • 5.35 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @param {?} selectorOrElem
* @param {?=} duration
* @param {?=} offset
* @return {?}
*/
export function scrollTo(selectorOrElem, duration = 300, offset = 300) {
/** @type {?} */
let elem = typeof selectorOrElem === 'string' ? document.querySelector(selectorOrElem) : selectorOrElem;
if (elem) {
/** @type {?} */
let box = elem.getBoundingClientRect();
/** @type {?} */
let body = document.body;
/** @type {?} */
let docEl = document.documentElement;
/** @type {?} */
let scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;
/** @type {?} */
let clientTop = docEl.clientTop || body.clientTop || 0;
/** @type {?} */
let elemTop = box.top + scrollTop - clientTop;
/** @type {?} */
let diff = elemTop - scrollTop - offset;
/** @type {?} */
let start;
// Bootstrap our animation - it will get called right before next frame shall be rendered.
window.requestAnimationFrame((/**
* @param {?} timestamp
* @return {?}
*/
function step(timestamp) {
if (!start)
start = timestamp;
// Elapsed miliseconds since start of scrolling.
/** @type {?} */
let time = timestamp - start;
// Get percent of completion in range [0, 1].
/** @type {?} */
let percent = Math.min(time / duration, 1);
window.scrollTo(0, scrollTop + diff * percent);
// Proceed with animation as long as we wanted it to.
if (time < duration) {
window.requestAnimationFrame(step);
}
}));
}
return elem;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLXRvLmZuLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHNjaG9vbGJlbGxlL2NvbW1vbi9mdW5jdGlvbnMvIiwic291cmNlcyI6WyJsaWIvc2Nyb2xsLXRvLmZuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSxNQUFNLFVBQVUsUUFBUSxDQUFFLGNBQTZCLEVBQUUsV0FBa0IsR0FBRyxFQUFFLE1BQU0sR0FBRyxHQUFHOztRQUNwRixJQUFJLEdBQVcsT0FBTyxjQUFjLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjO0lBRS9HLElBQUksSUFBSSxFQUFFOztZQUNGLEdBQUcsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUU7O1lBQ2xDLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSTs7WUFDcEIsS0FBSyxHQUFHLFFBQVEsQ0FBQyxlQUFlOztZQUVoQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTOztZQUNuRSxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUM7O1lBQ2xELE9BQU8sR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLFNBQVMsR0FBRyxTQUFTOztZQUV6QyxJQUFJLEdBQUcsT0FBTyxHQUFHLFNBQVMsR0FBRyxNQUFNOztZQUNuQyxLQUFLO1FBRVQsMEZBQTBGO1FBQzFGLE1BQU0sQ0FBQyxxQkFBcUI7Ozs7UUFBQyxTQUFTLElBQUksQ0FBQyxTQUFTO1lBQ2hELElBQUksQ0FBQyxLQUFLO2dCQUFFLEtBQUssR0FBRyxTQUFTLENBQUM7OztnQkFFMUIsSUFBSSxHQUFHLFNBQVMsR0FBRyxLQUFLOzs7Z0JBRXhCLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBRTFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLFNBQVMsR0FBRyxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUM7WUFFL0MscURBQXFEO1lBQ3JELElBQUksSUFBSSxHQUFHLFFBQVEsRUFBRTtnQkFDakIsTUFBTSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3RDO1FBQ0wsQ0FBQyxFQUFDLENBQUM7S0FDTjtJQUdELE9BQU8sSUFBSSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gc2Nyb2xsVG8gKHNlbGVjdG9yT3JFbGVtOnN0cmluZ3xFbGVtZW50LCBkdXJhdGlvbjpudW1iZXIgPSAzMDAsIG9mZnNldCA9IDMwMCk6RWxlbWVudCB7XG4gICAgbGV0IGVsZW06RWxlbWVudCA9IHR5cGVvZiBzZWxlY3Rvck9yRWxlbSA9PT0gJ3N0cmluZycgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yT3JFbGVtKSA6IHNlbGVjdG9yT3JFbGVtO1xuXG4gICAgaWYgKGVsZW0pIHtcbiAgICAgICAgbGV0IGJveCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGxldCBib2R5ID0gZG9jdW1lbnQuYm9keTtcbiAgICAgICAgbGV0IGRvY0VsID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIFxuICAgICAgICBsZXQgc2Nyb2xsVG9wID0gd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY0VsLnNjcm9sbFRvcCB8fCBib2R5LnNjcm9sbFRvcDtcbiAgICAgICAgbGV0IGNsaWVudFRvcCA9IGRvY0VsLmNsaWVudFRvcCB8fCBib2R5LmNsaWVudFRvcCB8fCAwO1xuICAgICAgICBsZXQgZWxlbVRvcCA9IGJveC50b3AgKyBzY3JvbGxUb3AgLSBjbGllbnRUb3A7XG4gICAgXG4gICAgICAgIGxldCBkaWZmID0gZWxlbVRvcCAtIHNjcm9sbFRvcCAtIG9mZnNldDtcbiAgICAgICAgbGV0IHN0YXJ0O1xuICAgIFxuICAgICAgICAvLyBCb290c3RyYXAgb3VyIGFuaW1hdGlvbiAtIGl0IHdpbGwgZ2V0IGNhbGxlZCByaWdodCBiZWZvcmUgbmV4dCBmcmFtZSBzaGFsbCBiZSByZW5kZXJlZC5cbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiBzdGVwKHRpbWVzdGFtcCkge1xuICAgICAgICAgICAgaWYgKCFzdGFydCkgc3RhcnQgPSB0aW1lc3RhbXA7XG4gICAgICAgICAgICAvLyBFbGFwc2VkIG1pbGlzZWNvbmRzIHNpbmNlIHN0YXJ0IG9mIHNjcm9sbGluZy5cbiAgICAgICAgICAgIGxldCB0aW1lID0gdGltZXN0YW1wIC0gc3RhcnQ7XG4gICAgICAgICAgICAvLyBHZXQgcGVyY2VudCBvZiBjb21wbGV0aW9uIGluIHJhbmdlIFswLCAxXS5cbiAgICAgICAgICAgIGxldCBwZXJjZW50ID0gTWF0aC5taW4odGltZSAvIGR1cmF0aW9uLCAxKTtcbiAgICAgICAgXG4gICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgc2Nyb2xsVG9wICsgZGlmZiAqIHBlcmNlbnQpO1xuICAgICAgICBcbiAgICAgICAgICAgIC8vIFByb2NlZWQgd2l0aCBhbmltYXRpb24gYXMgbG9uZyBhcyB3ZSB3YW50ZWQgaXQgdG8uXG4gICAgICAgICAgICBpZiAodGltZSA8IGR1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG5cbiAgICByZXR1cm4gZWxlbTtcbn1cbiAgIl19