Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.11.2016, 14:11
Аватар для xShift
Профессор
Отправить личное сообщение для xShift Посмотреть профиль Найти все сообщения от xShift
 
Регистрация: 22.11.2016
Сообщений: 212

Анимировать 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;

Но какой должна быть формула я не могу понять. Пробовал подставлять разные значения на угад и в итоге ничего хорошего не получилось.

Знатоки, подскажите пожалуйста!
Ответить с цитированием
  #2 (permalink)  
Старый 29.11.2016, 14:56
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,202

Сообщение от xShift
Знатоки, подскажите пожалуйста!
JS не является ЯП в реальном времени...
Т.е. не факт, что твоя задача решаема. Если ты начнешь "бить" временной промежуток на некие таймауты, ты в сумме рискуешь получить интервал больше заданного.
Ответить с цитированием
  #3 (permalink)  
Старый 29.11.2016, 15:57
Аватар для xShift
Профессор
Отправить личное сообщение для xShift Посмотреть профиль Найти все сообщения от xShift
 
Регистрация: 22.11.2016
Сообщений: 212

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

Мне нужнее формула. Проблему опичанную вами я знаю как решить.

Сообщение от ksa Посмотреть сообщение
JS не является ЯП в реальном времени...
Т.е. не факт, что твоя задача решаема. Если ты начнешь "бить" временной промежуток на некие таймауты, ты в сумме рискуешь получить интервал больше заданного.
в Jquery она как-то решена. Но я не смог разобраться в их сырцах - слишком мудрено.
Ответить с цитированием
  #4 (permalink)  
Старый 29.11.2016, 18:32
Аватар для xShift
Профессор
Отправить личное сообщение для xShift Посмотреть профиль Найти все сообщения от xShift
 
Регистрация: 22.11.2016
Сообщений: 212

Решено.

Спасибо чуваку: 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';
    };


Вообще задача школьная, но у меня ТАКОЙ затуп
Ответить с цитированием
  #5 (permalink)  
Старый 26.12.2016, 05:34
Аватар для spo
spo spo вне форума
Профессор
Отправить личное сообщение для spo Посмотреть профиль Найти все сообщения от spo
 
Регистрация: 11.05.2011
Сообщений: 213

Все гениальное - просто. Спасибо.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
размеры пикселей canvas osetr Общие вопросы Javascript 3 27.12.2015 20:38
Анимировать на flash или js Malsim Работа 0 05.06.2013 22:20
Запуск скрипта через 5 секунд Marakaya Events/DOM/Window 18 06.05.2013 03:29
Смена картинки по наведению курсора мыши 5 секунд MironM Общие вопросы Javascript 22 27.09.2011 16:39
переход по ссылке через N секунд jerryfish Events/DOM/Window 4 23.02.2010 17:05