ng-scroll-spy
Version:
Angular directive that tracking the scrolling of the document and highlight the navigation link
1 lines • 7.25 kB
Source Map (JSON)
{"version":3,"file":"ng-scroll-spy.mjs","sources":["../../src/directives/ng-scroll-spy.directive.ts","../../src/ng-scroll-spy.module.ts","../../src/ng-scroll-spy.ts"],"sourcesContent":["import {AfterContentInit, Directive, ElementRef, HostListener, Inject, Renderer2} from '@angular/core';\nimport {DOCUMENT} from '@angular/common';\n\nimport {extractElementPosition} from 'ng-html-util';\n\n@Directive({\n selector: '[scroll-spy]'\n})\nexport class ScrollSpyDirective implements AfterContentInit {\n\n private elements = [];\n private currentActiveLink;\n private directNavigation = false;\n\n constructor(@Inject(DOCUMENT) private document: Document,\n private el: ElementRef,\n private renderer: Renderer2) {\n }\n\n public ngAfterContentInit(): void {\n this.collectIds();\n }\n\n private collectIds(): void {\n this.elements = [];\n let elements = this.el.nativeElement.querySelectorAll('a');\n\n for (let i = 0; i < elements.length; i++) {\n let elem = elements.item(i);\n\n let id = ScrollSpyDirective.getId(elem);\n if (!id)\n continue;\n\n let destination = this._getPeerElement(id);\n\n if (!destination)\n continue;\n\n elem.addEventListener('click', this._onLinkClicked.bind(this));\n\n this.elements.push({\n id,\n link: elem,\n destination\n })\n }\n }\n\n private _onLinkClicked(event: Event): void {\n event.preventDefault();\n\n let target = event.currentTarget;\n let id = ScrollSpyDirective.getId(target);\n let destination = this._getPeerElement(id);\n this.directNavigation = true;\n\n let position = extractElementPosition(this.document, destination);\n\n window.scrollTo({top: position.top - 25, left: 0, behavior: 'smooth'});\n\n this._cleanCurrentLink();\n this._setCurrentLink(target);\n this.directNavigation = false;\n }\n\n private _getPeerElement(id): HTMLElement | null {\n\n let destination = this.document.getElementById(id);\n\n if (!destination)\n return null;\n\n return destination;\n }\n\n private static getId(elem): string {\n let href = elem.getAttribute('href');\n\n if (!href)\n return null;\n\n return href.replace('#', '');\n }\n\n @HostListener(\"window:scroll\", ['$event'])\n onWindowScroll(event: Event): void {\n if (this.directNavigation)\n return;\n\n for (let elem of this.elements) {\n let top = elem.destination.getBoundingClientRect().top;\n if (top > 0 && top < 25) {\n this._cleanCurrentLink();\n this._setCurrentLink(elem.link);\n break;\n }\n }\n }\n\n private _cleanCurrentLink(): void {\n if (!this.currentActiveLink)\n return;\n\n this.renderer.removeClass(this.currentActiveLink, 'active');\n }\n\n private _setCurrentLink(elem): void {\n this.currentActiveLink = elem;\n this.renderer.addClass(this.currentActiveLink, 'active');\n }\n}\n","import {NgModule} from '@angular/core';\nimport {polyfill as smoothscroll} from 'smoothscroll-polyfill';\n\nimport {ScrollSpyDirective} from './directives/ng-scroll-spy.directive';\n\nexport * from './directives/ng-scroll-spy.directive';\n\n@NgModule({\n declarations: [ScrollSpyDirective],\n exports: [ScrollSpyDirective]\n})\nexport class ScrollSpyModule {\n constructor(){\n smoothscroll();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["smoothscroll"],"mappings":"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"}