Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | 2x 2x 2x 2x 1x 1x | import { ChangeDetectionStrategy, Component, HostListener } from '@angular/core';
@Component({
selector: 'ish-back-to-top',
templateUrl: './back-to-top.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class BackToTopComponent {
/**
* @description
* Button will not show if window.scrollY is less than MARGIN_TOP.
* Should be any desired value > 0
*/
private static readonly MARGIN_TOP = 50;
/**
* @description
* Button will show if user has scrolled at least SCROLL_MIN upwards.
* If set to 0 the button will show as soon as user scrolls upwards
*/
private static readonly SCROLL_MIN = 50;
isVisible = false;
private previousOffset = 0;
jump() {
window.scrollTo(0, 0);
}
private hide() {
this.isVisible = false;
}
private show() {
this.isVisible = true;
}
private updateOffset() {
this.previousOffset = window.scrollY;
}
@HostListener('window:scroll') onWindowScroll() {
const diff = this.previousOffset - window.scrollY;
const scrollsDown = diff < 0;
const isAtTop = window.scrollY < BackToTopComponent.MARGIN_TOP;
const hasEnoughIntention = diff > BackToTopComponent.SCROLL_MIN;
if (scrollsDown || isAtTop) {
this.updateOffset();
this.hide();
} else if (!this.isVisible && !hasEnoughIntention) {
this.hide();
} else {
this.updateOffset();
this.show();
}
}
}
|