首页 文章

如何检测滚动到html元素的底部

提问于
浏览
10

我有这个我通过Id引用的元素:

let infiniteScrollElement = document.getElementById('th-infinite-scroll-tracker');

当浏览器到达元素的底部时我需要监听 .

怎么做到这一点?

3 回答

  • 12

    我认为你想要做的就是检测滚动的位置 .

    @HostListener("window:scroll", ["$event"])
    onWindowScroll() {
    //In chrome and some browser scroll is given to body tag
    let pos = (document.documentElement.scrollTop || document.body.scrollTop) + document.documentElement.offsetHeight;
    let max = document.documentElement.scrollHeight;
    // pos/max will give you the distance between scroll bottom and and bottom of screen in percentage.
     if(pos == max )   {
     //Do your action here
     }
    }
    

    另外不要忘记从@ angular / core导入HostListener .

  • 13

    您可以通过以下方式检查用户是否已滚动到底部...

    Html file

    <div (scroll)="onScroll($event)">
        ...
        ...
    </div>
    

    typescript file

    import { Component, HostListener } from '@angular/core';
        ...
        ...
    @HostListener('scroll', ['$event'])
    onScroll(event: any) {
        // visible height + pixel scrolled >= total height 
        if (event.target.offsetHeight + event.target.scrollTop >= event.target.scrollHeight) {
          console.log("End");
        }
    }
    
  • 15

    您可以使用跟踪容器滚动事件的observable来执行此操作 .

    或者,您可以为正在侦听滚动事件的组件创建主机侦听器 . 请看一下SO question . (我没有用主机监听器测试它,但这应该有效 . )

    将以下代码添加到组件中以实现可观察的方法(我已经从blog post复制了一些代码 . ):

    ngOnInit() {
        /*
         * Create the observable from an event, in this case, the window scroll event
         * then map each event so we can get a new value from it
         * i.e. over time, we are just dealing with a collection:
         * (map [e1, e2, e3, ...]) -> [t1, t2, t3, ...]
         */
        let tracker = document.getElementById('th-infinite-scroll-tracker');
    
        let windowYOffsetObservable = Observable.fromEvent(tracker, 'scroll').map(() => {
          // I don't actually care about the event, I just need to get the window offset (scroll position)
          return tracker.scrollTop;
        });
    
        // subscribe to our Observable so that for each new item, our callback runs
        // this is our event handler
        let scrollSubscription = windowYOffsetObservable.subscribe((scrollPos) => {
          let limit = tracker.scrollHeight - tracker.clientHeight;
          console.log(scrollPos, limit);
          if (scrollPos === limit) {
            alert('end reached');
          }
        });
      }
    

    Update

    另一种方式,也许最好的方法是为您的跟踪逻辑创建一个指令 . 然后,您可以轻松地使用 HostListener 绑定到scroll事件 .

    打字稿代码:

    import {
      Directive, HostListener
    }
    from '@angular/core';
    
    @Directive({
      selector: '[scrollTracker]'
    })
    export class ScrollTrackerDirective {
      @HostListener('scroll', ['$event']);
    
      onScroll(event) {
        // do tracking
        // console.log('scrolled', event.target.scrollTop);
        // Listen to click events in the component
        let tracker = event.target;
    
        let limit = tracker.scrollHeight - tracker.clientHeight;
        console.log(event.target.scrollTop, limit);
        if (event.target.scrollTop === limit) {
          alert('end reached');
        }
      }
    
      constructor() {}
    }
    

    组件中的标记(添加指令)

    <div id="th-infinite-scroll-tracker" style="overflow-y:scroll; height: 500px;" scrollTracker>
      .... your container with scrollbar ...
    </div>
    

相关问题