@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.
1 lines • 36.5 kB
Source Map (JSON)
{"version":3,"file":"nicky-lenaers-ngx-scroll-to.mjs","sources":["../../../projects/ngx-scroll-to/src/lib/scroll-to-helpers.ts","../../../projects/ngx-scroll-to/src/lib/scroll-to-animation.ts","../../../projects/ngx-scroll-to/src/lib/scroll-to.service.ts","../../../projects/ngx-scroll-to/src/lib/scroll-to.directive.ts","../../../projects/ngx-scroll-to/src/lib/scroll-to.module.ts","../../../projects/ngx-scroll-to/src/public-api.ts","../../../projects/ngx-scroll-to/src/nicky-lenaers-ngx-scroll-to.ts"],"sourcesContent":["import { ElementRef } from '@angular/core';\n\nimport { ScrollToAnimationEasingCollection } from './scroll-to-easing.interface';\nimport { ScrollToDefaultConfigOptions } from './scroll-to-config.interface';\n\n/** Default values for Component Input */\nexport const DEFAULTS: ScrollToDefaultConfigOptions = {\n target: null,\n action: 'click',\n duration: 650,\n easing: 'easeInOutQuad',\n offset: 0,\n offsetMap: new Map()\n};\n\n/** Easing Colleciton */\nexport const EASING: ScrollToAnimationEasingCollection = {\n easeInQuad: (time: number) => {\n return time * time;\n },\n easeOutQuad: (time: number) => {\n return time * (2 - time);\n },\n easeInOutQuad: (time: number) => {\n return time < 0.5 ? 2 * time * time : -1 + (4 - 2 * time) * time;\n },\n easeInCubic: (time: number) => {\n return time * time * time;\n },\n easeOutCubic: (time: number) => {\n return (--time) * time * time + 1;\n },\n easeInOutCubic: (time: number) => {\n return time < 0.5 ? 4 * time * time * time : (time - 1) * (2 * time - 2) * (2 * time - 2) + 1;\n },\n easeInQuart: (time: number) => {\n return time * time * time * time;\n },\n easeOutQuart: (time: number) => {\n return 1 - (--time) * time * time * time;\n },\n easeInOutQuart: (time: number) => {\n return time < 0.5 ? 8 * time * time * time * time : 1 - 8 * (--time) * time * time * time;\n },\n easeInQuint: (time: number) => {\n return time * time * time * time * time;\n },\n easeOutQuint: (time: number) => {\n return 1 + (--time) * time * time * time * time;\n },\n easeInOutQuint: (time: number) => {\n return time < 0.5 ? 16 * time * time * time * time * time : 1 + 16 * (--time) * time * time * time * time;\n },\n easeOutElastic: (time: number) => {\n return Math.pow(2, -10 * time) * Math.sin((time - 1 / 4) * (2 * Math.PI) / 1) + 1;\n }\n};\n\n/**\n * Set of allowed events as triggers\n * for the Animation to start.\n */\nexport const EVENTS: string[] = [\n 'click',\n 'mouseenter',\n 'mouseover',\n 'mousedown',\n 'mouseup',\n 'dblclick',\n 'contextmenu',\n 'wheel',\n 'mouseleave',\n 'mouseout'\n];\n\n/**\n * Strip hash (#) from value.\n *\n * @param value \t\t\t\tThe given string value\n * @returns \t\t\t\t\tThe stripped string value\n */\nexport function stripHash(value: string): string {\n return value.substring(0, 1) === '#' ? value.substring(1) : value;\n}\n\n/**\n * Test if a given value is a string.\n *\n * @param value \t\t\t\t\tThe given value\n * @returns \t\t\t\t\t\tWhether the given value is a string\n */\nexport function isString(value: any): value is string {\n return typeof value === 'string' || value instanceof String;\n}\n\n/**\n * Test if a given Element is the Window.\n *\n * @param container \t\t\t\tThe given Element\n * @returns \t\t\t\t\t\tWhether the given Element is Window\n */\nexport function isWindow(container: any): container is Window {\n return container === window;\n}\n\n/**\n * Test if a given value is of type ElementRef.\n *\n * @param value \t\t\t\t\tThe given value\n * @returns Whether the given value is a number\n */\nexport function isElementRef(value: any): value is ElementRef {\n return value instanceof ElementRef;\n}\n\n/**\n * Whether or not the given value is a Native Element.\n *\n * @param value The given value\n * @returns Whether or not the value is a Native Element\n */\nexport function isNativeElement(value: any): value is HTMLElement {\n return value instanceof HTMLElement;\n}\n\n/**\n * Test if a given value is type number.\n *\n * @param value \t\t\t\t\tThe given value\n * @returns \t\t\t\t\t\tWhether the given value is a number\n */\nexport function isNumber(value: any): value is number {\n return !isNaN(parseFloat(value)) && isFinite(value);\n}\n","import { Observable, ReplaySubject } from 'rxjs';\n\nimport { EASING } from './scroll-to-helpers';\nimport { ScrollToConfigOptions, ScrollToListenerTarget } from './scroll-to-config.interface';\n\n/** Scroll To Animation */\nexport class ScrollToAnimation {\n\n /** Number of milliseconds for each Tick */\n private tick: number;\n\n /** Interval */\n private interval: any;\n\n /** Time Lapsed in milliseconds */\n private timeLapsed: number;\n\n /** Percentage of time lapsed */\n private percentage: number;\n\n /** Position of the Element */\n private position: number;\n\n /** Last Element Position */\n private lastPosition: number;\n\n /** Start Position of the Element */\n private startPosition: number;\n\n /** The Distance to scroll */\n private distance: number;\n\n /** Observable Source */\n private source$: ReplaySubject<number>;\n\n /** Scroll Top of the Window */\n private windowScrollTop: number;\n\n /** Mapped Offset taken from the active Offset Map */\n private mappedOffset: number;\n\n /**\n * Class Constructor.\n *\n * @param container The Container\n * @param listenerTarget The Element that listens for DOM Events\n * @param isWindow Whether or not the listener is the Window\n * @param to Position to scroll to\n * @param options Additional options for scrolling\n * @param isBrowser Whether or not execution runs in the browser\n * (as opposed to the server)\n */\n constructor(\n private container: HTMLElement,\n private listenerTarget: ScrollToListenerTarget,\n private readonly isWindow: boolean,\n private readonly to: number,\n private readonly options: ScrollToConfigOptions,\n private isBrowser: boolean\n ) {\n this.tick = 16;\n this.interval = null;\n this.lastPosition = null;\n this.timeLapsed = 0;\n\n this.windowScrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;\n\n if (!this.container) {\n this.startPosition = this.windowScrollTop;\n } else {\n this.startPosition = this.isWindow ? this.windowScrollTop : this.container.scrollTop;\n }\n\n // Correction for Starting Position of nested HTML Elements\n if (this.container && !this.isWindow) {\n this.to = this.to - this.container.getBoundingClientRect().top + this.startPosition;\n }\n\n // Set Distance\n const directionalDistance = this.startPosition - this.to;\n this.distance = this.container ? Math.abs(this.startPosition - this.to) : this.to;\n\n this.mappedOffset = this.options.offset;\n\n // Set offset from Offset Map\n if (this.isBrowser) {\n this.options\n .offsetMap\n .forEach((value, key) => this.mappedOffset = window.innerWidth > key ? value : this.mappedOffset);\n }\n\n this.distance += this.mappedOffset * (directionalDistance <= 0 ? 1 : -1);\n this.source$ = new ReplaySubject();\n }\n\n /**\n * Start the new Scroll Animation.\n *\n * @returns Observable containing a number\n */\n start(): Observable<number> {\n clearInterval(this.interval);\n this.interval = setInterval(this.loop, this.tick);\n return this.source$.asObservable();\n }\n\n /**\n * Stop the current Scroll Animation Loop.\n *\n * @param force Force to stop the Animation Loop\n * @returns Void\n */\n stop(): void {\n clearInterval(this.interval);\n this.interval = null;\n this.source$.complete();\n }\n\n /** Recursively loop over the Scroll Animation */\n private loop = (): void => {\n\n this.timeLapsed += this.tick;\n this.percentage = (this.timeLapsed / this.options.duration);\n this.percentage = (this.percentage > 1) ? 1 : this.percentage;\n\n // Position Update\n this.position = this.startPosition +\n ((this.startPosition - this.to <= 0 ? 1 : -1) *\n this.distance *\n EASING[this.options.easing](this.percentage));\n\n if (this.lastPosition !== null && this.position === this.lastPosition) {\n this.stop();\n } else {\n this.source$.next(this.position);\n this.isWindow\n ? this.listenerTarget.scrollTo(0, Math.floor(this.position))\n : this.container.scrollTop = Math.floor(this.position);\n this.lastPosition = this.position;\n }\n }\n}\n","import { Inject, Injectable, PLATFORM_ID } from '@angular/core';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\n\nimport {\n ScrollToConfigOptions,\n ScrollToConfigOptionsTarget,\n ScrollToListenerTarget,\n ScrollToTarget\n} from './scroll-to-config.interface';\nimport { ScrollToAnimation } from './scroll-to-animation';\nimport { DEFAULTS, isElementRef, isNativeElement, isNumber, isString, isWindow, stripHash } from './scroll-to-helpers';\nimport { Observable, ReplaySubject, throwError } from 'rxjs';\n\n/**\n * The Scroll To Service handles starting, interrupting\n * and ending the actual Scroll Animation. It provides\n * some utilities to find the proper HTML Element on a\n * given page to setup Event Listeners and calculate\n * distances for the Animation.\n */\n@Injectable()\nexport class ScrollToService {\n\n /**\n * The animation that provides the scrolling\n * to happen smoothly over time. Defining it here\n * allows for usage of e.g. `start` and `stop`\n * methods within this Angular Service.\n */\n private animation: ScrollToAnimation;\n\n /**\n * Interruptive Events allow to scrolling animation\n * to be interrupted before it is finished. The list\n * of Interruptive Events represents those.\n */\n private interruptiveEvents: string[];\n\n /**\n * Construct and setup required paratemeters.\n *\n * @param document A Reference to the Document\n * @param platformId Angular Platform ID\n */\n constructor(\n @Inject(DOCUMENT) private document: any,\n @Inject(PLATFORM_ID) private platformId: any\n ) {\n this.interruptiveEvents = ['mousewheel', 'DOMMouseScroll', 'touchstart'];\n }\n\n /**\n * Target an Element to scroll to. Notice that the `TimeOut` decorator\n * ensures the executing to take place in the next Angular lifecycle.\n * This allows for scrolling to elements that are e.g. initially hidden\n * by means of `*ngIf`, but ought to be scrolled to eventually.\n *\n * @todo type 'any' in Observable should become custom type like 'ScrollToEvent' (base class), see issue comment:\n * - https://github.com/nicky-lenaers/ngx-scroll-to/issues/10#issuecomment-317198481\n *\n * @param options Configuration Object\n * @returns Observable\n */\n scrollTo(options: ScrollToConfigOptions): Observable<any> {\n\n if (!isPlatformBrowser(this.platformId)) {\n return new ReplaySubject().asObservable();\n }\n\n return this.start(options);\n }\n\n /**\n * Start a new Animation.\n *\n * @todo Emit proper events from subscription\n *\n * @param options Configuration Object\n * @returns Observable\n */\n private start(options: ScrollToConfigOptions): Observable<number> {\n\n // Merge config with default values\n const mergedConfigOptions = {\n ...DEFAULTS as ScrollToConfigOptions,\n ...options\n } as ScrollToConfigOptionsTarget;\n\n if (this.animation) {\n this.animation.stop();\n }\n\n const targetNode = this.getNode(mergedConfigOptions.target);\n if (mergedConfigOptions.target && !targetNode) {\n return throwError(() => new Error('Unable to find Target Element'));\n }\n\n const container: HTMLElement = this.getContainer(mergedConfigOptions, targetNode);\n if (mergedConfigOptions.container && !container) {\n return throwError(() => new Error('Unable to find Container Element'));\n }\n\n const listenerTarget = this.getListenerTarget(container) || window;\n\n let to = container ? container.getBoundingClientRect().top : 0;\n\n if (targetNode) {\n to = isWindow(listenerTarget) ?\n window.scrollY + targetNode.getBoundingClientRect().top :\n targetNode.getBoundingClientRect().top;\n }\n\n // Create Animation\n this.animation = new ScrollToAnimation(\n container,\n listenerTarget,\n isWindow(listenerTarget),\n to,\n mergedConfigOptions,\n isPlatformBrowser(this.platformId)\n );\n const onInterrupt = () => this.animation.stop();\n this.addInterruptiveEventListeners(listenerTarget, onInterrupt);\n\n // Start Animation\n const animation$ = this.animation.start();\n this.subscribeToAnimation(animation$, listenerTarget, onInterrupt);\n\n return animation$;\n }\n\n /**\n * Subscribe to the events emitted from the Scrolling\n * Animation. Events might be used for e.g. unsubscribing\n * once finished.\n *\n * @param animation$ The Animation Observable\n * @param listenerTarget The Listener Target for events\n * @param onInterrupt The handler for Interruptive Events\n * @returns Void\n */\n private subscribeToAnimation(\n animation$: Observable<any>,\n listenerTarget: ScrollToListenerTarget,\n onInterrupt: EventListenerOrEventListenerObject\n ) {\n const subscription = animation$\n .subscribe(\n {\n complete: () => {\n this.removeInterruptiveEventListeners(this.interruptiveEvents, listenerTarget, onInterrupt);\n subscription.unsubscribe();\n }\n }\n );\n }\n\n /**\n * Get the container HTML Element in which\n * the scrolling should happen.\n *\n * @param options The Merged Configuration Object\n * @param targetNode the targeted HTMLElement\n */\n private getContainer(options: ScrollToConfigOptions, targetNode: HTMLElement): HTMLElement | null {\n\n let container: HTMLElement | null = null;\n\n if (options.container) {\n container = this.getNode(options.container, true);\n } else if (targetNode) {\n container = this.getFirstScrollableParent(targetNode);\n }\n\n return container;\n }\n\n /**\n * Add listeners for the Animation Interruptive Events\n * to the Listener Target.\n *\n * @param events List of events to listen to\n * @param listenerTarget Target to attach the listener on\n * @param handler Handler for when the listener fires\n * @returns Void\n */\n private addInterruptiveEventListeners(\n listenerTarget: ScrollToListenerTarget,\n handler: EventListenerOrEventListenerObject): void {\n\n if (!listenerTarget) {\n listenerTarget = window;\n }\n\n this.interruptiveEvents\n .forEach(event => listenerTarget\n .addEventListener(event, handler, this.supportPassive() ? {passive: true} : false));\n }\n\n /**\n * Feature-detect support for passive event listeners.\n *\n * @returns Whether or not passive event listeners are supported\n */\n private supportPassive(): boolean {\n\n let supportsPassive = false;\n\n try {\n const opts = Object.defineProperty({}, 'passive', {\n get: () => {\n supportsPassive = true;\n }\n });\n window.addEventListener('testPassive', null, opts);\n window.removeEventListener('testPassive', null, opts);\n } catch (e) {\n }\n\n return supportsPassive;\n }\n\n /**\n * Remove listeners for the Animation Interrupt Event from\n * the Listener Target. Specifying the correct handler prevents\n * memory leaks and makes the allocated memory available for\n * Garbage Collection.\n *\n * @param events List of Interruptive Events to remove\n * @param listenerTarget Target to attach the listener on\n * @param handler Handler for when the listener fires\n * @returns Void\n */\n private removeInterruptiveEventListeners(\n events: string[],\n listenerTarget: ScrollToListenerTarget,\n handler: EventListenerOrEventListenerObject): void {\n\n if (!listenerTarget) {\n listenerTarget = window;\n }\n events.forEach(event => listenerTarget.removeEventListener(event, handler));\n }\n\n /**\n * Find the first scrollable parent Node of a given\n * Element. The DOM Tree gets searched upwards\n * to find this first scrollable parent. Parents might\n * be ignored by CSS styles applied to the HTML Element.\n *\n * @param nativeElement The Element to search the DOM Tree upwards from\n * @returns The first scrollable parent HTML Element\n */\n private getFirstScrollableParent(nativeElement: HTMLElement): HTMLElement {\n\n let style: CSSStyleDeclaration = window.getComputedStyle(nativeElement);\n\n const overflowRegex: RegExp = /(auto|scroll|overlay)/;\n\n if (style.position === 'fixed') {\n return null;\n }\n\n let parent = nativeElement;\n while (parent.parentElement) {\n parent = parent.parentElement;\n style = window.getComputedStyle(parent);\n\n if (style.position === 'absolute'\n || style.overflow === 'hidden'\n || style.overflowY === 'hidden') {\n continue;\n }\n\n if (overflowRegex.test(style.overflow + style.overflowY)\n || parent.tagName === 'BODY') {\n return parent;\n }\n }\n\n return null;\n }\n\n /**\n * Get the Target Node to scroll to.\n *\n * @param id The given ID of the node, either a string or\n * an element reference\n * @param allowBodyTag Indicate whether or not the Document Body is\n * considered a valid Target Node\n * @returns The Target Node to scroll to\n */\n private getNode(id: ScrollToTarget, allowBodyTag: boolean = false): HTMLElement {\n\n let targetNode: HTMLElement;\n\n if (isString(id)) {\n if (allowBodyTag && (id === 'body' || id === 'BODY')) {\n targetNode = this.document.body;\n } else {\n targetNode = this.document.getElementById(stripHash(id));\n }\n } else if (isNumber(id)) {\n targetNode = this.document.getElementById(String(id));\n } else if (isElementRef(id)) {\n targetNode = id.nativeElement;\n } else if (isNativeElement(id)) {\n targetNode = id;\n }\n\n return targetNode;\n }\n\n /**\n * Retrieve the Listener target. This Listener Target is used\n * to attach Event Listeners on. In case of the target being\n * the Document Body, we need the actual `window` to listen\n * for events.\n *\n * @param container The HTML Container element\n * @returns The Listener Target to attach events on\n */\n private getListenerTarget(container: HTMLElement): ScrollToListenerTarget {\n if (!container) {\n return null;\n }\n return this.isDocumentBody(container) ? window : container;\n }\n\n /**\n * Test if a given HTML Element is the Document Body.\n *\n * @param element The given HTML Element\n * @returns Whether or not the Element is the\n * Document Body Element\n */\n private isDocumentBody(element: HTMLElement): element is HTMLBodyElement {\n return element.tagName.toUpperCase() === 'BODY';\n }\n}\n","import { AfterViewInit, Directive, ElementRef, Input, Renderer2 } from '@angular/core';\n\nimport { DEFAULTS, EVENTS } from './scroll-to-helpers';\nimport { ScrollToConfigOptions, ScrollToOffsetMap, ScrollToTarget } from './scroll-to-config.interface';\nimport { ScrollToAnimationEasing } from './scroll-to-easing.interface';\nimport { ScrollToEvent } from './scroll-to-event.interface';\nimport { ScrollToService } from './scroll-to.service';\n\n@Directive({\n selector: '[ngxScrollTo]'\n})\nexport class ScrollToDirective implements AfterViewInit {\n\n @Input()\n ngxScrollTo: ScrollToTarget = DEFAULTS.target;\n\n @Input()\n ngxScrollToEvent: ScrollToEvent = DEFAULTS.action;\n\n @Input()\n ngxScrollToDuration: number = DEFAULTS.duration;\n\n @Input()\n ngxScrollToEasing: ScrollToAnimationEasing = DEFAULTS.easing;\n\n @Input()\n ngxScrollToOffset: number = DEFAULTS.offset;\n\n @Input()\n ngxScrollToOffsetMap: ScrollToOffsetMap = DEFAULTS.offsetMap;\n\n private options: ScrollToConfigOptions;\n\n constructor(\n private elementRef: ElementRef,\n private scrollToService: ScrollToService,\n private renderer2: Renderer2) {\n }\n\n /**\n * Angular Lifecycle Hook - After View Init\n *\n * @todo Implement Subscription for Events\n *\n * @returns void\n */\n ngAfterViewInit(): void {\n\n // Test Event Support\n if (EVENTS.indexOf(this.ngxScrollToEvent) === -1) {\n throw new Error(`Unsupported Event '${this.ngxScrollToEvent}'`);\n }\n\n // Listen for the trigger...\n this.renderer2.listen(this.elementRef.nativeElement, this.ngxScrollToEvent,\n (event: Event) => {\n\n this.options = {\n target: this.ngxScrollTo,\n duration: this.ngxScrollToDuration,\n easing: this.ngxScrollToEasing,\n offset: this.ngxScrollToOffset,\n offsetMap: this.ngxScrollToOffsetMap\n };\n\n this.scrollToService.scrollTo(this.options);\n });\n }\n}\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { ScrollToDirective } from './scroll-to.directive';\nimport { ScrollToService } from './scroll-to.service';\n\n/** Scroll To Module */\n@NgModule({\n declarations: [\n ScrollToDirective\n ],\n exports: [\n ScrollToDirective\n ]\n})\nexport class ScrollToModule {\n\n /**\n * Guaranteed singletons for provided Services across App.\n *\n * @return An Angular Module with Providers\n */\n static forRoot(): ModuleWithProviders<ScrollToModule> {\n return {\n ngModule: ScrollToModule,\n providers: [\n ScrollToService\n ]\n };\n }\n}\n","/*\n * Public API Surface of ngx-scroll-to\n */\n\nexport * from './lib/scroll-to-config.interface';\nexport * from './lib/scroll-to-easing.interface';\nexport * from './lib/scroll-to.directive';\nexport * from './lib/scroll-to.module';\nexport * from './lib/scroll-to.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ScrollToService"],"mappings":"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"}