К сожалению, если ваш HTML содержит много элементов и изображений, операция прокрутки становится очень сложной для браузера, поскольку ему необходимо рисовать области и слои, которые были скрыты за пределами области просмотра, поэтому анимация прокрутки может быть не плавной.

Для таких ситуаций я реализую прокрутку, имея прокручиваемый контейнер с моими экранами и просто переводя его вертикально, например:

container.style.transform = `translateY(-${targetScreenTop}px)`

Конечно, чтобы иметь настоящую анимацию, стиль контейнера должен иметь:

container.style.transition = `transform ${duration}s ease`

Или просто добавьте его в свой CSS со всеми префиксами.

Насколько я знаю, в этом сценарии вместо перерисовки DOM при каждом событии прокрутки браузер будет преобразовывать все это в текстуру, а GPU будет делать свое дело красиво и плавно.