Я работаю над простым сценарием, который должен анимировать заданное значение (например, 6345.23
) до 0
путем обратного отсчета, оно также должно закончиться на 0
, если прошло указанное количество времени (например, 2 seconds
.
Я начал с простой логики:
- заданная конфигурация:
initial value
, time in sec
, interval
- время дается в секундах, поэтому его необходимо преобразовать в миллисекунды
- рассчитать количество тиков путем деления времени в мс на интервал
- рассчитать сумму уменьшенного значения на тик путем деления начального значения на количество тиков
как только вы узнали, что мы можем просто сделать: (простая модель, а не реальный код)
intId = setInterval(function() {
if(ticks_made === amount_of_ticks) {
clearInterval(intId);
} else {
value -= amount_per_tick;
// update view
}
}, interval);
фактический код:
var value = 212.45,
time = 2, // in seconds
interval = 20; // in milliseconds
var time_to_ms = time * 1000,
amount_of_ticks = time_to_ms / interval,
amount_per_tick = (value / amount_of_ticks).toFixed(5);
var start_time = new Date();
var ticks_made = 0;
var intId = setInterval(function() {
if(ticks_made === amount_of_ticks) {
console.log('start time', start_time);
console.log('end time', new Date());
console.log('total ticks: ', amount_of_ticks, 'decresed by tick: ', amount_per_tick);
clearInterval(intId);
} else {
value = (value - amount_per_tick).toFixed(5);
console.log('running', ticks_made, value);
}
ticks_made++;
}, interval);
Link do fiddle (в консоли вы можете наблюдать, как это работает)
Если вы установите время на 2 (2 seconds)
, то это нормально, но если вы установите время, например, 2.55 (2.55 seconds)
, оно вообще не остановится на 0
, оно будет проходить и идти бесконечно в отрицательных значениях.
Как я могу это исправить, независимо от того, что установлено в секундах, оно всегда идет точно по одному, пока не достигнет идеального значения 0
?
var value = 212.45,
time = 2, // in seconds
interval = 20; // in milliseconds
var time_to_ms = time * 1000,
amount_of_ticks = time_to_ms / interval,
amount_per_tick = (value / amount_of_ticks).toFixed(5);
var start_time = new Date();
var ticks_made = 0;
var intId = setInterval(function() {
if(ticks_made === amount_of_ticks) {
console.log('start time', start_time);
console.log('end time', new Date());
console.log('total ticks: ', amount_of_ticks, 'decresed by tick: ', amount_per_tick);
clearInterval(intId);
} else {
value = (value - amount_per_tick).toFixed(5);
console.log('running', ticks_made, value);
}
ticks_made++;
}, interval);