JavaScript. Подробное руководство, 6-е издание, стр. 241
<b> e.style.position = "relative"; // Сделать относит, позиционируемым</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 < 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 + "px";</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 === "string") e = document.getElementByld(e);</b><b> if (!time) time = 500;</b><b> // В качестве простой "функции перехода", чтобы сделать анимацию немного</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 < 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 = "0"; // Сделать е полностью прозрачным</b><b> if (oncomplete) oncomplete(e); // Вызвать ф-цию обратного вызова</b><b> }</b><b> }</b><b>}</b>Обе функции,
<b>shake()</b><b>fadeOut(),</b>