Начнем с простой анимации jQuery
Если у вас есть опыт работы с jQuery, то вы легко
реализуете анимацию. В примере происходит перемещение ‘точки’ слева
направо с использованием функции animate():
1 | $( "#ball" ).stop( true ).animate({left:500}, 1000).animate({left:0}, 1000); |
Результат:
Для создания круга используется CSS3 (Пользователи IE будут видеть квадрат!):
06 | -moz-border-radius: 40px ; |
07 | -webkit-border-radius: 40px ; |
Скучно? Движение тени
jQuery или даже CSS3 не имеют встроенных эффектов или свойств для
создания теней (имеются ввиду ситуации с более чем одна тень для
объекта). Может ли jQuery сделать что-то наподобие такого?
Конечно! jQuery может создать такой эффект. Трюк заключается в
следующем: создадим несколько изображений, затем сделаем так, что они
будут следовать за первой анимацией и затухать… Нет, не так. Давайте
посмотрим на пример выше. В jQuery есть функция clone().
Метод .clone() - это удобный способ клонировать элементы на странице.
Используя данный метод, вы можете сделать множество копий определенного
элемента. Заметьте, что нет смысла создавать копии элементов HTML с
одинаковым атрибутом ID. Лучше использовать имя класса для элементов.
Однако это не означает, что нет способа дублировать элементы по ID.
В данном случае, мы удаляем ID и устанавливаем имя для атрибута класса (создайте стиль css для нового имени класса):
1 | $( "#ball" ).clone().removeAttr( "id" ).attr({class: "ball" }) |
Пытаемся дублировать круг в соответствующие номера. Однако движение
зависит от скорости основного элемента. Вот как мы будем контролировать
дублированный элемент по времени. Если движение происходит быстро, мы
будем дублировать его быстро, если движение происходит медленно, нужно
будет дублировать один или два кадра… Нужно использовать jQuery Timer для таких фокусов.
В каждую единицу времени мы делаем только одну копию.
01 | $( "#ball" ).everyTime(80, function () { |
03 | $( "#ball" ).clone().removeAttr( "id" ).attr({class: "ball" }) |
05 | .everyTime(480, function () { |
11 | $( "#ball" ).stop( true ).animate({left:500}, 1000) |
12 | .animate({left:0}, 1000, function (){ |
14 | $( "#ball" ).stopTime(); |
Выше приведенный код делает одну копию каждые 80 миллисекунд. Но
если не прервать метод clone, то можно наделать достаточно кругов для
Олимпийских игр на 100 лет. В каждом everyTime(), мы снова вызываем
данные метод, но уже ограничиваем его 480 миллисекунд для удаления
дубликата. Подсчитаем, у нас есть 6*(480/80) копий, которые следуют за
основным элементом.
Результат:
Почти все. Добавим эффект затухания.
01 | $( "#ball" ).everyTime(80, function () { |
03 | $( this ).animate({left:500}, 1000).animate({left:0}, 1000); |
05 | $( this ).clone().removeAttr( "id" ).attr({class: "ball" }) |
06 | .appendTo( "#demo" ).fadeOut(480, function () { |
Результат:
Для контролирования времени дублирования вы также может использовать window.setInterval(), чтобы заменить метод Time().
Скучно? А вот эффект для индикации загрузки AJAX!
Результат:
10 | centerX = $( '#demo4' ).width()/4+20; |
11 | centerY = $( '#demo4' ).height()/2; |
14 | $( "#ball4" ).everyTime(1, function (){ |
20 | var eSin = Math.sin(deg*Math.PI/180); |
21 | var eCos = Math.cos(deg*Math.PI/180); |
32 | $( "#ball4" ).everyTime(80, function () { |
33 | $( this ).clone().removeAttr( "id" ).attr({ "class" : "ball" }) |
34 | .appendTo( "#demo4" ).fadeOut(800, function () { |
Ошибка?
Анимация не работает? Используете Windows? Да, нужно признать наличие
ошибки использования процессора. Сверхъестественным образом она
проявляется только на Windows, даже при использовании ПК с 8Gbs памяти
(Windows 7) и на Windows Vista. Однако анимация работает отлично на
Mac OS. Если вы пользователь Windows и вам не посчастливилось увидеть
демонстрацию, то ниже приведен скриншот с Mac OS.
Вот и все!
Данный эффект может быть использован для любой анимации, если вы
хотите использовать движущуюся тень (как такой эффект правильно
называется, кстати?). В уроке предложена только идея такой анимации с
использованием jQuery.