如何进行滚动事件?

Nat*_*ael 30 html css scrollbar typescript angular

我需要从溢出的div中获取滚动事件:在我的Angular 2应用程序中滚动.

似乎onscroll事件不适用于Angular 2.

我怎么能实现这一目标?

Gün*_*uer 85

// @HostListener('scroll', ['$event']) // for scroll events of the current element
@HostListener('window:scroll', ['$event']) // for window scroll events
onScroll(event) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

要么

<div (scroll)="onScroll($event)"></div>
Run Code Online (Sandbox Code Playgroud)


Tho*_*ber 31

对于角4,工作溶液是在组件内部进行的

@HostListener('window:scroll', ['$event']) onScrollEvent($event){
  console.log($event);
  console.log("scrolling");
} 
Run Code Online (Sandbox Code Playgroud)


Uli*_*lko 22

你可以使用@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;
}
Run Code Online (Sandbox Code Playgroud)

  • @StackUnderflow 啊,当然,这是有道理的。没想到这一点。聪明的! (2认同)

met*_*bic 13

@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());
Run Code Online (Sandbox Code Playgroud)


kod*_*bot 10

监听window:scroll窗口/文档级别滚动的scroll事件和元素级别滚动的元素事件.

窗口:滚动

@HostListener('window:scroll', ['$event'])
onWindowScroll($event) {

}
Run Code Online (Sandbox Code Playgroud)

要么

<div (window:scroll)="onWindowScroll($event)">
Run Code Online (Sandbox Code Playgroud)

滚动

@HostListener('scroll', ['$event'])
onElementScroll($event) {

}
Run Code Online (Sandbox Code Playgroud)

要么

<div (scroll)="onElementScroll($event)">
Run Code Online (Sandbox Code Playgroud)

@HostListener('scroll', ['$event']) 如果主机元素本身不可滚动,则无效.

例子