Ho un elenco, con overflow-xe overflow-yimpostato 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-xo overflow-yper hiddenquando 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?