@akaustav/ngx-scroll-to
Version:
A simple Angular 12 plugin enabling you to smooth scroll to any element on your page and enhance scroll-based features in your app. This is a fork from @nicky-lenaers/ngx-scroll-to that adds support for Angular 12.
94 lines • 14.6 kB
JavaScript
import { ReplaySubject } from 'rxjs';
import { EASING } from './scroll-to-helpers';
/** Scroll To Animation */
export class ScrollToAnimation {
/**
* Class Constructor.
*
* @param container The Container
* @param listenerTarget The Element that listens for DOM Events
* @param isWindow Whether or not the listener is the Window
* @param to Position to scroll to
* @param options Additional options for scrolling
* @param isBrowser Whether or not execution runs in the browser
* (as opposed to the server)
*/
constructor(container, listenerTarget, isWindow, to, options, isBrowser) {
this.container = container;
this.listenerTarget = listenerTarget;
this.isWindow = isWindow;
this.to = to;
this.options = options;
this.isBrowser = isBrowser;
/** Recursively loop over the Scroll Animation */
this.loop = () => {
this.timeLapsed += this.tick;
this.percentage = (this.timeLapsed / this.options.duration);
this.percentage = (this.percentage > 1) ? 1 : this.percentage;
// Position Update
this.position = this.startPosition +
((this.startPosition - this.to <= 0 ? 1 : -1) *
this.distance *
EASING[this.options.easing](this.percentage));
if (this.lastPosition !== null && this.position === this.lastPosition) {
this.stop();
}
else {
this.source$.next(this.position);
this.isWindow
? this.listenerTarget.scrollTo(0, Math.floor(this.position))
: this.container.scrollTop = Math.floor(this.position);
this.lastPosition = this.position;
}
};
this.tick = 16;
this.interval = null;
this.lastPosition = null;
this.timeLapsed = 0;
this.windowScrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
if (!this.container) {
this.startPosition = this.windowScrollTop;
}
else {
this.startPosition = this.isWindow ? this.windowScrollTop : this.container.scrollTop;
}
// Correction for Starting Position of nested HTML Elements
if (this.container && !this.isWindow) {
this.to = this.to - this.container.getBoundingClientRect().top + this.startPosition;
}
// Set Distance
const directionalDistance = this.startPosition - this.to;
this.distance = this.container ? Math.abs(this.startPosition - this.to) : this.to;
this.mappedOffset = this.options.offset;
// Set offset from Offset Map
if (this.isBrowser) {
this.options
.offsetMap
.forEach((value, key) => this.mappedOffset = window.innerWidth > key ? value : this.mappedOffset);
}
this.distance += this.mappedOffset * (directionalDistance <= 0 ? 1 : -1);
this.source$ = new ReplaySubject();
}
/**
* Start the new Scroll Animation.
*
* @returns Observable containing a number
*/
start() {
clearInterval(this.interval);
this.interval = setInterval(this.loop, this.tick);
return this.source$.asObservable();
}
/**
* Stop the current Scroll Animation Loop.
*
* @param force Force to stop the Animation Loop
* @returns Void
*/
stop() {
clearInterval(this.interval);
this.interval = null;
this.source$.complete();
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLXRvLWFuaW1hdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zY3JvbGwtdG8vc3JjL2xpYi9zY3JvbGwtdG8tYW5pbWF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFakQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRzdDLDBCQUEwQjtBQUMxQixNQUFNLE9BQU8saUJBQWlCO0lBbUM1Qjs7Ozs7Ozs7OztPQVVHO0lBQ0gsWUFDVSxTQUFzQixFQUN0QixjQUFzQyxFQUM3QixRQUFpQixFQUNqQixFQUFVLEVBQ1YsT0FBOEIsRUFDdkMsU0FBa0I7UUFMbEIsY0FBUyxHQUFULFNBQVMsQ0FBYTtRQUN0QixtQkFBYyxHQUFkLGNBQWMsQ0FBd0I7UUFDN0IsYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUNqQixPQUFFLEdBQUYsRUFBRSxDQUFRO1FBQ1YsWUFBTyxHQUFQLE9BQU8sQ0FBdUI7UUFDdkMsY0FBUyxHQUFULFNBQVMsQ0FBUztRQTRENUIsaURBQWlEO1FBQ3pDLFNBQUksR0FBRyxHQUFTLEVBQUU7WUFFeEIsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzdCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUU5RCxrQkFBa0I7WUFDbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYTtnQkFDaEMsQ0FBQyxDQUFDLElBQUks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QyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNyRztRQUVELElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLG1CQUFtQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUs7UUFDSCxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxJQUFJO1FBQ0YsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzFCLENBQUM7Q0F5QkYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBFQVNJTkcgfSBmcm9tICcuL3Njcm9sbC10by1oZWxwZXJzJztcclxuaW1wb3J0IHsgU2Nyb2xsVG9Db25maWdPcHRpb25zLCBTY3JvbGxUb0xpc3RlbmVyVGFyZ2V0IH0gZnJvbSAnLi9zY3JvbGwtdG8tY29uZmlnLmludGVyZmFjZSc7XHJcblxyXG4vKiogU2Nyb2xsIFRvIEFuaW1hdGlvbiAqL1xyXG5leHBvcnQgY2xhc3MgU2Nyb2xsVG9BbmltYXRpb24ge1xyXG5cclxuICAvKiogTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBmb3IgZWFjaCBUaWNrICovXHJcbiAgcHJpdmF0ZSB0aWNrOiBudW1iZXI7XHJcblxyXG4gIC8qKiBJbnRlcnZhbCAqL1xyXG4gIHByaXZhdGUgaW50ZXJ2YWw6IGFueTtcclxuXHJcbiAgLyoqIFRpbWUgTGFwc2VkIGluIG1pbGxpc2Vjb25kcyAqL1xyXG4gIHByaXZhdGUgdGltZUxhcHNlZDogbnVtYmVyO1xyXG5cclxuICAvKiogUGVyY2VudGFnZSBvZiB0aW1lIGxhcHNlZCAqL1xyXG4gIHByaXZhdGUgcGVyY2VudGFnZTogbnVtYmVyO1xyXG5cclxuICAvKiogUG9zaXRpb24gb2YgdGhlIEVsZW1lbnQgKi9cclxuICBwcml2YXRlIHBvc2l0aW9uOiBudW1iZXI7XHJcblxyXG4gIC8qKiBMYXN0IEVsZW1lbnQgUG9zaXRpb24gKi9cclxuICBwcml2YXRlIGxhc3RQb3NpdGlvbjogbnVtYmVyO1xyXG5cclxuICAvKiogU3RhcnQgUG9zaXRpb24gb2YgdGhlIEVsZW1lbnQgKi9cclxuICBwcml2YXRlIHN0YXJ0UG9zaXRpb246IG51bWJlcjtcclxuXHJcbiAgLyoqIFRoZSBEaXN0YW5jZSB0byBzY3JvbGwgKi9cclxuICBwcml2YXRlIGRpc3RhbmNlOiBudW1iZXI7XHJcblxyXG4gIC8qKiBPYnNlcnZhYmxlIFNvdXJjZSAqL1xyXG4gIHByaXZhdGUgc291cmNlJDogUmVwbGF5U3ViamVjdDxudW1iZXI+O1xyXG5cclxuICAvKiogU2Nyb2xsIFRvcCBvZiB0aGUgV2luZG93ICovXHJcbiAgcHJpdmF0ZSB3aW5kb3dTY3JvbGxUb3A6IG51bWJlcjtcclxuXHJcbiAgLyoqIE1hcHBlZCBPZmZzZXQgdGFrZW4gZnJvbSB0aGUgYWN0aXZlIE9mZnNldCBNYXAgKi9cclxuICBwcml2YXRlIG1hcHBlZE9mZnNldDogbnVtYmVyO1xyXG5cclxuICAvKipcclxuICAgKiBDbGFzcyBDb25zdHJ1Y3Rvci5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBjb250YWluZXIgICAgICAgICAgICBUaGUgQ29udGFpbmVyXHJcbiAgICogQHBhcmFtIGxpc3RlbmVyVGFyZ2V0ICAgICAgIFRoZSBFbGVtZW50IHRoYXQgbGlzdGVucyBmb3IgRE9NIEV2ZW50c1xyXG4gICAqIEBwYXJhbSBpc1dpbmRvdyAgICAgICAgICAgICBXaGV0aGVyIG9yIG5vdCB0aGUgbGlzdGVuZXIgaXMgdGhlIFdpbmRvd1xyXG4gICAqIEBwYXJhbSB0byAgICAgICAgICAgICAgICAgICBQb3NpdGlvbiB0byBzY3JvbGwgdG9cclxuICAgKiBAcGFyYW0gb3B0aW9ucyAgICAgICAgICAgICAgQWRkaXRpb25hbCBvcHRpb25zIGZvciBzY3JvbGxpbmdcclxuICAgKiBAcGFyYW0gaXNCcm93c2VyICAgICAgICAgICAgV2hldGhlciBvciBub3QgZXhlY3V0aW9uIHJ1bnMgaW4gdGhlIGJyb3dzZXJcclxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcyBvcHBvc2VkIHRvIHRoZSBzZXJ2ZXIpXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXHJcbiAgICBwcml2YXRlIGxpc3RlbmVyVGFyZ2V0OiBTY3JvbGxUb0xpc3RlbmVyVGFyZ2V0LFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBpc1dpbmRvdzogYm9vbGVhbixcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgdG86IG51bWJlcixcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogU2Nyb2xsVG9Db25maWdPcHRpb25zLFxyXG4gICAgcHJpdmF0ZSBpc0Jyb3dzZXI6IGJvb2xlYW5cclxuICApIHtcclxuICAgIHRoaXMudGljayA9IDE2O1xyXG4gICAgdGhpcy5pbnRlcnZhbCA9IG51bGw7XHJcbiAgICB0aGlzLmxhc3RQb3NpdGlvbiA9IG51bGw7XHJcbiAgICB0aGlzLnRpbWVMYXBzZWQgPSAwO1xyXG5cclxuICAgIHRoaXMud2luZG93U2Nyb2xsVG9wID0gd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgfHwgMDtcclxuXHJcbiAgICBpZiAoIXRoaXMuY29udGFpbmVyKSB7XHJcbiAgICAgIHRoaXMuc3RhcnRQb3NpdGlvbiA9IHRoaXMud2luZG93U2Nyb2xsVG9wO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zdGFydFBvc2l0aW9uID0gdGhpcy5pc1dpbmRvdyA/IHRoaXMud2luZG93U2Nyb2xsVG9wIDogdGhpcy5jb250YWluZXIuc2Nyb2xsVG9wO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENvcnJlY3Rpb24gZm9yIFN0YXJ0aW5nIFBvc2l0aW9uIG9mIG5lc3RlZCBIVE1MIEVsZW1lbnRzXHJcbiAgICBpZiAodGhpcy5jb250YWluZXIgJiYgIXRoaXMuaXNXaW5kb3cpIHtcclxuICAgICAgdGhpcy50byA9IHRoaXMudG8gLSB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyB0aGlzLnN0YXJ0UG9zaXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2V0IERpc3RhbmNlXHJcbiAgICBjb25zdCBkaXJlY3Rpb25hbERpc3RhbmNlID0gdGhpcy5zdGFydFBvc2l0aW9uIC0gdGhpcy50bztcclxuICAgIHRoaXMuZGlzdGFuY2UgPSB0aGlzLmNvbnRhaW5lciA/IE1hdGguYWJzKHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMudG8pIDogdGhpcy50bztcclxuXHJcbiAgICB0aGlzLm1hcHBlZE9mZnNldCA9IHRoaXMub3B0aW9ucy5vZmZzZXQ7XHJcblxyXG4gICAgLy8gU2V0IG9mZnNldCBmcm9tIE9mZnNldCBNYXBcclxuICAgIGlmICh0aGlzLmlzQnJvd3Nlcikge1xyXG4gICAgICB0aGlzLm9wdGlvbnNcclxuICAgICAgICAub2Zmc2V0TWFwXHJcbiAgICAgICAgLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHRoaXMubWFwcGVkT2Zmc2V0ID0gd2luZG93LmlubmVyV2lkdGggPiBrZXkgPyB2YWx1ZSA6IHRoaXMubWFwcGVkT2Zmc2V0KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRpc3RhbmNlICs9IHRoaXMubWFwcGVkT2Zmc2V0ICogKGRpcmVjdGlvbmFsRGlzdGFuY2UgPD0gMCA/IDEgOiAtMSk7XHJcbiAgICB0aGlzLnNvdXJjZSQgPSBuZXcgUmVwbGF5U3ViamVjdCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3RhcnQgdGhlIG5ldyBTY3JvbGwgQW5pbWF0aW9uLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMgICAgICAgICBPYnNlcnZhYmxlIGNvbnRhaW5pbmcgYSBudW1iZXJcclxuICAgKi9cclxuICBzdGFydCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xyXG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKTtcclxuICAgIHRoaXMuaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCh0aGlzLmxvb3AsIHRoaXMudGljayk7XHJcbiAgICByZXR1cm4gdGhpcy5zb3VyY2UkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3RvcCB0aGUgY3VycmVudCBTY3JvbGwgQW5pbWF0aW9uIExvb3AuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gZm9yY2UgICAgICAgICAgRm9yY2UgdG8gc3RvcCB0aGUgQW5pbWF0aW9uIExvb3BcclxuICAgKiBAcmV0dXJucyAgICAgICAgICAgICAgIFZvaWRcclxuICAgKi9cclxuICBzdG9wKCk6IHZvaWQge1xyXG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKTtcclxuICAgIHRoaXMuaW50ZXJ2YWwgPSBudWxsO1xyXG4gICAgdGhpcy5zb3VyY2UkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICAvKiogUmVjdXJzaXZlbHkgbG9vcCBvdmVyIHRoZSBTY3JvbGwgQW5pbWF0aW9uICovXHJcbiAgcHJpdmF0ZSBsb29wID0gKCk6IHZvaWQgPT4ge1xyXG5cclxuICAgIHRoaXMudGltZUxhcHNlZCArPSB0aGlzLnRpY2s7XHJcbiAgICB0aGlzLnBlcmNlbnRhZ2UgPSAodGhpcy50aW1lTGFwc2VkIC8gdGhpcy5vcHRpb25zLmR1cmF0aW9uKTtcclxuICAgIHRoaXMucGVyY2VudGFnZSA9ICh0aGlzLnBlcmNlbnRhZ2UgPiAxKSA/IDEgOiB0aGlzLnBlcmNlbnRhZ2U7XHJcblxyXG4gICAgLy8gUG9zaXRpb24gVXBkYXRlXHJcbiAgICB0aGlzLnBvc2l0aW9uID0gdGhpcy5zdGFydFBvc2l0aW9uICtcclxuICAgICAgKCh0aGlzLnN0YXJ0UG9zaXRpb24gLSB0aGlzLnRvIDw9IDAgPyAxIDogLTEpICpcclxuICAgICAgICB0aGlzLmRpc3RhbmNlICpcclxuICAgICAgICBFQVNJTkdbdGhpcy5vcHRpb25zLmVhc2luZ10odGhpcy5wZXJjZW50YWdlKSk7XHJcblxyXG4gICAgaWYgKHRoaXMubGFzdFBvc2l0aW9uICE9PSBudWxsICYmIHRoaXMucG9zaXRpb24gPT09IHRoaXMubGFzdFBvc2l0aW9uKSB7XHJcbiAgICAgIHRoaXMuc3RvcCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zb3VyY2UkLm5leHQodGhpcy5wb3NpdGlvbik7XHJcbiAgICAgIHRoaXMuaXNXaW5kb3dcclxuICAgICAgICA/IHRoaXMubGlzdGVuZXJUYXJnZXQuc2Nyb2xsVG8oMCwgTWF0aC5mbG9vcih0aGlzLnBvc2l0aW9uKSlcclxuICAgICAgICA6IHRoaXMuY29udGFpbmVyLnNjcm9sbFRvcCA9IE1hdGguZmxvb3IodGhpcy5wb3NpdGlvbik7XHJcbiAgICAgIHRoaXMubGFzdFBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbjtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19