如何检测滚动到 html 元素的底部
How to detect scroll to bottom of html element
我有这个元素,我通过 ID 引用它:
let infiniteScrollElement = document.getElementById('th-infinite-scroll-tracker');
我需要在浏览器到达元素底部时进行监听。
如何实现?
您可以使用跟踪容器滚动事件的可观察对象来执行此操作。
或者您可以为侦听滚动事件的组件创建主机侦听器。请看看这个。 (我还没有用主机监听器测试过它,但应该可以。)
将以下代码添加到您的组件中以获得可观察的方法(我已经从这个 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');
}
});
}
更新
另一种可能是最好的方法是为您的跟踪逻辑创建一个指令。然后就可以方便的使用HostListener
绑定滚动事件了
打字稿代码:
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>
我想你想做的就是检测滚动的位置。
@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。
您可以通过以下方式检查用户是否滚动到底部...
Html 文件
<div (scroll)="onScroll($event)">
...
...
</div>
打字稿文件
onScroll(event: any) {
// visible height + pixel scrolled >= total height
if (event.target.offsetHeight + event.target.scrollTop >= event.target.scrollHeight) {
console.log("End");
}
}
我现在正在研究这个,发现这是“me”最通用的用例。“
”
如 所述,使用主机侦听器是实现 Angular 'onScroll' 的最佳选择。但是,'Window: Scroll' 不适用于我的用例(a table 注入到 Dashboard ).所以我很幸运能做到这一点
@HostListener('scroll', ['$event.target'])
onScroll(elem){
if(( elem.offsetHeight + elem.scrollTop) >= elem.scrollHeight) {
console.log("It's Lit");
}
}'
CSS:
:host {
display: block;
max-height: 700px;
width: 100%;
overflow-y: scroll;
scroll-behavior: auto;
}
解释:
- 基本上通用 "scroll" 侦听发生在宿主元素上的滚动事件。
- 通过 $event.target 将触发滚动事件的元素引用传递给我的 onScroll(elem) 方法
- 然后我获取元素引用并确定 offsetHeight 和 ScrollTop 是否大于 scrollHeight (是的,这与其他人的实现方式不同) 参考: mVChr's Implementation
- 然后繁荣,享受。
- 注意:如果你只需要一个,我怎么强调都不为过,简单的解决方案 只需在特定元素上添加一个(滚动)事件侦听器
另外,查看 This 了解offsetHeight、clientHeight、scrollHeight。
试试这个,它会起作用
@HostListener('body:scroll', ['$event'])
我有这个元素,我通过 ID 引用它:
let infiniteScrollElement = document.getElementById('th-infinite-scroll-tracker');
我需要在浏览器到达元素底部时进行监听。
如何实现?
您可以使用跟踪容器滚动事件的可观察对象来执行此操作。
或者您可以为侦听滚动事件的组件创建主机侦听器。请看看这个
将以下代码添加到您的组件中以获得可观察的方法(我已经从这个 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');
}
});
}
更新
另一种可能是最好的方法是为您的跟踪逻辑创建一个指令。然后就可以方便的使用HostListener
绑定滚动事件了
打字稿代码:
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>
我想你想做的就是检测滚动的位置。
@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。
您可以通过以下方式检查用户是否滚动到底部...
Html 文件
<div (scroll)="onScroll($event)">
...
...
</div>
打字稿文件
onScroll(event: any) {
// visible height + pixel scrolled >= total height
if (event.target.offsetHeight + event.target.scrollTop >= event.target.scrollHeight) {
console.log("End");
}
}
我现在正在研究这个,发现这是“me”最通用的用例。“
”如
@HostListener('scroll', ['$event.target'])
onScroll(elem){
if(( elem.offsetHeight + elem.scrollTop) >= elem.scrollHeight) {
console.log("It's Lit");
}
}'
CSS:
:host {
display: block;
max-height: 700px;
width: 100%;
overflow-y: scroll;
scroll-behavior: auto;
}
解释:
- 基本上通用 "scroll" 侦听发生在宿主元素上的滚动事件。
- 通过 $event.target 将触发滚动事件的元素引用传递给我的 onScroll(elem) 方法
- 然后我获取元素引用并确定 offsetHeight 和 ScrollTop 是否大于 scrollHeight (是的,这与其他人的实现方式不同) 参考: mVChr's Implementation
- 然后繁荣,享受。
- 注意:如果你只需要一个,我怎么强调都不为过,简单的解决方案 只需在特定元素上添加一个(滚动)事件侦听器
另外,查看 This 了解offsetHeight、clientHeight、scrollHeight。
试试这个,它会起作用
@HostListener('body:scroll', ['$event'])