40% Анимация
Библиотека jQuery позволяет очень легко анимировать DOM-элементы, для этого предусмотрено несколько функций. Но обо всём по порядку. Начнём с простых «.hide()» и «.show()», эти два метода, соответственно, скрывают либо отображают элементы:
// скроем все картинки
$('img').hide();
// теперь вернём их на место
$('img').show();
Данные вызовы оперируют лишь CSS-атрибутом «display» и переключают его из текущего состояния в «none» и обратно. В качестве первого параметра можно задать скорость анимации, для этого можно использовать одно из зарезервированных слов «slow» или «fast», либо же указывать скорость в миллисекундах (1000 мс = 1 сек):
// медленно спускаемся с горы и… скрываем все картинки
// **slow == 600**
// **fast == 200**
$('img').hide('slow');
// теперь вернём их на место, чуть быстрее
$('img').show(400);
В таком случае исчезновение элементов будет сопровождаться изменением атрибутов «width», «height», «opacity» и прочих. В довесок к этим двум методам есть ещё метод «.toggle()», который работает как переключатель «hide → show» или «show → hide»:
// запустите пару раз
$('img').toggle();
Дальше – больше, вторым параметром в приведенных методах может быть callback-функция – она будет выполнена по окончании анимации элементов:
// скрываем все картинки
$('img').hide('slow', function(){
// опосля отображаем alert
alert("Images was hidden");
});
Анимацию таких атрибутов как «height», «width» и «opacity» видно невооружённым взглядом, в действительности же это далеко не всё. Заглянув внутрь jQuery, можно увидеть, что так же изменяются внутренние и внешние отступы – «padding» и «margin» – так что не стоит об этом забывать.
Идём дальше – у нас на очереди набор методов из семейства slide: «.slideUp()», «.slideDown()» и «.slideToggle()». Их поведение схоже с предыдущими функциями, но анимация будет затрагивать лишь высоту блоков:
// скроем все картинки
$('img').slideUp();
// теперь вернём их на место
$('img').slideDown();
// поменяем значение
$('img').slideToggle();
Прежде, чем перейти к десерту, упомяну семейство функций fade — они манипулируют лишь атрибутом «opacity»:
$('img').fadeIn() – изменяет «opacity» от 0 до предыдущего значения
$('img').fadeOut()– изменяет «opacity» от текущего до 0
$('img').fadeToggle() – переключатель между «In» и «Out»
$('img').fadeTo("slow", 0.5) – изменяет значение «opacity» до требуемого значения
А теперь самое сладкое – все эффекты анимации в jQuery крутятся вокруг метода «.animate()». Данная функция берёт один или несколько CSS-свойств элемента и изменяет их от исходного до заданного за N-ое количество итераций (количество итераций зависит от указанного времени, но не реже одной итерации в 13мс, если я правильно накопал это значение). Ну что же, от слов к делу, попробуем реализовать функции «.fadeIn()» и «.fadeout()» с помощью «.animate()» :
// fadeOut()
$('img').animate({
'opacity': 'hide'
})
// fadeIn()
$('img').animate({
'opacity': 'show'
})
Всё просто. Давайте-ка теперь усложним задачу – изменим размер блоков и прозрачность:
// значения указанных свойств будут плавно изменяться
// от текущих до заданных
$('img').animate({
'opacity': 0.5,
'height': '100px',
'width': '100px'
})
Как видите, тоже несложно. Теперь попробуем отталкиваться от текущих значений, а не задавать необходимые:
// изменяем, шаг за шагом
$('img').animate({
'opacity': '+=0.1',
'height': '+=12px',
'width': '+=20px'
})
Поигрались и хватит, пора усложнить вам жизнь. У метода «.animate()» может быть более одного параметра, и пора приступить к их разбору. Набор параметров может быть разным; приведу первый, тот, что попроще:
properties
– CSS-свойства – с этим мы уже познакомились
duration
– скорость анимации, уже упоминалась ранее, указывается в миллисекундах, или используя ключевые слова «fast» или «slow»
easing
– указываем, какую функцию будем использовать для изменения значений
complete
– функция, которая будет вызвана после окончания анимации
Из приведённых параметров нам только «easing» не встречался ранее – я его берёг для данного момента. Этот параметр указывает, какая функция будет использоваться для процесса анимации значений. Это могут быть линейные, квадратичные, кубические и любые другие функции. «Из коробки» мы можем выбрать лишь между «linear»:
и «swing»:
Заглянув в код jQuery, мы легко найдём соответствующий код:
jQuery.easing = {
linear: function( p ) {
return p;
},
swing: function( p ) {
return 0.5 - Math.cos( p * Math.PI ) / 2;
},
_default: "swing"
};
p
– коэффициент прохождения анимации, изменяется от 0 до 1.Сложно? Хотите больше и сразу? Тогда ищите easing plugin на странице http://gsgd.co.uk/sandbox/jquery/easing/, он действительно из разряда «must have».
В качестве путеводителя по easing-функциям можете использовать страничку http://easings.net/.
Но давайте вернёмся к методу «.animate()», который в качестве параметров может принимать ещё один набор параметров, который уже не будет казаться таким простым:
properties
– CSS-свойства (уже было)
options
– целый набор возможностей, часть которых уже описывалась ранее:
duration
– скорость анимацииeasing
– функция («linear» или «swing»)queue
– флаг/параметр очереди; чуть позже опишу подробнееspecialEasing
– хэш, в котором можно описать, какую именно easing-функцию следует использовать для изменения определённых параметровstep
– функция, которая будет вызвана на каждом шаге анимации для каждого CSS-свойства; о ней расскажу чуть нижеcomplete
– функция, которая будет вызвана после окончания анимацииstart
– функция, которая будет вызвана до начала анимацииprogress
– функция, которая будет вызвана на каждом шаге, но только единождый для элемента, вне зависимости от количества CSS-свойствdone
– функция, которая будет вызвана после успешного окончания анимацииfail
– функция, которая будет вызвана после неудачного окончания анимацииalways
– функция, которая будет вызвана после окончания анимации при любом исходе
Поддержка последних пяти функций добавлена в версии 1.8. Данный релиз jQuery ознаменовался глобальным рефакторингом анимации и переездом на Deferred.
// изменяем высоту и ширину
$('img').animate({
'height': '+=10px',
'width': '+=10px'
}, {
'start': () => console.log('start'),
'progress': () => console.log('progress'),
'done': () => console.log('done'),
'fail': () => console.log('fail'),
'always': () => console.log('always')
})
Результат выполнения данного кода доступен в консоли.