Привет!
Сейчас давайте рассмотрим работу, пожалуй одной из самых распространённых библиотек для javascript - scriptaculous.
Scriptaculous надстройка над другим фреймворком - prototypejs.
Она состоит из частей:
Сейчас же я покажу как работать с эффектами, вернее не работать, а как создать собственный эффект.
Но сначала пару слов об эффектах, ну то есть немного теории.
Все эффекты наследуются от Effect.Base.
Наследуемый эффект может определить 3 необязательных метода:
Сейчас перейдём от теории к практике. Сделаем свой эффект.
Сейчас давайте рассмотрим работу, пожалуй одной из самых распространённых библиотек для javascript - scriptaculous.
Scriptaculous надстройка над другим фреймворком - prototypejs.
Она состоит из частей:
- Effects - включает различные эффекты и также помощники.
- Behaviours - это drag, drop, sort, и работа с формами.
- Controls - аякс и автокомлитеры
- Miscellaneous - это "другое" или остальное, сюда входят тесты (unit testing), звук (sound), создание элементов и узлов из элементов (builder)
Сейчас же я покажу как работать с эффектами, вернее не работать, а как создать собственный эффект.
Но сначала пару слов об эффектах, ну то есть немного теории.
Все эффекты наследуются от Effect.Base.
Наследуемый эффект может определить 3 необязательных метода:
- setup() - этот метод вызывается до начала выполнения эффекта, и делает необходимые настройки, например там можно определить, некоторые нужные переменные, и так далее.
- update(pos) - вызывается для каждой итерации. Аргумент pos - это текуший кадр.
- finish() - вызовется после выполнения эффектов.
Сейчас перейдём от теории к практике. Сделаем свой эффект.
Effect.MyEffect = Class.create(Effect.Base, {
/*
initialize - метод-конструктор для эффекта, принимает аргументы<
element - это id элемента.
setting - необязателен, я его упомянул для того, чтобы показать, что он есть, это также дополнительные настройки, которые могу использоваться в вашем эффекте.
*/
initialize: function(element, setting)
{
this.element = $(element);
//бросаем исключение, если элемент не найден.
if(!this.element) throw(Effect._elementDoesNotExistError);
this.start(setting);
},
setup: function()
{
Effect.tagifyText(this.element); //разбиваем элемент
this.letters = this.element.select('span');
},
update: function(position)
{
var F = position < 0.5 ? 2*position: 2*(1-position);
var f_pos;
var s_pos;
this.letters.collect(function(letter, j){
f_pos = Math.sin(position)*15*F;
s_pos = - f_pos;
if(j%2==0)
letter.setStyle({top: Math.round(f_pos) + 'px'});
else
letter.setStyle({top: Math.round(s_pos) + 'px'});
});
}
});
Вот и всё! Эффект готов.
Для примера, этот эффект принимает id элемента, например, заголовка
<h1>Lorem ipsum dolore</h1>
Но также можно передать и Id параграфа, тогда будет веселее.
А сейчас более подробно.
В методе-конструкторе мы принимает id, и оборачиваем его $(), если элемент не найден будем бросать исключение.
В методе setup, с помощью tagifyText, мы оборачиваем каждую букву элемента в span. Затем мы просто отбираем все элементы.
Как и говорилось в update() вся магия, но суть в чём, если чётное в одну сторону, если нет, то в другую. Формула, которая я использовал, не несёт в себе какой-либо смысловой нагрузки, поэтому понять не пытайтесь. (Хотя на самом деле это простая формула синуса). Затем мы на полученых значениях сдвигаем либо вверх, либо вниз отобранные span'ы.
Вот и всё. Просто же.
живой бы пример... хотя бы на том самом pastehtml.com
ОтветитьУдалитьhttp://jsfiddle.net/gWERx/
УдалитьСделал, также немного доработал, чтобы эффект был виден, потому что при первом разе его можно и не заметить.