Вроде справился
train.style.left = 0;
let currentPosition = parseInt(train.style.left, 10),
distance = 500,
movingTime = 4000;
train.onclick = function() {
animate(function(timePassed) {
train.style.left = timePassed * (distance / movingTime) + 'px';
currentPosition = parseInt(train.style.left, 10);
});
};
function animate(draw) {
var start = performance.now();
requestAnimationFrame(function animate(time) {
var timePassed = time - start;
// if (timePassed > duration) {
// timePassed = duration;
// }
draw(timePassed);
if (currentPosition < distance) {
requestAnimationFrame(animate);
}
});
}
Не уверен насчет проверяющего условия, нужно ли там где то использовать время.
И еще закомментированный код из примера, не совсем понимаю зачем он нужен.