requestAnimationFrame, применяется также как и таймеры, есть функция-стартер и есть функция-интерполятор. стартер запускает интерполятор, а интерполятор запускает сам себя, пока анимация не исчерпается, т.е. пока заданное время анимации не иссякнет, все это контролится внутри интерполятора и вручную писать такое долго и можно горбатым стать. чем больше пишешь, тем быстрее горб растёт😅