Ho un elenco, con overflow-x
e overflow-y
impostato su auto
. Inoltre, ho impostato lo scorrimento del momento, quindi lo scorrimento del tocco funziona bene nei dispositivi mobili, usando webkit-overflow-scrolling: true
.
Il problema, tuttavia, è che non riesco a capire come disabilitare lo scorrimento orizzontale quando si scorre verticalmente. Porta a un'esperienza utente davvero negativa, poiché lo scorrimento in alto a sinistra o in alto a destra farà scorrere diagonalmente la tabella. Quando l'utente scorre in verticale, NON voglio assolutamente scorrere in orizzontale fino a quando l'utente non smette di scorrere in verticale.
Ho provato quanto segue:
JS:
offsetX: number;
offsetY: number;
isScrollingHorizontally = false;
isScrollingVertically = false;
//Detect the scrolling events
ngOnInit() {
this.scrollListener = this.renderer.listen(
this.taskRows.nativeElement,
'scroll',
evt => {
this.didScroll();
}
);
fromEvent(this.taskRows.nativeElement, 'scroll')
.pipe(
debounceTime(100),
takeUntil(this.destroy$)
)
.subscribe(() => {
this.endScroll();
});
}
didScroll() {
if ((this.taskRows.nativeElement.scrollLeft != this.offsetX) && (!this.isScrollingHorizontally)){
console.log("Scrolling horizontally")
this.isScrollingHorizontally = true;
this.isScrollingVertically = false;
this.changeDetectorRef.markForCheck();
}else if ((this.taskRows.nativeElement.scrollTop != this.offsetY) && (!this.isScrollingVertically)) {
console.log("Scrolling Vertically")
this.isScrollingHorizontally = false;
this.isScrollingVertically = true;
this.changeDetectorRef.markForCheck();
}
}
endScroll() {
console.log("Ended scroll")
this.isScrollingVertically = false;
this.isScrollingHorizontally = false;
this.changeDetectorRef.markForCheck();
}
HTML:
<div
class="cu-dashboard-table__scroll"
[class.cu-dashboard-table__scroll_disable-x]="isScrollingVertically"
[class.cu-dashboard-table__scroll_disable-y]="isScrollingHorizontally"
>
CSS:
&__scroll {
display: flex;
width: 100%;
height: 100%;
overflow-y: auto;
overflow-x: auto;
will-change: transform;
-webkit-overflow-scrolling: touch;
&_disable-x {
overflow-x: hidden;
}
&_disable-y {
overflow-y: hidden;
}
}
Ma l'ho impostato ogni volta overflow-x
o overflow-y
per hidden
quando il suo stato fatto scorrere, lo scorrimento sarà tentennamenti e saltare di nuovo verso l'alto. Ho anche notato che questo webkit-overflow-scrolling: true
è il motivo per cui questo si verifica, quando lo rimuovo, il comportamento sembra arrestarsi, ma ne ho assolutamente bisogno per lo scorrimento del momento nei dispositivi mobili.
Come disabilitare lo scorrimento orizzontale quando si scorre verticalmente?