UIC Руководства Архив Книжная полка Халява Сайтосмотр Дизайн "Бурзилка" Пишите

Структура сайта
Главная
UIC
Сервисы
Студенту ВМК
Руководства
Документация
(описания, учебники)
Выбор компьютера
Архив программ
Книжная полка
Халява
Диски
Коврики и т.д.
Вещевая
Сайтосмотр
Нижегородские сайты
Интересные ссылки
Web - дизайн
Обзор околокомпьютерных
рассылок Subscribe.ru
Журнал "Бурзилка"

Пишите письма

Web-дизайн. Статьи.

Mike Melnikov (cherry-design@mail.ru)
Web-studio "Cherry-Design"

  1. Как создать привлекательный web-сайт
  2. Аппаратная конфигурация компьютера
  3. Программы, используемые в web-мастеринге
  4. Информация - вот основа Internet!
  5. Что такое стильный web-сайт?
  6. Рисунок сотен слов дороже нам
  7. Оптимизация изображений в формате JPG
  8. Оптимизация изображений в формате GIF
  9. Броузеры, которые мы выбираем
  10. Интерактивность! Что? И как?
  11. Зачем нам нужен SSI?
  12. Слуга двух господ (часть I)
  13. Слуга двух господ (часть II)
  14. Слуга двух господ (часть III)
  15. Слуга двух господ (часть IV)
  16. Слуга двух господ (часть V)
  17. Как оформить таблицу?
  18. Как правильно регистрировать сайт?
  19. Бойцы невидимого фронта
  20. Немного слов о кодировках
  21. Как работает формат JPEG?
  22. JavaScript и объектная модель
  23. JavaScript: полезные функции (часть I)
  24. JavaScript: полезные функции (часть II)
  25. JavaScript: полезные функции (часть III)
  26. Сага о фреймах
  27. JavaScript: полезные функции (часть IV)
  28. С чего начинается сайт?
  29. JavaScript: полезные функции (часть V)
  30. JavaScript: полезные функции (часть VI)
  31. История про CSS (часть I)

JavaScript: полезные функции (часть V)

Mike Melnikov (cherry-design@mail.ru)
Web-studio "Cherry-Design"

Эффект, который мы сейчас рассмотрим, является, пожалуй, самым распространенным. И заключается он в смене изображения при наведении на него мышкой. Часто можно слышать английское название эффекта - RollOver, что обычно переводят как "перекатывание". Мне не кажется это название удачным, но все же, давайте приступим.

Эффект может встречаться в различных вариантах, самые распространенные из которых это:

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

Подсвечивание пунктов меню

Наиболее часто встречающаяся реализация эффекта RollOver. Его основой является подмена картинки при наведении курсора мышки и возврат к первоначальной после того, как мышка ее покинет. Данный эффект в действии можно посмотреть вот на этом сайте.

Для начала, нам будет необходимо нарисовать каждую кнопку меню в двух вариантах: в "отжатом" и "нажатом" состояниях. Будем считать, что это уже сделано и перейдем к рассмотрению механизма, который обеспечивает нужную нам функциональность.

Начнем с написания HTML-кода меню. Это несложно и будет выглядеть примерно так:

<a href=""><img src="pic/pic-1.gif" name="pic1"></a><br>
<a href=""><img src="pic/pic-2.gif" name="pic2"></a><br>
<a href=""><img src="pic/pic-3.gif" name="pic3"></a>

Это обычное меню, составленное из графических элементов. Я опустил несущественные для понимания детали - такие как указание высоты и ширины изображения, тег ALT и т.п. Заметьте, однако, что для каждой картинки указан атрибут name, который понадобится для ссылки на картинку.

Теперь мы немного модифицируем меню, добавив в него вызов функций смены изображения. Для отслеживания попадания курсора мышки на изображение мы воспользуемся событием onMouseOver и привяжем к нему вызов функции смены изображения:

