Анимировать N пикселей за T секунд
Здравствуйте!
Случился злобный затуп и я не могу придумать правильную формулу для корректной отрисовки определенного количества пикселей за строго заданный промежуток времени. Т.е. дано: к примеру высота элемента и время за которое ее нужно изменить. Не понятно: правильная формула для скорости изменения пикселей. Вот код взятый из учебника JavaScript.ru: <!DOCTYPE HTML> <html> <head> <style> #train { position: relative; cursor: pointer; width: 100px; height: 100px; background: red; } </style> </head> <body> <img id="train" src="https://js.cx/clipart/train.gif"> <script> train.onclick = function() { animate(500,1000); }; // Рисует функция draw // Продолжительность анимации duration function animate(length,duration) { var start = performance.now(); requestAnimationFrame(function animate(time) { // определить, сколько прошло времени с начала анимации var timePassed = time - start; console.log(time, start) // возможно небольшое превышение времени, в этом случае зафиксировать конец if (timePassed > duration) timePassed = duration; draw(timePassed, length); // если время анимации не закончилось - запланировать ещё кадр if (timePassed < duration) { requestAnimationFrame(animate); } }); } // нарисовать состояние анимации в момент timePassed function draw(timePassed, length) { var current = timePassed / 5; if(current < length) { train.style.height = current + 'px'; } }; </script> </body> По умолчанию скорость можно отрегулировать вот тут: var current = timePassed / 5; Но какой должна быть формула я не могу понять. Пробовал подставлять разные значения на угад и в итоге ничего хорошего не получилось. Знатоки, подскажите пожалуйста!:-? |
Цитата:
Т.е. не факт, что твоя задача решаема. Если ты начнешь "бить" временной промежуток на некие таймауты, ты в сумме рискуешь получить интервал больше заданного. |
Да, но это значение не так велико и решается жесткой установкой стиля результирующего вида в конце всех итераций таймера.
Мне нужнее формула. Проблему опичанную вами я знаю как решить. Цитата:
|
Решено.
Спасибо чуваку: https://www.viget.com/articles/time-based-animation train.onclick = function() { animate(500,1000); }; // Рисует функция draw // Продолжительность анимации duration function animate(length,duration) { var start = performance.now(); var v = length / duration; requestAnimationFrame(function animate(time) { // определить, сколько прошло времени с начала анимации var timePassed = time - start; // возможно небольшое превышение времени, в этом случае зафиксировать конец if (timePassed > duration) timePassed = duration; draw(timePassed, (v * timePassed)); // если время анимации не закончилось - запланировать ещё кадр if (timePassed < duration) { requestAnimationFrame(animate); } }); } // нарисовать состояние анимации в момент timePassed function draw(timePassed, length) { train.style.height = length + 'px'; }; Вообще задача школьная, но у меня ТАКОЙ затуп :D |
Все гениальное - просто. Спасибо.
|
Часовой пояс GMT +3, время: 11:28. |