По сути, вы можете прослушивать событие прокрутки окна с Angular, используя HostListener с событием window:scroll
, например:
@HostListener('window:scroll', ['$event'])
onWindowScroll() {
// handle scrolling event here
}
Доступен Пример StackBlitz для объяснения ниже
ScrolledTo директива
Что бы я сделал для максимальной гибкости в этом случае, - это создать директиву для применения к любому элементу HTML, который предоставил бы два состояния:
- достигается :
true
, когда позиция прокрутки достигает вершины элемента, к которому применяется директива
- пройдено :
true
когда позиция прокрутки прошла высоту элемента, к которой применяется директива
import { Directive, ElementRef, HostListener } from '@angular/core';
@Directive({
selector: '[scrolledTo]',
exportAs: 'scrolledTo', // allows directive to be targeted by a template reference variable
})
export class ScrolledToDirective {
reached = false;
passed = false;
constructor(public el: ElementRef) { }
@HostListener('window:scroll', ['$event'])
onWindowScroll() {
const elementPosition = this.el.nativeElement.offsetTop;
const elementHeight = this.el.nativeElement.clientHeight;
const scrollPosition = window.pageYOffset;
// set `true` when scrolling has reached current element
this.reached = scrollPosition >= elementPosition;
// set `true` when scrolling has passed current element height
this.passed = scrollPosition >= (elementPosition + elementHeight);
}
}
Назначение классов CSS
Используя переменную ссылки на шаблон , вы сможете получить эти состояния, определяющие директиву export #myTemplateRef="scrolledTo"
, в своем HTML-коде и применять классы CSS по своему усмотрению в соответствии с возвращаемыми значениями.
<div scrolledTo #scrolledToElement="scrolledTo">
<!-- whatever HTML content -->
</div>
<div
[class.reached]="scrolledToElement.reached"
[class.passed]="scrolledToElement.passed">
<!-- whatever HTML content -->
</div>
Таким образом, вы можете назначать классы другим HTML-элементам или самому элементу spied ... практически так, как вы хотите, в зависимости от ваших потребностей!
Надеюсь, это поможет!