Дизайнеры любят использовать анимационный эффект изменения прозрачности, заставляя элементы приложения возникать из ниоткуда (Fade Id) или исчезать в никуда (Fade Out).
Задача Чтобы fade-анимация не ставила в тупик JavaScript-разработчиков принято решение написать небольшое руководство как это сделать малой кровью, не подключая громоздкие js-фреймворки. Что нам необходимо:
Знать как кроссбраузерно задавать прозрачность
Сделать таймер, чтобы работала анимация
Первая задача (наиболее трудоемкая), к счастью, успешно решена Игорем Цыгырлашем в статье CSS прозрачность (css opacity, javascript opacity). Там же есть небольшой черный ящик в виде библиотеки для плавного изменения прозрачности элементов, но мне она не приглянулась из-за нескольких минусов.
Объект
Итак, после некоторой переработки кода с tigir.com и на основе собственной практики написания фейд-эффектов получилась такая библиотечка:
var fade = { // Namespace
step : 0.05,
delay : 20, // ms
timer : null,
setOpacity : function(elem, nOpacity) {
if (typeof elem == 'string') elem = document.getElementById(elem);
var props = ['MozOpacity', 'KhtmlOpacity', 'opacity'];
for (var i in props) {
if (typeof elem.style[props[i]] == 'string') {
elem.style[props[i]] = nOpacity;
return;
}
}
// IE 6+
try {
nOpacity = 100 * parseFloat(nOpacity);
if ((oAlpha = elem.filters['DXImageTransform.Microsoft.alpha'] || elem.filters.alpha)) oAlpha.opacity = nOpacity;
else elem.style.filter += "progid:DXImageTransform.Microsoft.Alpha(opacity="+nOpacity+")";
} catch (e) {
// IE <= 5.5 OR Opera < 9 OR another browser. Do nothing
}
},
_out : function(id, from, to, callback) {
from -= this.step;
from = from <= to ? to : from;
if (this.doit(id, from, to, callback))
this.timer = setTimeout("fade._out('"+id+"', "+from+", "+to+", '"+(callback ? callback : '')+"')", this.delay);
},
_in : function(id, from, to, callback) {
from += this.step;
from = from >= to ? to : from;
if (this.doit(id, from, to, callback))
this.timer = setTimeout("fade._in('"+id+"', "+from+", "+to+", '"+(callback ? callback : '')+"')", this.delay);
},
doit : function(id, from, to, callback) {
this.setOpacity(id, from);
clearTimeout(this.timer);
if (from == to) {
if (callback) eval(callback+'()');
} else return true;
}
}
Сразу же смотрим скрипт в работе!
Разберем немного сам объект:
fade — это неймспейс, введен исключительно для того, чтобы не было случайного пересечения глобально объявленных переменных или функций с уже имеющимся на вашем сайте кодом.
setOpacity — самый главный метод объекта fade, который и задает прозрачность элемента. В качестве первого аргумента принимает ссылку на элемент или его идентификатор. Второй аргумент — значение прозрачности, которое необходимо установить. Метод появился на свет благодаря функциям getOpacityProperty и setOpacityProperty с tigir.com
_in и _out — методы для анимации появления и исчезновения соот-но. Принимают в качестве аргументов идентификатор элемента, значения "от" и "до" и функцию обратного вызова (необязательный аргумент). В приводимом выше примере у кнопки следующий обработчик клика:
fade._out('imgId', 1, 0, 'stopHide');
Читается так: "необходимо уменьшать прозрачность элемента с идентификатором 'imgId' от еденицы до нуля и после достижению нуля вызвать функцию с именем 'stopHide'". Так оно и работает.
Важно! Все аргументы кроме последнего являются обязательными.
Изменение прозрачности происходит пошагово и его скорость регулируется двумя свойствами: step — шаг между двумя изменениями и delay — задержка между итерациями. Изменяйте их для увеличения или снижения скорости анимации.
Что нового в коде по сравнению с примером Игоря Цыгырлаша? Во-первых оптимизированный метод setOpacity, но это только технически, ничего принципиально нового там нет. А во-вторых, добавлены колбэки, необходимость которых возникала в каждом случае практического применения описанных эффектов.
Да, и еще, такая простая структура объекта может подойти для любой другой анимации. Можно добавить метод плавно уменьшающий высоту объекта — и еще один эффект готов.
Проверено в:
WIN: IE6, IE7, FF1.5+, Safari 3, Opera 9+, Chrome
Точно не будет работать в ИЕ5.5 (и ниже) и в Операх ниже девятой версии.
Александр Бурцев 5 ноября 2008
© Все права на данную статью принадлежат порталу fastcoder.org. Перепечатка в интернет-изданиях разрешается только с указанием автора и прямой ссылки на оригинальную статью. Перепечатка в печатных изданиях допускается только с разрешения редакции.