Angular 10 滚动经过片段时获取路由器活动片段?
Angular 10 get router active fragment when scrolling past the fragment?
我试图在导航中突出显示您滚动经过的活动片段。
将片段和导航添加到片段很简单并且效果很好,示例:
class="nav-button unselectable"
matRipple
routerLink="/"
fragment="features"
[ngClass]="{ 'nav-active': (active_fragment | async) === 'features' }"
但是路由器显然无法知道您正在滚动哪个元素,所以我尝试监听滚动事件并使用 Y 位置检查最近的元素。
但我的着陆页不是导航的子页面,因此 viewchild 不起作用,例如:
导航组件:
@ViewChild('features', { static: false })
private _features: ElementRef;
@HostListener('window:scroll', ['$event'])
private _update_active_fragment(event: any) {
event.preventDefault();
console.log(window.pageYOffset);
console.log(this._features.nativeElement);
}
着陆页组件:
<app-features #features id="features"></app-features>
但是特性原生元素未定义。
我的问题是:
- 我还能如何实现此功能?
- 如何从导航组件中获取元素 ref?
- 如何获取导航组件中功能元素的 y 位置?
创建了新的导航服务:
public active_fragment: BehaviorSubject<string> = new BehaviorSubject('');
constructor(private readonly route: ActivatedRoute) {
this.route.fragment.subscribe((frag) => {
this.active_fragment.next(frag);
});
}
在我的导航组件中:
[ngClass]="{
'nav-active': (navigationService.active_fragment | async) === 'home'
}"
在包含我的片段的登陆组件中:
@ViewChild('features', { read: ElementRef })
private _features: ElementRef;
@ViewChild('benefits', { read: ElementRef })
private _benefits: ElementRef;
@HostListener('window:scroll', ['$event'])
private _update_active_fragment(event: any) {
event.preventDefault();
switch (true) {
case window.pageYOffset >=
this._some_previous_element.nativeElement.offsetTop &&
window.pageYOffset <= this._features.nativeElement.offsetTop: {
this.navigationService.active_fragment.next('network-rail-feedback');
break;
}
case window.pageYOffset >= this._features.nativeElement.offsetTop &&
window.pageYOffset <= this._benefits.nativeElement.offsetTop: {
this.navigationService.active_fragment.next('features');
break;
}
default:
break;
}
}
我试图在导航中突出显示您滚动经过的活动片段。
将片段和导航添加到片段很简单并且效果很好,示例:
class="nav-button unselectable"
matRipple
routerLink="/"
fragment="features"
[ngClass]="{ 'nav-active': (active_fragment | async) === 'features' }"
但是路由器显然无法知道您正在滚动哪个元素,所以我尝试监听滚动事件并使用 Y 位置检查最近的元素。
但我的着陆页不是导航的子页面,因此 viewchild 不起作用,例如:
导航组件:
@ViewChild('features', { static: false })
private _features: ElementRef;
@HostListener('window:scroll', ['$event'])
private _update_active_fragment(event: any) {
event.preventDefault();
console.log(window.pageYOffset);
console.log(this._features.nativeElement);
}
着陆页组件:
<app-features #features id="features"></app-features>
但是特性原生元素未定义。
我的问题是:
- 我还能如何实现此功能?
- 如何从导航组件中获取元素 ref?
- 如何获取导航组件中功能元素的 y 位置?
创建了新的导航服务:
public active_fragment: BehaviorSubject<string> = new BehaviorSubject('');
constructor(private readonly route: ActivatedRoute) {
this.route.fragment.subscribe((frag) => {
this.active_fragment.next(frag);
});
}
在我的导航组件中:
[ngClass]="{
'nav-active': (navigationService.active_fragment | async) === 'home'
}"
在包含我的片段的登陆组件中:
@ViewChild('features', { read: ElementRef })
private _features: ElementRef;
@ViewChild('benefits', { read: ElementRef })
private _benefits: ElementRef;
@HostListener('window:scroll', ['$event'])
private _update_active_fragment(event: any) {
event.preventDefault();
switch (true) {
case window.pageYOffset >=
this._some_previous_element.nativeElement.offsetTop &&
window.pageYOffset <= this._features.nativeElement.offsetTop: {
this.navigationService.active_fragment.next('network-rail-feedback');
break;
}
case window.pageYOffset >= this._features.nativeElement.offsetTop &&
window.pageYOffset <= this._benefits.nativeElement.offsetTop: {
this.navigationService.active_fragment.next('features');
break;
}
default:
break;
}
}