ngx-intersection-observer
Version:
Intersection observer for Angular
1 lines • 24.1 kB
Source Map (JSON)
{"version":3,"file":"ngx-intersection-observer.mjs","sources":["../../../projects/intersection-observer/src/lib/intersection-observer-config.model.ts","../../../projects/intersection-observer/src/lib/intersection-observer.service.ts","../../../projects/intersection-observer/src/lib/intersection-observer.directive.ts","../../../projects/intersection-observer/src/lib/intersection-observer.module.ts","../../../projects/intersection-observer/src/public-api.ts","../../../projects/intersection-observer/src/ngx-intersection-observer.ts"],"sourcesContent":["export class IntersectionObserverConfig {\r\n /** Debounces the intersection check. */\r\n debounce: number = 50;\r\n /** Specifies how many precentage of the element need to be visible to treat it as intersection. */\r\n threshold: number = 30;\r\n /** Automatically remove classes from the element. */\r\n autoRemove: boolean = true;\r\n /** Scroll Listener, false = IntersectionObserver */\r\n useScroll: boolean = false;\r\n}\r\n","import { Injectable, OnDestroy, Optional } from '@angular/core';\r\nimport { debounceTime, distinctUntilChanged, EMPTY, fromEvent, merge, Observable, ReplaySubject, Subscription } from 'rxjs';\r\nimport { IntersectionObserverConfig } from './intersection-observer-config.model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class IntersectionObserverService implements OnDestroy {\r\n private _windowScrollY$: ReplaySubject<number> = new ReplaySubject<number>();\r\n private _windowResize$: ReplaySubject<number> = new ReplaySubject<number>();\r\n private _windowViewportChange$: ReplaySubject<number> = new ReplaySubject<number>();\r\n private _pageYOffset: number = 0;\r\n private _config: IntersectionObserverConfig;\r\n\r\n private onScroll$: Observable<any>;\r\n private onResize$: Observable<any>;\r\n\r\n private scrollSub: Subscription;\r\n private resizeSub: Subscription;\r\n private viewportChangeSub: Subscription;\r\n\r\n constructor(@Optional() private intersectionObserverConfig?: IntersectionObserverConfig) {\r\n\r\n // Get the config or default\r\n this._config = intersectionObserverConfig ? intersectionObserverConfig : {\r\n debounce: 10,\r\n threshold: 20\r\n } as IntersectionObserverConfig;\r\n\r\n // Manage scroll position initially\r\n this.manageScrollPos();\r\n\r\n // Subscribe to window scroll event and debounce it\r\n this.onScroll$ =\r\n typeof window !== \"undefined\" ? fromEvent(window, \"scroll\") : EMPTY;\r\n this.scrollSub = this.onScroll$\r\n .pipe(\r\n debounceTime(this._config.debounce),\r\n distinctUntilChanged())\r\n .subscribe(t => {\r\n this.manageScrollPos();\r\n this._windowScrollY$.next(this._pageYOffset);\r\n });\r\n\r\n // Subscribe to window resize event and debounce it\r\n this.onResize$ =\r\n typeof window !== \"undefined\" ? fromEvent(window, \"resize\") : EMPTY;\r\n this.resizeSub = this.onResize$\r\n .pipe(\r\n debounceTime(this._config.debounce),\r\n distinctUntilChanged())\r\n .subscribe(t => {\r\n this.manageScrollPos();\r\n this._windowResize$.next(this._pageYOffset);\r\n });\r\n\r\n // Observable that fires on scroll or resize\r\n this.viewportChangeSub = merge(this._windowScrollY$, this._windowResize$)\r\n .subscribe(t => {\r\n this._windowViewportChange$.next(this._pageYOffset);\r\n });\r\n }\r\n\r\n /** Gets the page offset Y axis */\r\n get pageYOffset() {\r\n return this._pageYOffset;\r\n }\r\n\r\n /** Gets the intersection observer config */\r\n get config() {\r\n return this._config;\r\n }\r\n\r\n /** Gets an observable to the window scroll event */\r\n get windowScrollY$() {\r\n return this._windowScrollY$;\r\n }\r\n\r\n /** Gets an observable to the window resize event */\r\n get windowResize$() {\r\n return this._windowResize$;\r\n }\r\n\r\n /** Gets an observable to the window viewport event (combination of resize and scroll) */\r\n get windowViewportChange$() {\r\n return this._windowViewportChange$;\r\n }\r\n\r\n private manageScrollPos(): void {\r\n this._pageYOffset = typeof window !== \"undefined\" ? window.pageYOffset : 0;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.scrollSub.unsubscribe();\r\n this.resizeSub.unsubscribe();\r\n this.viewportChangeSub.unsubscribe();\r\n }\r\n}\r\n","import { Directive, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Optional, Output, Renderer2 } from \"@angular/core\";\r\nimport { config, Subscription } from \"rxjs\";\r\nimport { IntersectionObserverConfig } from \"./intersection-observer-config.model\";\r\nimport { IntersectionObserverEvent } from \"./intersection-observer-event.model\";\r\nimport { IntersectionObserverService } from \"./intersection-observer.service\";\r\n\r\n@Directive({\r\n selector: \"[intersectionObserver]\",\r\n\r\n})\r\nexport class IntersectionObserverDirective implements OnInit, OnDestroy {\r\n\r\n // Private fields\r\n private _viewportChangeSub: Subscription = new Subscription();\r\n private _visitClass: string[] = [];\r\n private _leaveClass: string[] = [];\r\n private _removeVisitClass: string[] = [];\r\n private _removeLeaveClass: string[] = [];\r\n private _elementVisible: boolean = false;\r\n private _hasClasses: boolean = false;\r\n\r\n // Directive inputs\r\n @Input() visitClass: string | undefined; // Classes to apply when the element visits the viewport.\r\n @Input() leaveClass: string | undefined; // Classes to apply when the element visits the viewport.\r\n @Input() removeVisitClass: string | undefined // Classes to remove whe the element visits the viewport\r\n @Input() removeLeaveClass: string | undefined // Classes to remove when the element leaves the viewport.\r\n\r\n @Input() useScroll: boolean | undefined // true = Scroll Listener, false = IntersectionObserver\r\n @Input() threshold: number | undefined; // Threshold, how many precentage of the element must be out of the viewport to treat it as invisible.\r\n @Input() autoRemove: boolean | undefined; // true = Automatically remove classes from the element, false -> use removeLeaveClass\r\n\r\n // Directive outputs\r\n @Output() intersection: EventEmitter<IntersectionObserverEvent> =\r\n new EventEmitter<IntersectionObserverEvent>(); // Event that fires once an element intersects.\r\n\r\n constructor(\r\n private element: ElementRef<any>,\r\n private renderer: Renderer2,\r\n private intersectionObserverService: IntersectionObserverService,\r\n @Optional() private intersectionObserverConfig?: IntersectionObserverConfig) {\r\n }\r\n\r\n ngOnInit(): void {\r\n\r\n // Generate arrays of class stings\r\n this._visitClass = this.getClassArray(this.visitClass ?? \"\");\r\n this._leaveClass = this.getClassArray(this.leaveClass ?? \"\");\r\n this._removeVisitClass = this.getClassArray(this.removeVisitClass ?? \"\");\r\n this._removeLeaveClass = this.getClassArray(this.removeLeaveClass ?? \"\");\r\n this._hasClasses = (this.visitClass || this.leaveClass || this.removeVisitClass || this.removeLeaveClass) ? true : false;\r\n\r\n // Identify which intersection mechanism should be used\r\n // (IntersectionObserver or Scroll Listener) default IntersectionObserver\r\n let useScroll = this.intersectionObserverConfig?.useScroll;\r\n useScroll = useScroll == undefined ? false : useScroll;\r\n useScroll = this.useScroll == undefined ? useScroll : this.useScroll; \r\n\r\n // Get threshold or default to 30\r\n let threshold = this.intersectionObserverConfig?.threshold;\r\n threshold = threshold == undefined ? 30 : threshold;\r\n threshold = this.threshold == undefined ? threshold : this.threshold; \r\n\r\n // Auto remove\r\n let autoRemove = this.intersectionObserverConfig?.autoRemove;\r\n autoRemove = autoRemove == undefined ? true : autoRemove;\r\n autoRemove = this.autoRemove == undefined ? autoRemove : this.autoRemove;\r\n\r\n // using intersecting observer by default, else fallback to scroll Listener\r\n if (\"IntersectionObserver\" in window && !useScroll) {\r\n const options: IntersectionObserverInit = {\r\n root: null, // Use window as root\r\n threshold: threshold / 100,\r\n rootMargin: \"0px\"\r\n };\r\n const observer: IntersectionObserver = new IntersectionObserver(\r\n (entries, _) => {\r\n entries.forEach((entry) => {\r\n this.handleIntersection(entry.isIntersecting);\r\n });\r\n },\r\n options\r\n );\r\n observer.observe(this.element.nativeElement);\r\n return;\r\n }\r\n\r\n // Fallback to scroll listener\r\n this._viewportChangeSub = this.intersectionObserverService.windowViewportChange$.subscribe(() =>\r\n this.checkForIntersection()\r\n );\r\n }\r\n\r\n /**\r\n * Gets an array of classes.\r\n * @param classString String with classes separated by whitespace.\r\n * @returns An array with classes.\r\n */\r\n private getClassArray(classString: string): string[] {\r\n let classes = new Array<string>();\r\n classString.split(\" \").forEach(cls => {\r\n if (cls.trim()) {\r\n classes.push(cls.trim());\r\n }\r\n });\r\n\r\n return classes;\r\n }\r\n\r\n /**\r\n * Checks if the element is visible within the viewport.\r\n * @returns void\r\n * */\r\n private checkForIntersection(): void {\r\n const thresholdPx = (this.elementHeight / 100) * this.threshold!;\r\n const scrollTriggerMax = this.offsetTop + thresholdPx - this.winHeight;\r\n const scrollTriggerMin = (this.offsetTop + (this.elementHeight - thresholdPx));\r\n this.handleIntersection(\r\n this.intersectionObserverService.pageYOffset >= scrollTriggerMax &&\r\n this.intersectionObserverService.pageYOffset <= scrollTriggerMin);\r\n }\r\n\r\n /**\r\n * \r\n * @param intersect Determines if the elements intersects with its viewport or not.\r\n * @returns void\r\n */\r\n private handleIntersection(intersect: boolean): void {\r\n this._elementVisible = intersect;\r\n this.handleClasses();\r\n this.intersection.emit({ element: this.element, intersect: intersect } as IntersectionObserverEvent);\r\n }\r\n\r\n /**\r\n * Adds or removes classes on the element when it enters or leaves the viewport.\r\n * @returns void\r\n * */\r\n private handleClasses(): void {\r\n // No classes, skip\r\n if (!this._hasClasses)\r\n return;\r\n\r\n if (this._elementVisible) {\r\n this.addClasses(this._visitClass);\r\n if (this.autoRemove) {\r\n this.removeClasses(this._leaveClass);\r\n }\r\n this.removeClasses(this._removeVisitClass);\r\n }\r\n else {\r\n this.addClasses(this._leaveClass);\r\n if (this.autoRemove) {\r\n this.removeClasses(this._visitClass);\r\n }\r\n this.removeClasses(this._removeLeaveClass)\r\n }\r\n }\r\n\r\n /**\r\n * Helper to add a list of classes to the element.\r\n * @param classes The list of classes to add.\r\n * @returns void\r\n */\r\n private addClasses(classes: string[]): void {\r\n classes.forEach(cls => {\r\n if (!this.element.nativeElement.classList.contains(cls)) {\r\n this.renderer.addClass(this.element.nativeElement, cls);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Helper to remove a list of classes from the element.\r\n * @param classes The list of classes to remove.\r\n * @returns void\r\n */\r\n private removeClasses(classes: string[]) {\r\n classes.forEach(cls => {\r\n if (this.element.nativeElement.classList.contains(cls)) {\r\n this.renderer.removeClass(this.element.nativeElement, cls);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Gets the height of the browser window. \r\n * @returns the height of the browser window.\r\n */\r\n private get winHeight() {\r\n return typeof window !== \"undefined\" ? window.innerHeight : 0;\r\n }\r\n\r\n /**\r\n * Gets the offset of the element. \r\n * @returns The elements offset.\r\n */\r\n private get offsetTop() {\r\n if (typeof this.element.nativeElement.getBoundingClientRect === \"function\") {\r\n const viewportTop = this.element.nativeElement.getBoundingClientRect().top;\r\n return viewportTop + this.intersectionObserverService.pageYOffset - this.element.nativeElement.clientTop;\r\n }\r\n else {\r\n return 0;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the height of the element (Including border)\r\n * @returns the height of the element.\r\n */\r\n private get elementHeight() {\r\n return this.element.nativeElement.offsetHeight as number;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._viewportChangeSub.unsubscribe();\r\n }\r\n}\r\n","import { ModuleWithProviders, NgModule } from '@angular/core';\r\nimport { IntersectionObserverConfig } from './intersection-observer-config.model';\r\nimport { IntersectionObserverDirective } from './intersection-observer.directive';\r\nimport { IntersectionObserverService } from './intersection-observer.service';\r\n\r\n@NgModule({\r\n declarations: [\r\n IntersectionObserverDirective\r\n ],\r\n imports: [\r\n ],\r\n exports: [\r\n IntersectionObserverDirective\r\n ]\r\n})\r\nexport class IntersectionObserverModule {\r\n static forRoot(config?: IntersectionObserverConfig): ModuleWithProviders<IntersectionObserverModule> {\r\n return {\r\n ngModule: IntersectionObserverModule,\r\n providers: [\r\n { provide: IntersectionObserverConfig, useValue: config ? config : { debounce: 10, threshold: 30 } as IntersectionObserverConfig, multi: false },\r\n IntersectionObserverService\r\n ]\r\n };\r\n }\r\n}\r\n","/*\n * Public API Surface of intersection-observer\n */\n\nexport * from './lib/intersection-observer.directive';\nexport * from './lib/intersection-observer.service';\nexport * from './lib/intersection-observer.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.IntersectionObserverConfig","i1.IntersectionObserverService","i2.IntersectionObserverConfig"],"mappings":"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"}