onMouseOver="change('pic1','pic/pic-1-on.gif');"

А для отслеживания ухода курсора с изображения, на помощь придет событие onMouseOut которое также вызывает функцию смены изображения, но уже с другими параметрами:

onMouseOut="change('pic1','pic/pic-1.gif');"

В первом случае мы указываем ссылку на изображение "нажатой кнопки", а во втором, соответственно, "отжатой" (или исходной картинки, что суть одно и тоже).

Теперь напишем всю конструкцию полностью на примере одного пункта меню:

<a href="page.htm" onMouseOver="change('pic1','pic/pic-1-on.gif');"
onMouseOut="change('pic1','pic/pic-1.gif');"><img
src="pic/pic-1.gif" name="pic1"></a>

Подобным образом необходимо обработать каждый пункт нашего меню. Отличие будет заключаться лишь в смене значения атрибута name, который для каждого пункта должен быть уникальным и соответствующей коррекции значений параметров в вызовах функций onMouseOver и onMouseOut.

Перед тем, как перейти к написанию кода, поговорим о том, каким образом мы можем управлять изображениями на страничке.

Как я писал в одной из более ранних статей, броузер перед показом странички на экране, разбивает ее на составляющие блоки и заносит их в свою базу данных, предоставляя нам доступ к информации посредством объектной модели. В частности, все картинки сохраняются в объекте images, который, в свою очередь, входит в объект document. И, например, для того, чтобы заменить одно изображение другим, нам достаточно воспользоваться следующей конструкцией:

document.images["pic1"].src = "pic/pic-1-on.gif";

Обратите внимание, что для ссылки на конкретное изображение (ведь на страничке их может быть много), мы используем имя картинки, которое указали в атрибуте name тега <img>. В данном примере, мы изменили изображение обычной кнопки, на ее "нажатый" вариант.

Точно таким же образом, мы можем обратиться и к другим атрибутам картинки: ширине (width), высоте (heigth), поясняющему тексту (alt) и т.д. В нашем же случае достаточно будет изменить только ссылку на картинку, т.к. изображения "обычной" и "нажатой" кнопки имеют одинаковые размеры.

Все необходимые знания для написания функции у нас уже есть, так что приступим. Вот код на JavaScript, который осуществляет подмену изображений. В качестве параметров мы передаем ему имя рисунка и ссылку на изображение "нажатой" (или "отжатой") кнопки:

function change(img, ref) {
    if (browser_ok == 'true') {
        document.images[img].src = ref;
    }
}

О способе определения типа и версии броузера, подробно написано в первой статье цикла о JavaScript.

Бегающий указатель

Чем отличаются варианты RollOver с "подсвечиванием пунктов меню" и "бегающим указателем"? Только тем, что во втором случае у нас есть всего две картинки, используемые для всех пунктов меню - пустая и с изображением указателя. Пример использования данного эффекта, можно посмотреть вот здесь

В этом варианте RollOver нам придется слегка изменить HTML-код, описывающий меню, т.к. перед каждым пунктом меню мы добавляем изображение пустого указателя:

<img src="pic/pointer.gif" name="pic1"><a
href="news.htm" onmouseover="over('pic1');"
onmouseout="out('pic1');"><img src="pic/pic-1.gif"></a>

Обратите внимание на несколько особенностей. Во-первых, вместо одной функции смены изображения нам понадобятся две, т.к. действия, производимые при попадании курсора в область пункта меню, и покидании ее слегка отличаются. Мы назовем эти функции соответственно over() и out(). Во-вторых, заметьте, что атрибут name, тега <img>, переместился из описания пункта меню в описание указателя - ведь теперь мы подсвечиваем не меню, а указатель!

Число параметров, передаваемых функциям можно сократить - достаточно ограничиться именем картинки (атрибут name), т.к. ссылки на изображения, формирующие указатель, нам известны заранее. Код, осуществляющий необходимые действия, теперь выглядит так:

