JavaScript. Подробное руководство, 6-е издание, стр. 241

<b>  e.style.position = &quot;relative&quot;; // Сделать относит, позиционируемым</b>

<b>  var start = (new Date()).getTime(); // Запомнить момент начала анимации ; </b>

<b>  animate()  // Запустить анимацию</b>

<b>  // Эта функция проверяет прошедшее время и изменяет координаты е.</b>

<b>  // Если анимацию пора завершать, восстанавливает первоначальное состояние </b>

<b>  // элемента е. Иначе изменяет координаты е и планирует следующий свой вызов, </b>

<b>  function animate() {</b>

<b>    var now = (new Date()).getTime(); // Получить текущее время</b>

<b>    var elapsed = now-start; // Сколько прошло времени с начала?</b>

<b>    var fraction = elapsed/time; // Доля от требуемого времени?</b>

<b>    if (fraction &lt; 1) { // Если рано завершать анимацию</b>

<b>      // Вычислить координату х элемента е как функцию от доли общего </b>

<b>      // времени анимации. Здесь используется синусоидальная функция,</b>

<b>      // а доля общего времени воспроизведения умножается на 4pi,</b>

<b>      // поэтому перемещение взад и вперед выполняется дважды,</b>

<b>      var x = distance * Math.sin(fraction*4*Math.PI);</b>

<b>      e.style.left = x + &quot;px&quot;;</b>

<b>      // Попробовать вызвать себя через 25 мсек или в конце запланированного</b>

<b>      // отрезка общего времени воспроизведения. Мы стремимся сделать</b>

<b>      // анимацию гладкой, воспроизводя ее со скоростью 40 кадров/сек.</b>

<b>      setTimeout(animate, Math.min(25, time-elapsed));</b>

<b>    }</b>

<b>    else { // Иначе анимацию пора завершать</b>

<b>      e.style.cssText = originalStyle // Восстановить первонач. стиль </b>

<b>      if (oncomplete) oncomplete(e); // Вызвать ф-цию обратного вызова</b>

<b>    }</b>

<b>  }</b>

<b>}</b>

<b>// Растворяет е от состояния полной непрозрачности до состояния полной прозрачности</b>

<b>// за указанное количество миллисекунд. Предполагается, что, когда вызывается </b>

<b>// эта функция, е полностью непрозрачен, oncomplete - необязательная функция,</b>

<b>// которая будет вызвана с элементом е в виде аргумента по завершении анимации.</b>

<b>// Если аргумент time не задан, устанавливается интервал 500 мсек.</b>

<b>// Эта функция не работает в IE, но ее можно модифицировать так, чтобы </b>

<b>// в дополнение к свойству opacity она использовала нестандартное </b>

<b>// свойство filter, реализованное в IE. </b>

<b>function fadeOut(e, oncomplete, time) {</b>

<b>  if (typeof e === &quot;string&quot;) e = document.getElementByld(e);</b>

<b>  if (!time) time = 500;</b>

<b>  // В качестве простой &quot;функции перехода&quot;, чтобы сделать анимацию немного</b>

<b>  // нелинейной, используется Math.sqrt: сначала растворение идет быстро,</b>

<b>  // а затем несколько замедляется,</b>

<b>  var ease = Math.sqrt;</b>

<b>  var start = (new Date()).getTime(); // Запомнить момент начала анимации</b>

<b>  animate(); // И запустить анимацию</b>

<b>  function animate() {</b>

<b>    var elapsed = (new Date()).getTime()-start; // Прошедшее время </b>

<b>    var fraction = elapsed/time; // Доля от общего времени</b>

<b>    if (fraction &lt; 1) { // Если не пора завершать</b>

<b>      var opacity = 1 - ease(fraction); // Вычислить непрозрачн.</b>

<b>      e.style.opacity = String(opacity); // Установить ее в e </b>

<b>      setTimeout(animate, // Запланировать очередной</b>

<b>                Math.min(25, time-elapsed)); // кадр</b>

<b>    }</b>

<b>    else { // Иначе завершить</b>

<b>      e.style.opacity = &quot;0&quot;; // Сделать е полностью прозрачным</b>

<b>      if (oncomplete) oncomplete(e); // Вызвать ф-цию обратного вызова</b>

<b>    }</b>

<b>  }</b>

<b>}</b>

Обе функции,

<b>shake()</b>
и
<b>fadeOut(),</b>
принимают необязательную функцию обратного вызова во втором аргументе. Если эта функция указана, она будет вызвана по завершении воспроизведения анимационного эффекта. Элемент, к которому применялся анимационный эффект, будет передан функции обратного вызова в виде аргумента. Следующая разметка HTML создает кнопку, для которой после щелчка на ней воспроизводится эффект встряхивания, а затем эффект растворения: