gpt4 book ai didi

Angular,检测当前屏幕在哪个元素上滑动

转载 作者:行者123 更新时间:2023-12-02 03:02:57 27 4
gpt4 key购买 nike

Angular @HostListener 可以检测鼠标移动。但我希望能够识别我滑动的元素的间隔。

例如:

组件:

 @HostListener('window:scroll', ['$event']) 
onScroll(event) {
console.log(event);
//When the mouse is scrolled, identify which element is currently displayed on the browser window, A or B or C
//element A,B,C height is not fixed
}

CSS:

#a,#b,#c {
width: 100%;
}

html:

<body>
<div id="a" (scroll)="onScroll($event)">
Block A
.
.
(more element)
</div>
<div id="b" (scroll)="onScroll($event)">
Block B
.
.
(more element)
</div>
<div id="c" (scroll)="onScroll($event)">
Block C
.
.
(more element)
</div>
</body>

我尝试查看 event 参数,但它是一个相当大的对象,我无法找到不同元素之间的差异:

enter image description here

最佳答案

event.target 对象应包含区分这些 block 所需的所有内容,因为它是对调度事件的对象的引用

console.log(event.target.id) // a, b or c

<强> Ng-run Example

更新

为了确定当前显示的是哪个全高 div block ,您可以做一些数学运算,例如:

areas = ['a', 'b', 'c']

@HostListener('window:scroll', ['$event'])
onScroll(event) {
const activeElem = this.areas[
Math.floor(window.pageYOffset/ document.documentElement.clientHeight)
];
console.log(activeElem);
}

请注意,您不需要将事件处理程序添加到 block 中:

<div id="..." (scroll)="onScroll($event)">
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
remove this

<强> Ng-run Example

更新2

如果部分的高度不固定,那么您可以使用 ViewChildren 获取对所有部分的引用:

html

<div #a

<div #b

<div #c

ts

const areas = 'a,b,c';

class Component {
@ViewChildren(areas) sections: QueryList<ElementRef>;

然后使用一些助手检查特定部分是否在视口(viewport)内:

function isElementInViewport(el) {
var rect = el.getBoundingClientRect();

return (
rect.bottom >= 0 &&
rect.right >= 0 &&
rect.top <= (window.innerHeight || document.documentElement.clientHeight) &&
rect.left <= (window.innerWidth || document.documentElement.clientWidth)
);
}

用法:

@HostListener('window:scroll', ['$event'])
onScroll(event) {
const activeSection = this.sections.toArray()
.findIndex(section => isElementInViewport(section.nativeElement));

console.log(areas.split(',')[activeSection]);
}

<强> Ng-run Example

关于Angular,检测当前屏幕在哪个元素上滑动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59675063/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com