
Библиотека Scriptaculous содержит массу красивых и полезных эффектов, которые удобно использовать в web приложениях. О некоторых из них я уже писал в предыдущих статьях (например, Подсветка элементов web страницы и Использование Scriptaculous для изменения прозрачности элементов web страницы). Любой из этих эффектов представляет ценность сам по себе, но только использование их комбинаций позволяет раскрыть возможности библиотеки в полной мере.
В этой статье я расскажу, как создавать группы из нескольких эффектов и управлять их выполнением.
Прежде всего, немного теории. Scriptaculous позволяет применить несколько эффектов к одному и тому же блоку web страницы двумя способами:
1) последовательно (эффекты будут применяться по очереди);
2) параллельно (т.е. все выбранные эффекты будут работать одновременно).
Рассмотрим небольшой пример. Допустим, у нас есть web страница с текстовым блоком, к которому мы хотим применить два эффекта:
1) подсветки (Highlight);
2) и перемещения (MoveBy).
Разметка страницы предельно простая:
<body> <div id="textBlock">…</div> <p><input type="button" id="runParallel" value="запустить параллельно" onclick="runParallel()" /></p> <p><input type="button" id="runSerial" value="запустить последовательно" onclick="runSerial()" /></p> </body>
Как видите, страницы содержит один блок (textBlock) и две кнопки, нажатия на которые вызывают javascript функции runParallel() и runSerial(). Эти функции будут запускать наши эффекты параллельно и последовательно.
Теперь представим, что мы написали такой код:
new Effect.Highlight('textBlock', {startcolor:"#DFDC00", endcolor:"#FFFFFF", duration: 2});
new Effect.MoveBy('textBlock', 0, 100, {duration: 2});
Как вы думаете, в каком порядке они будут выполнены?
Правильный ответ: “В большинстве случаев параллельно”. Почему в “большинстве случаев”? Потому что, если мы не задали последовательность выполнения явно, то она может зависеть от браузера.
Отсюда простой вывод: “Если используете несколько эффектов, всегда указывайте, в каком порядке их выполнять”.
Параллельное выполнение эффектов
Гарантировать одновременное выполнение эффектов можно с помощью метода Parallel, который создает контейнер для эффектов. В первом параметре этого метода нужно указать все эффекты, которые мы хотим применить, причем в параметры каждого эффекта обязательно добавьте sync: true, а также уберите duration.
Во втором параметре метода передается массив с настройками. Вот здесь и нужно задавать время работы эффектов.
В результате наша функция runParallel() будет выглядеть следующим образом:
function runParallel() {
new Effect.Parallel(
[
new Effect.Highlight('textBlock', {startcolor:"#DFDC00",
endcolor:"#FFFFFF", sync: true}),
new Effect.MoveBy('textBlock', 0, 100, {sync: true})
],
{duration: 2}
);
}
Последовательное выполнение эффектов
Тут тоже ничего сложного. Нужно создать очередь (queue) и добавить в нее эффекты.
Создается очередь с помощью параметра queue в настройках эффекта. В качестве значения этому параметру нужно передать массив из двух элементов: position и scope.
1) position – указывает куда будет вставлен данный эффект. Может принимать два значения: end (эффект будет вставлен в конец очереди) и front (в начало).
2) scope – задает название очереди. С его помощью можно создать несколько очередей с эффектами.
Теперь посмотрим наш пример:
function runSerial() {
new Effect.Highlight('textBlock', {startcolor:"#DFDC00",
endcolor:"#FFFFFF", duration: 2,
queue: {position: 'end', scope: 'myqueue'}});
new Effect.MoveBy('textBlock', 0, 100, {duration: 2,
queue: {position: 'end', scope: 'myqueue'}});
}
Как видите, мы создали очередь под названием myqueue и добавили в ее конец оба наших эффекта.
При добавлении эффекта в конец очереди предыдущие эффекты смещаются вперед. Поэтому в нашем случае сначала блок будет подсвечен, а затем, перемещен.
Если изменить значения параметра position на front, то эффекты будут выполнены в обратном порядке.
Естественно, никто не ограничивает вас двумя эффектами. Вы можете использовать практически любое количество встроенных эффектов в различных сочетаниях для получения нужного результата.
Если что-то не получилось, скачайте архив с файлами примера.
Постовой
Не нужно запускать болезнь. Главное помнить, что профилактика болезней гораздо лучше чем их лечение.


