UNPKG

@nicky-lenaers/ngx-scroll-to

Version:

A simple Angular 4+ plugin enabling you to smooth scroll to any element on your page and enhance scroll-based features in your app.

94 lines 14.1 kB
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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QyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNyRztRQUVELElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLG1CQUFtQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUs7UUFDSCxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxJQUFJO1FBQ0YsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzFCLENBQUM7Q0F5QkYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEVBU0lORyB9IGZyb20gJy4vc2Nyb2xsLXRvLWhlbHBlcnMnO1xuaW1wb3J0IHsgU2Nyb2xsVG9Db25maWdPcHRpb25zLCBTY3JvbGxUb0xpc3RlbmVyVGFyZ2V0IH0gZnJvbSAnLi9zY3JvbGwtdG8tY29uZmlnLmludGVyZmFjZSc7XG5cbi8qKiBTY3JvbGwgVG8gQW5pbWF0aW9uICovXG5leHBvcnQgY2xhc3MgU2Nyb2xsVG9BbmltYXRpb24ge1xuXG4gIC8qKiBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIGZvciBlYWNoIFRpY2sgKi9cbiAgcHJpdmF0ZSB0aWNrOiBudW1iZXI7XG5cbiAgLyoqIEludGVydmFsICovXG4gIHByaXZhdGUgaW50ZXJ2YWw6IGFueTtcblxuICAvKiogVGltZSBMYXBzZWQgaW4gbWlsbGlzZWNvbmRzICovXG4gIHByaXZhdGUgdGltZUxhcHNlZDogbnVtYmVyO1xuXG4gIC8qKiBQZXJjZW50YWdlIG9mIHRpbWUgbGFwc2VkICovXG4gIHByaXZhdGUgcGVyY2VudGFnZTogbnVtYmVyO1xuXG4gIC8qKiBQb3NpdGlvbiBvZiB0aGUgRWxlbWVudCAqL1xuICBwcml2YXRlIHBvc2l0aW9uOiBudW1iZXI7XG5cbiAgLyoqIExhc3QgRWxlbWVudCBQb3NpdGlvbiAqL1xuICBwcml2YXRlIGxhc3RQb3NpdGlvbjogbnVtYmVyO1xuXG4gIC8qKiBTdGFydCBQb3NpdGlvbiBvZiB0aGUgRWxlbWVudCAqL1xuICBwcml2YXRlIHN0YXJ0UG9zaXRpb246IG51bWJlcjtcblxuICAvKiogVGhlIERpc3RhbmNlIHRvIHNjcm9sbCAqL1xuICBwcml2YXRlIGRpc3RhbmNlOiBudW1iZXI7XG5cbiAgLyoqIE9ic2VydmFibGUgU291cmNlICovXG4gIHByaXZhdGUgc291cmNlJDogUmVwbGF5U3ViamVjdDxudW1iZXI+O1xuXG4gIC8qKiBTY3JvbGwgVG9wIG9mIHRoZSBXaW5kb3cgKi9cbiAgcHJpdmF0ZSB3aW5kb3dTY3JvbGxUb3A6IG51bWJlcjtcblxuICAvKiogTWFwcGVkIE9mZnNldCB0YWtlbiBmcm9tIHRoZSBhY3RpdmUgT2Zmc2V0IE1hcCAqL1xuICBwcml2YXRlIG1hcHBlZE9mZnNldDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDbGFzcyBDb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lciAgICAgICAgICAgIFRoZSBDb250YWluZXJcbiAgICogQHBhcmFtIGxpc3RlbmVyVGFyZ2V0ICAgICAgIFRoZSBFbGVtZW50IHRoYXQgbGlzdGVucyBmb3IgRE9NIEV2ZW50c1xuICAgKiBAcGFyYW0gaXNXaW5kb3cgICAgICAgICAgICAgV2hldGhlciBvciBub3QgdGhlIGxpc3RlbmVyIGlzIHRoZSBXaW5kb3dcbiAgICogQHBhcmFtIHRvICAgICAgICAgICAgICAgICAgIFBvc2l0aW9uIHRvIHNjcm9sbCB0b1xuICAgKiBAcGFyYW0gb3B0aW9ucyAgICAgICAgICAgICAgQWRkaXRpb25hbCBvcHRpb25zIGZvciBzY3JvbGxpbmdcbiAgICogQHBhcmFtIGlzQnJvd3NlciAgICAgICAgICAgIFdoZXRoZXIgb3Igbm90IGV4ZWN1dGlvbiBydW5zIGluIHRoZSBicm93c2VyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFzIG9wcG9zZWQgdG8gdGhlIHNlcnZlcilcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICBwcml2YXRlIGxpc3RlbmVyVGFyZ2V0OiBTY3JvbGxUb0xpc3RlbmVyVGFyZ2V0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaXNXaW5kb3c6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSByZWFkb25seSB0bzogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogU2Nyb2xsVG9Db25maWdPcHRpb25zLFxuICAgIHByaXZhdGUgaXNCcm93c2VyOiBib29sZWFuXG4gICkge1xuICAgIHRoaXMudGljayA9IDE2O1xuICAgIHRoaXMuaW50ZXJ2YWwgPSBudWxsO1xuICAgIHRoaXMubGFzdFBvc2l0aW9uID0gbnVsbDtcbiAgICB0aGlzLnRpbWVMYXBzZWQgPSAwO1xuXG4gICAgdGhpcy53aW5kb3dTY3JvbGxUb3AgPSB3aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCB8fCAwO1xuXG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lcikge1xuICAgICAgdGhpcy5zdGFydFBvc2l0aW9uID0gdGhpcy53aW5kb3dTY3JvbGxUb3A7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhcnRQb3NpdGlvbiA9IHRoaXMuaXNXaW5kb3cgPyB0aGlzLndpbmRvd1Njcm9sbFRvcCA6IHRoaXMuY29udGFpbmVyLnNjcm9sbFRvcDtcbiAgICB9XG5cbiAgICAvLyBDb3JyZWN0aW9uIGZvciBTdGFydGluZyBQb3NpdGlvbiBvZiBuZXN0ZWQgSFRNTCBFbGVtZW50c1xuICAgIGlmICh0aGlzLmNvbnRhaW5lciAmJiAhdGhpcy5pc1dpbmRvdykge1xuICAgICAgdGhpcy50byA9IHRoaXMudG8gLSB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyB0aGlzLnN0YXJ0UG9zaXRpb247XG4gICAgfVxuXG4gICAgLy8gU2V0IERpc3RhbmNlXG4gICAgY29uc3QgZGlyZWN0aW9uYWxEaXN0YW5jZSA9IHRoaXMuc3RhcnRQb3NpdGlvbiAtIHRoaXMudG87XG4gICAgdGhpcy5kaXN0YW5jZSA9IHRoaXMuY29udGFpbmVyID8gTWF0aC5hYnModGhpcy5zdGFydFBvc2l0aW9uIC0gdGhpcy50bykgOiB0aGlzLnRvO1xuXG4gICAgdGhpcy5tYXBwZWRPZmZzZXQgPSB0aGlzLm9wdGlvbnMub2Zmc2V0O1xuXG4gICAgLy8gU2V0IG9mZnNldCBmcm9tIE9mZnNldCBNYXBcbiAgICBpZiAodGhpcy5pc0Jyb3dzZXIpIHtcbiAgICAgIHRoaXMub3B0aW9uc1xuICAgICAgICAub2Zmc2V0TWFwXG4gICAgICAgIC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB0aGlzLm1hcHBlZE9mZnNldCA9IHdpbmRvdy5pbm5lcldpZHRoID4ga2V5ID8gdmFsdWUgOiB0aGlzLm1hcHBlZE9mZnNldCk7XG4gICAgfVxuXG4gICAgdGhpcy5kaXN0YW5jZSArPSB0aGlzLm1hcHBlZE9mZnNldCAqIChkaXJlY3Rpb25hbERpc3RhbmNlIDw9IDAgPyAxIDogLTEpO1xuICAgIHRoaXMuc291cmNlJCA9IG5ldyBSZXBsYXlTdWJqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgdGhlIG5ldyBTY3JvbGwgQW5pbWF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyAgICAgICAgIE9ic2VydmFibGUgY29udGFpbmluZyBhIG51bWJlclxuICAgKi9cbiAgc3RhcnQoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWwpO1xuICAgIHRoaXMuaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCh0aGlzLmxvb3AsIHRoaXMudGljayk7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIHRoZSBjdXJyZW50IFNjcm9sbCBBbmltYXRpb24gTG9vcC5cbiAgICpcbiAgICogQHBhcmFtIGZvcmNlICAgICAgICAgIEZvcmNlIHRvIHN0b3AgdGhlIEFuaW1hdGlvbiBMb29wXG4gICAqIEByZXR1cm5zICAgICAgICAgICAgICAgVm9pZFxuICAgKi9cbiAgc3RvcCgpOiB2b2lkIHtcbiAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWwpO1xuICAgIHRoaXMuaW50ZXJ2YWwgPSBudWxsO1xuICAgIHRoaXMuc291cmNlJC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLyoqIFJlY3Vyc2l2ZWx5IGxvb3Agb3ZlciB0aGUgU2Nyb2xsIEFuaW1hdGlvbiAqL1xuICBwcml2YXRlIGxvb3AgPSAoKTogdm9pZCA9PiB7XG5cbiAgICB0aGlzLnRpbWVMYXBzZWQgKz0gdGhpcy50aWNrO1xuICAgIHRoaXMucGVyY2VudGFnZSA9ICh0aGlzLnRpbWVMYXBzZWQgLyB0aGlzLm9wdGlvbnMuZHVyYXRpb24pO1xuICAgIHRoaXMucGVyY2VudGFnZSA9ICh0aGlzLnBlcmNlbnRhZ2UgPiAxKSA/IDEgOiB0aGlzLnBlcmNlbnRhZ2U7XG5cbiAgICAvLyBQb3NpdGlvbiBVcGRhdGVcbiAgICB0aGlzLnBvc2l0aW9uID0gdGhpcy5zdGFydFBvc2l0aW9uICtcbiAgICAgICgodGhpcy5zdGFydFBvc2l0aW9uIC0gdGhpcy50byA8PSAwID8gMSA6IC0xKSAqXG4gICAgICAgIHRoaXMuZGlzdGFuY2UgKlxuICAgICAgICBFQVNJTkdbdGhpcy5vcHRpb25zLmVhc2luZ10odGhpcy5wZXJjZW50YWdlKSk7XG5cbiAgICBpZiAodGhpcy5sYXN0UG9zaXRpb24gIT09IG51bGwgJiYgdGhpcy5wb3NpdGlvbiA9PT0gdGhpcy5sYXN0UG9zaXRpb24pIHtcbiAgICAgIHRoaXMuc3RvcCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNvdXJjZSQubmV4dCh0aGlzLnBvc2l0aW9uKTtcbiAgICAgIHRoaXMuaXNXaW5kb3dcbiAgICAgICAgPyB0aGlzLmxpc3RlbmVyVGFyZ2V0LnNjcm9sbFRvKDAsIE1hdGguZmxvb3IodGhpcy5wb3NpdGlvbikpXG4gICAgICAgIDogdGhpcy5jb250YWluZXIuc2Nyb2xsVG9wID0gTWF0aC5mbG9vcih0aGlzLnBvc2l0aW9uKTtcbiAgICAgIHRoaXMubGFzdFBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbjtcbiAgICB9XG4gIH1cbn1cbiJdfQ==