Web разработка с использованием Prototype и Scriptaculous. Управление эффектами.

26 ноября, 2007

Управление эффектами (картинка)
Библиотека Scriptaculous содержит массу красивых и полезных эффектов, которые удобно использовать в web приложениях. О некоторых из них я уже писал в предыдущих статьях (например, Подсветка элементов web страницы и Использование Scriptaculous для изменения прозрачности элементов web страницы). Любой из этих эффектов представляет ценность сам по себе, но только использование их комбинаций позволяет раскрыть возможности библиотеки в полной мере.

В этой статье я расскажу, как создавать группы из нескольких эффектов и управлять их выполнением.

Прежде всего, немного теории. Scriptaculous позволяет применить несколько эффектов к одному и тому же блоку web страницы двумя способами:
1) последовательно (эффекты будут применяться по очереди);
2) параллельно (т.е. все выбранные эффекты будут работать одновременно).

Рассмотрим небольшой пример. Допустим, у нас есть web страница с текстовым блоком, к которому мы хотим применить два эффекта:
1) подсветки (Highlight);
2) и перемещения (MoveBy).

Разметка страницы предельно простая:

  1. <body>
  2. <div id="textBlock"></div>
  3. <p><input type="button" id="runParallel" value="запустить параллельно" onclick="runParallel()" /></p>
  4. <p><input type="button" id="runSerial" value="запустить последовательно" onclick="runSerial()" /></p>
  5. </body>

Как видите, страницы содержит один блок (textBlock) и две кнопки, нажатия на которые вызывают javascript функции runParallel() и runSerial(). Эти функции будут запускать наши эффекты параллельно и последовательно.

Теперь представим, что мы написали такой код:

  1. new Effect.Highlight('textBlock', {startcolor:"#DFDC00", endcolor:"#FFFFFF", duration: 2});
  2. new Effect.MoveBy('textBlock', 0, 100, {duration: 2});

Как вы думаете, в каком порядке они будут выполнены?
Правильный ответ: “В большинстве случаев параллельно”. Почему в “большинстве случаев”? Потому что, если мы не задали последовательность выполнения явно, то она может зависеть от браузера.

Отсюда простой вывод: “Если используете несколько эффектов, всегда указывайте, в каком порядке их выполнять”.

Параллельное выполнение эффектов
Гарантировать одновременное выполнение эффектов можно с помощью метода Parallel, который создает контейнер для эффектов. В первом параметре этого метода нужно указать все эффекты, которые мы хотим применить, причем в параметры каждого эффекта обязательно добавьте sync: true, а также уберите duration.

Во втором параметре метода передается массив с настройками. Вот здесь и нужно задавать время работы эффектов.

В результате наша функция runParallel() будет выглядеть следующим образом:

  1. function runParallel() {
  2. new Effect.Parallel(
  3.     [
  4.     new Effect.Highlight('textBlock', {startcolor:"#DFDC00",
  5.     endcolor:"#FFFFFF", sync: true}),
  6.     new Effect.MoveBy('textBlock', 0, 100, {sync: true})
  7.     ],
  8.     {duration: 2}
  9. );
  10. }

Последовательное выполнение эффектов
Тут тоже ничего сложного. Нужно создать очередь (queue) и добавить в нее эффекты.

Создается очередь с помощью параметра queue в настройках эффекта. В качестве значения этому параметру нужно передать массив из двух элементов: position и scope.
1) position – указывает куда будет вставлен данный эффект. Может принимать два значения: end (эффект будет вставлен в конец очереди) и front (в начало).
2) scope – задает название очереди. С его помощью можно создать несколько очередей с эффектами.

Теперь посмотрим наш пример:

  1. function runSerial() {
  2.     new Effect.Highlight('textBlock', {startcolor:"#DFDC00",
  3.         endcolor:"#FFFFFF", duration: 2,
  4.         queue: {position: 'end', scope: 'myqueue'}});
  5.     new Effect.MoveBy('textBlock', 0, 100, {duration: 2,
  6.         queue: {position: 'end', scope: 'myqueue'}});
  7. }

Как видите, мы создали очередь под названием myqueue и добавили в ее конец оба наших эффекта.

При добавлении эффекта в конец очереди предыдущие эффекты смещаются вперед. Поэтому в нашем случае сначала блок будет подсвечен, а затем, перемещен.

Если изменить значения параметра position на front, то эффекты будут выполнены в обратном порядке.

Естественно, никто не ограничивает вас двумя эффектами. Вы можете использовать практически любое количество встроенных эффектов в различных сочетаниях для получения нужного результата.

Если что-то не получилось, скачайте архив с файлами примера.

Понравилась статья? Подпишитесь на продолжение rss link !

]]>

Добавьте эту страницу в google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

]]>

Опубликовано в HTML, JavaScript

]]>

Комментарии (3)

Вы можете отслеживать обсуждение записи с помощью RSS 2.0 rss link

Вы также можете оставить комментарий, или трекбек с Вашего сайта.

  1. Дмитрий 20.10.2008 в 13:58 (Ответить)

    А как сделать что бы между двумя эффетами при последовательном выполнении выполнялась какая либо функция? Если просто между new Effect вставить сначала выполниться функция, потом только два эффета…

    1. Владимир 20.10.2008 в 20:43 (Ответить)

      Все эффекты Scriptaculous поддерживают параметры beforeStart, beforeUpdate, afterUpdate, afterFinish, которым можно назначить функцию-обработчик.
      В вашем случае скорее всего нужно использовать либо afterFinish для первого эффекта, либо beforeStart для второго.

      Например:

      new Effect.Opacity( 'testSubject', {
      duration: 5,
      from: 0,
      to: 1,
      afterFinish: function(o) {alert("Привет");}
      });

  2. Дмитрий 21.10.2008 в 11:41 (Ответить)

    Спасибо большое! Помогло :)

Оставить комментарий

Введите ваш комментарий

* - обязательные для заполнения поля

Quicktags:

]]>