function over(img) {
    if (browser_ok == 'true') {
        document.images[img].src = "pic/pointer-on.gif";
    }
}
function out(img) {
    if (browser_ok == 'true') {
        document.images[img].src = "pic/pointer.gif";
    }
}

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

Сменяющаяся картинка

Пример использования данного эффекта можно наблюдать непосредственно на моем собственном сайте.

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

Как и в предыдущем случае, начнем с корректировки HTML-кода. В данном варианте он будет состоять из двух фрагментов: описание изображения, которое будет меняться и описание областей, при попадании на которые вызывается скрипт. Это может быть, к примеру, то же самое меню:

<img src="pic/default.gif" name="pic">
...
<a href="page_1.htm" onmouseover="over('pic/image-1.gif');"
onmouseout="out();"><img src="pic/pic-1.gif"></a><br>
<a href="page_2.htm" onmouseover="over('pic/image-2.gif');"
onmouseout="out();"><img src="pic/pic-2.gif"></a><br>
<a href="page_3.htm" onmouseover="over('pic/image-3.gif');"
onmouseout="out();"><img src="pic/pic-3.gif"></a>

Соответственно, придется скорректировать и поведение функций. В функцию over(), которая вызывается в результате попадания курсора в активную область, достаточно передать только ссылку на заменяющее изображение. Вызов же функции out() осуществляется и вовсе без параметров:

function over(ref) {
    if (browser_ok == 'true') {
        document.images[img].src = ref;
    }
}

function out() {
    if (browser_ok == 'true') {
        document.images[img].src = "pic/default.gif";
    }
}

Вот мы и разобрались со всеми вариантами скриптов, для реализации эффекта RollOver. Но, подождите еще немножко, т.к. осталось рассмотреть еще один очень важный вопрос:

Предварительная загрузка изображений

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

Для чего используется предварительная загрузка изображений? Ответ лежит в самом механизме работы интернет - как известно, любая страничка состоит из набора файлов, которые загружаются одновременно с основной страничкой. Но есть одна особенность - загружаются только картинки, которые видны на экране. Наш же эффект построен на подмене изображений и соответственно часть картинок при загрузке не видна.

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

Механизм предварительной загрузки изображений осуществляется при помощи следующего фрагмента кода:

if (browser_ok == 'true') {
    a1=new Image; a1.src="pic/pic-1-on.gif";
    a2=new Image; a2.src="pic/pic-2-on.gif";
    a3=new Image; a3.src="pic/pic-3-on.gif";
}

Мы просто создаем объект Image для каждой невидимой в данный момент картинки и указываем адрес изображения. Это приводит к тому, что, дойдя до этого фрагмента кода, броузер инициирует загрузку изображений точно так же, как и для обычных видимых картинок. К концу загрузки странички, абсолютно все картинки ее составляющие находятся в кэше, и от этого будут загружаться мгновенно.

Приведенным выше способом, необходимо скэшировать все невидимые на страничке картинки. Обратите так же внимание, что я осуществляю проверку корректности броузера и, в случае, если это достаточно старая версия, которая не поддерживает смену изображений, то лишняя графика просто не грузится - тем самым несколько ускоряя загрузку странички.

При грамотной нарезке страничек сайта, мы можем использовать часть изображений первой страницы во внутренних. Подобный механизм реализован на моем собственном сайте (www.cherry-design.spb.ru). Если Вы к нему внимательно присмотритесь, то обнаружите, что почти вся необходимая графика грузится на первой страничке и открытие внутренних разделов сайта происходит почти мгновенно. В частности, оказываются уже загруженными фрагменты логотипа разных цветов и графика составляющая пункты меню.

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

Архив с примерами скриптов, рассмотренных в данной статье, можно взять отсюда.

Продолжение следует...

Назад | Содержание | Вперед

 

UIC Руководства Архив Книжная полка Халява Сайтосмотр Дизайн "Бурзилка" Пишите