Make arrow rotate sensibly
This commit is contained in:
parent
ce3697de54
commit
e86a5977b0
5 changed files with 53 additions and 28 deletions
|
|
@ -6,7 +6,11 @@ export class UpArrowButton extends PageElement {
|
|||
private static readonly interval = 50;
|
||||
private timeToLive = 0;
|
||||
|
||||
public constructor(private scrollTarget: PageElement, label: string) {
|
||||
public constructor(
|
||||
private scrollTarget: PageElement,
|
||||
private turningThreshold: PageElement,
|
||||
label: string
|
||||
) {
|
||||
super(generate(label));
|
||||
|
||||
this.htmlRoot.addEventListener('click', this.scrollToTop.bind(this));
|
||||
|
|
@ -15,7 +19,6 @@ export class UpArrowButton extends PageElement {
|
|||
this.timeToLive = Math.max(0, this.timeToLive - UpArrowButton.interval);
|
||||
if (this.timeToLive == 0) {
|
||||
this.htmlRoot.style.opacity = '0';
|
||||
this.htmlRoot.style.visibility = 'hidden';
|
||||
}
|
||||
}, UpArrowButton.interval);
|
||||
}
|
||||
|
|
@ -24,19 +27,31 @@ export class UpArrowButton extends PageElement {
|
|||
this.scrollTarget.htmlRoot.addEventListener('scroll', () => {
|
||||
this.timeToLive = UpArrowButton.defaultTimeToLive;
|
||||
this.htmlRoot.style.opacity = '1';
|
||||
this.htmlRoot.style.visibility = 'visible';
|
||||
});
|
||||
|
||||
if (this.scrollTarget.htmlRoot.scrollTop == 0) {
|
||||
this.timeToLive = 0;
|
||||
this.htmlRoot.addEventListener('mouseover', () => {
|
||||
this.timeToLive = UpArrowButton.defaultTimeToLive;
|
||||
this.htmlRoot.style.opacity = '1';
|
||||
});
|
||||
|
||||
new IntersectionObserver((e) => {
|
||||
if (e[0].isIntersecting) {
|
||||
this.htmlRoot.classList.remove('down');
|
||||
} else {
|
||||
this.htmlRoot.classList.add('down');
|
||||
}
|
||||
}).observe(this.turningThreshold.htmlRoot);
|
||||
|
||||
super.initialize();
|
||||
}
|
||||
|
||||
private scrollToTop() {
|
||||
this.scrollTarget.htmlRoot.scrollTo({
|
||||
top: this.htmlRoot.classList.contains('down')
|
||||
? this.scrollTarget.htmlRoot.scrollHeight
|
||||
: 0,
|
||||
left: 0,
|
||||
behavior: 'smooth',
|
||||
});
|
||||
}
|
||||
|
||||
private scrollToTop(e: MouseEvent) {
|
||||
if (this.timeToLive > 0) {
|
||||
this.scrollTarget.htmlRoot.scrollTo({ top: 0, left: 0, behavior: 'smooth' });
|
||||
} else {
|
||||
e.preventDefault();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue