Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная 1-8.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
766 Кб
Скачать
☆

Структура анимации

У анимации есть три основных параметра:

delay

Время между кадрами (в миллисекундах, т.е. 1/1000 секунды). Например, 10мс.

duration

Общее время, которое должна длиться анимация, в мс. Например, 1000мс.

step(progress)

Функция step(progress) занимается отрисовкой состояния анимации, соответствующего времени progress.

Каждый кадр выполняется, сколько времени прошло: progress = (now-start)/duration. Значениеprogress меняется от 0 в начале анимации до 1 в конце. Так как вычисления с дробными числами не всегда точны, то в конце оно может быть даже немного больше 1. В этом случае мы уменьшаем его до 1 и завершаем анимацию.

Создадим функцию animate, которая получает объект со свойствами delay, duration, step и выполняет анимацию.

01

function animate(opts) {

02

   

03

  var start = new Date; // сохранить время начала

04

 

05

  var timer = setInterval(function() {

06

 

07

    // вычислить сколько времени прошло

08

    var progress = (new Date - start) / opts.duration;

09

    if (progress > 1) progress = 1;

10

 

11

    // отрисовать анимацию

12

    opts.step(progress);

13

     

14

    if (progress == 1) clearInterval(timer); // конец :)

15

      

16

  }, opts.delay || 10); // по умолчанию кадр каждые 10мс

17

 

18

}

Пример

Анимируем ширину элемента width от 0 до 100%, используя нашу функцию:

1

function stretch(elem) {

2

  animate({

3

    duration: 1000, // время на анимацию 1000 мс

4

    step: function(progress) {

5

      elem.style.width = progress*100 + '%';

6

    }

7

  });

8

}

Кликните для демонстрации: Открыть в новом окне

Функция step может получать дополнительные параметры анимации из opts (через this) или через замыкание.

Следующий пример использует параметр to из замыкания для анимации бегунка:

01

function move(elem) {

02

  var to = 500;

03

 

04

  animate({

05

    duration: 1000,

06

    step: function(progress) {

07

      // progress меняется от 0 до 1, left от 0px до 500px

08

      elem.style.left = to*progress + "px";

09

    }

10

  });

11

 

12

}

Кликните для демонстрации: Открыть в новом окне