В примерах DHTML кода я уже показывал как делать переходы между двумя картинками в одном и том же месте. Здесь я хочу подробно объяснить как можно сделать непрерывно работающее на сайте слайд-шоу, в котором серия картинок сменяет друг друга в одном и том же месте сайта в окне с рамкой. Код будет с самого начала написан в таком виде, чтобы иметь возможность дать пользователю управлять им через кнопки, но сначала мы рассмотрим сам процесс показа, а методы управления будут описаны в другой статье. Код, который я здесь представил, я придумал сам, и он отличается от других вариантов, которые при желании можно найти в интернете. Более того, это некий частный случай, вариантов можно придумать намного больше. И сам код можно написать разными способами. Возможно со временем это все будет рассмотрено, а здесь представлен конкретный вариант, который все равно достаточно сложный и его описание представляет собой нелегкую задачу.
Идея данного варианта следующая. Я хочу манипулировать с двумя последовательными картинками, адреса которых указывают на интернет и находятся в массиве текстов, то есть записаны как текстовые строки. Есть старая картинка и есть новая картинка. Серия переходов может показывать как новая картинка постепенно наползает на место старой. Она может двигаться по 8-ми направлениям как вдоль сторон прямоугольника в обоих направлениях, так и по диагонали. В каждый момент видна только часть новой картинки, которая попадает в окно показа. Такие переходы проще всего программировать, но движение картинки вызывает утомление глаз, как и любые быстрые перемещения предметов на экране. Такие переходы хорошо бы иметь, но не всегда следует их применять. Другая серия переходов может быть связана с выталкиванием картинки. То есть старая картинка постепенно выходит из окна показа, а вслед за ней входит новая. Это выглядит как выталкивание одного слайда другим в диапроекторе. Таких переходов может быть 4 вдоль сторон прямоугольника в двух направлениях. Они тоже напрягают глаза, но выглядят эффектно.
Следующая серия переходов может быть такой, что обе картинки стоят в окне на своем месте, но новая картинка показывается кусочками, как бы в двигающейся рамке. Таких переходов может быть тоже 8 и они отличаются от первой серии тем, что здесь двигается рамка над верхней картинкой, а это не так напрягает глаза. Далее, можно сделать переход, когда рамка увеличивается в размерах из центра, где она сначала имеет нулевые размеры. При этом новая картинка как бы разворачивается над старой. И можно сделать обратный переход, когда новая картинка находится полд старой, а старая сворачивается к центру, то есть схлопывается, открывая новую картинку. Также можно включить переход, связанный с изменением прозрачности верхней картинки от максимальной (полностью прозрачная) до нуля (полностью непрозрачная). Наконец можно придумать такой переход, когда над старой картинкой открывается окно произвольных размеров, через которое показывается движущаася картинки, например содержащая фасонный текст. Таких движений можно сделать 4 по сторонам окна. Движущаяся картинка может иметь произвольные размеры, в том числе очень большие.
Так как в нашем распоряжении имеется всего один инструмент: повторный запуск функции с помощью оператора setTimeout(move,pause), то необходимо так написать функцию move, чтобы она бесконечно долго сменяла кадры различным образом, да еще делала фасонные переходы. Но я еще хочу предусмотреть возможность останавливать анимацию в любой момент и запускать ее снова, а также крутить кадры как в прямом, так и в обратном направлении. И, более того, иметь возможность не ждать полное время показа любого кадра, а сразу переходить к новому кадру по клику кнопки. Ясно, что сделать это в инкапсулированном виде очень сложно, намного проще все сделать используя глобальные переменные. Соответственно у нас будут логические переменные ona$, key$, dir$, nex$. Первая, если равна false, будет останавливать анимацию и запускать ее снова, если равна true. Вторая будет делить процесс на две части, установочную, если равна true, и переходную, если равна false. Третья будет задавать направление смены кадров: прямое если равна true, обратное если равна false. Наконец, последняя будет реализовывать быстрый переход к следущему кадру, если равна true.
Так как в первой установочной части функции будут определяться некоторые переменные, которые потом будут использоваться во второй переходной части через какое то время, то все эти переменные также должны быть глобальными. Они не должны терять своих значений при окончании работы функции. Все глобальные переменные должны быть уникальными и не использовать в любых других частях кода. Поэтому я буду ставить в конце имен этих переменных знак $, а в именах не буду использовать числа. Это решает две задачи. Первая уменьшает вероятность того, что если бесплатный сервер прибавит к вашему сайту свой javascript код, то имена переменных в нем не совпадут с вашими и конфликта не будет. Вторая дает возможность ставить на сайт две и более анимаций. Достаточно сделать замену символа $ на $1 в любом текстовом редакторе, и мы получаем копию кода с независимыми переменными и функциями, которая сможет крутить новую анимацию.
Код данного примера имеет довольно большие размеры, поэтому я не буду показывать его целиком, а буду ставить последовательные части и объяснять каждую из них. А весь код можно получить сразу если запустить пример по этой ссылке и попросить браузер показать исходный код. Альтерантивно можно сохранить страницу в файл и затем просмотреть ее код в текстовом редакторе. В обоих случаях в конце кода будет кусок, приписанный Яндексом, но его легко распознать и уничтожить. Итак начнем смотреть код.
Итак в этой второй части, описывающей переход стоит условие на счет кадров перехода. Исходно в первой части в переменной nm$ определяется полное число кадров перехода и обнуляется счетчик кадров n$. Соответственно функция много раз попадает сюда, пока не выполнит весь переход. При этом время задкржки устанавливается на время, записанное на один кадр перехода, это десятки миллисекунд, но для компьютера это огромное время. Далее в зависимости от типа перехода выполняются соответствующие расчеты координат и размеров областей, я не буду подробно описывать как это делается, математика тут на уровне арифметики для школьников пятого класса. Наконей наступит момент когда переход закончится. А теперь вроде бы надо просто ждать большую паузу равную времени показа кадра. Не все так просто. Мы ведь хотим иметь возможность по кнопке прервать показ и принудительно перейти к следующему кадру. Для этого полное время показа разбивается на 200, и 200 раз в течение этого времени проверяется значение параметра nex$. Если оно false, то просто двигает счетчик и по окончании цикла мгновенно возвращаем программу в первую часть. А если оно true, то делаем его false и тоже мгновенно возвращаем в первую часть, не дожидаясь окончания цикла. Вот и все тело функции. А в конце стоит вызов этой же функции через новое время. Эта функция и реализует все наши сложные циклы, описанные выше. Осталось только запустить обе описанные функции и дело сделано.
О том как реализовать кнопки, масштабирование картинок, сделать полномасштабную программу анимации, которая легко настраивается на любой набор картинок, я расскажу в другой статье. Важно, что описанная функция move$() может быть основой очень большого числа самых разных слайд-шоу. Но и это еще не предел, можно реализовать больше переходов и другие переходы. Но общий принцип останется тот же.
Автор: Виктор Кон, перейти На главную