У меня была та же проблема, и с помощью других постов я остановил эти 2 метода.
scrollLeft(el: Element) {
const animTimeMs = 400;
const pixelsToMove = 315;
const stepArray = [0.001, 0.021, 0.136, 0.341, 0.341, 0.136, 0.021, 0.001];
interval(animTimeMs / 8)
.pipe(
takeWhile(value => value < 8),
tap(value => el.scrollLeft -= (pixelsToMove * stepArray[value])),
)
.subscribe();
}
scrollRight(el: Element) {
const animTimeMs = 400;
const pixelsToMove = 315;
const stepArray = [0.001, 0.021, 0.136, 0.341, 0.341, 0.136, 0.021, 0.001];
interval(animTimeMs / 8)
.pipe(
takeWhile(value => value < 8),
tap(value => el.scrollLeft += (pixelsToMove * stepArray[value])),
)
.subscribe();
}
Они используют реактивные операции для постепенного изменения левой позиции прокрутки.
Может быть, попробуйте поиграться с числами, этот подход соответствует моим потребностям, с парой твиков, которые могут соответствовать вашим.
Вы можете вызвать их по событию (click)
, передав ссылку в ваш список (контейнер с горизонтальной прокруткой)
<div class="horizontal-scroll" #list>...</div>
<button (click)="scrollLeft(list)">Left</button>