// @HostListener('scroll', ['$event']) // for scroll events of the current element
@HostListener('window:scroll', ['$event']) // for window scroll events
onScroll(event) {
...
}
或者<div (scroll)="onScroll($event)"></div>
@HostListener()
。 - Günter Zöchbauer您可以使用@HostListener装饰器。适用于Angular 4及以上版本。
import { HostListener } from '@angular/core';
@HostListener("window:scroll", []) onWindowScroll() {
// do some stuff here when the window is scrolled
const verticalOffset = window.pageYOffset
|| document.documentElement.scrollTop
|| document.body.scrollTop || 0;
}
对于 Angular 4,有效的解决方案是在组件内部执行以下操作:
@HostListener('window:scroll', ['$event']) onScrollEvent($event){
console.log($event);
console.log("scrolling");
}
(scroll)="onScrollEvent($event)
。 - blueprintchris监听 window:scroll
事件以便捕获窗口/文档级别的滚动,使用元素的 scroll
事件来捕获元素级别的滚动。
@HostListener('window:scroll', ['$event'])
onWindowScroll($event) {
}
或者<div (window:scroll)="onWindowScroll($event)">
@HostListener('scroll', ['$event'])
onElementScroll($event) {
}
或者<div (scroll)="onElementScroll($event)">
@HostListener('scroll', ['$event'])
只有当宿主元素本身可滚动时才起作用。
import { HostListener } from '@angular/core';
- Mike D3ViD Tyson<div (window:scroll)="onWindowScroll($event)">
,清晰易懂,对我非常有效。谢谢伙计! - Nick09替代@HostListener
和滚动输出元素,我建议使用RxJS中的fromEvent,因为您可以将其与filter()
和distinctUntilChanges()
链接,可以轻松跳过可能重复的事件(和变化检测)。
这里是一个简单的示例:
// {static: true} can be omitted if you don't need this element/listener in ngOnInit
@ViewChild('elementId', {static: true}) el: ElementRef;
// ...
fromEvent(this.el.nativeElement, 'scroll')
.pipe(
// Is elementId scrolled for more than 50 from top?
map((e: Event) => (e.srcElement as Element).scrollTop > 50),
// Dispatch change only if result from map above is different from previous result
distinctUntilChanged());
currentPosition = window.pageYOffset;
@HostListener('window:scroll', ['$event.target']) // for window scroll events
scroll(e) {
let scroll = e.scrollingElement.scrollTop;
console.log("this is the scroll position", scroll)
if (scroll > this.currentPosition) {
console.log("scrollDown");
} else {
console.log("scrollUp");
}
this.currentPosition = scroll;
}
请查看此网址中提到的多个示例。
我会推荐方法3,
https://itnext.io/4-ways-to-listen-to-page-scrolling-for-dynamic-ui-in-angular-ft-rxjs-5a83f91ee487
@Component({
selector : 'ngx-root',
templateUrl : './app.component.html',
styleUrls : [ './app.component.scss' ],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class AppComponent implements OnDestroy {
destroy = new Subject();
destroy$ = this.destroy.asObservable();
constructor() {
fromEvent(window, 'scroll').pipe(takeUntil(this.destroy$))
.subscribe((e: Event) => console.log(this.getYPosition(e)));
}
getYPosition(): number {
return (e.target as Element).scrollTop;
}
ngOnDestroy(): void {
this.destroy.next();
}
}
尝试使用(在我的情况下,scroll
事件不起作用)
<div (wheel)="onScroll($event)"></div>