Main > Lessons > Other > Rollover

Автор статьи и идеи: Erg_Noor

 

Часто новичками задаются вопросы, связанные с ролловерами. Люди делают их в ImageReady, случайно делают там небольшую ошибку, в результате программа генерирует в HTML и JavaScript нечто, работающее не так, как изначально задумывалось. А потом на форумах сыпятся вопросы вроде "Я сделал, а у меня не работает, подскажите где ошибка".

А теперь серьёзно, уважаемые начинающие веб-дизигнеры. Я понимаю, что многим удобно пользоваться дримвьюверами для создания сайта и имэджреди для создания ролловеров. Но понимаете ли вы на все 100% тот код, который эти программы вам генерируют? Это мне слегка напоминает ситуацию, когда вместо того, чтобы произвести "умножение семь на восемь" человек использует вместо своей головы калькулятор. В общем, давайте думать своей головой. Пригодится.

В этом уроке я хочу научить вас делать ролловеры для своих страниц вручную, дабы вы имели представление, что там вообще происходит и как поменять в случае-чего что-нибудь (например, вставить ещё один буттон), не начиная опять всё делать заново в Фотошопе и в Имэджреди. Итак...



Для начала рассмотрим на простеньком примере, как бы мы делали ролловер в ImageReady.

Допустим, нам поставлена задача сделать примерно такую вот штучку (поводите мышкой над картинками)



Cоздадим в Фотошопе картинку размером 192х64 писеля и зальём её оранжевым цветом. Теперь на трёх новых слоях поставим 3 картинки размерами 64х64 пикселя.

С помощью инструмента Slice Tool разделим картинку на 3 равные части, как на рисунке:



Теперь выставим Blending mode для этих трёх слоёв на Luminosity. Сохраним наш файл, скажем, как roll.psd.

Открываем этот файл в ImageReady. Создадим для каждого слайса свой Rollover как на скрине и для этих ролловеров выставим Blending mode на normal:



Ну, с этим у нас проблемы небыло, не так ли? Можем смело сохранять как HTML файл, выбрав File->Save Optimized As. Но давайте выберем в меню File->Preview In->Internet Explorer и посмотрим на выданный нам код. А выглядит он так:

<HTML>
<HEAD>
<TITLE>roll</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">
<!-- ImageReady Preload Script (roll.psd) -->
<SCRIPT TYPE="text/javascript">
<!--


function newImage(arg) {
   if (document.images) {
      rslt = new Image();
      rslt.src = arg;
      return rslt;
   }
}


function changeImages() {
   if (document.images && (preloadFlag == true)) {
      for (var i=0; i<changeImages.arguments.length; i+=2) {
         document[changeImages.arguments[i]].src = changeImages.arguments[i+1];
      }
   }
}


var preloadFlag = false;
function preloadImages() {
   if (document.images) {
      roll_01_over = newImage("images/roll_01-over.gif");
      roll_02_over = newImage("images/roll_02-over.gif");
      roll_03_over = newImage("images/roll_03-over.gif");
      preloadFlag = true;
   }
}


// -->
</SCRIPT>
<!-- End Preload Script -->
</HEAD>
<BODY BGCOLOR=#FFFFFF LEFTMARGIN=0 TOPMARGIN=0 MARGINWIDTH=0 MARGINHEIGHT=0 ONLOAD="preloadImages();">
<!-- ImageReady Slices (roll.psd) -->
<TABLE WIDTH=192 BORDER=0 CELLPADDING=0 CELLSPACING=0>
   <TR>
      <TD>
         <A HREF="#"
            ONMOUSEOVER="changeImages('roll_01', 'images/roll_01-over.gif'); return true;"
            ONMOUSEOUT="changeImages('roll_01', 'images/roll_01.gif'); return true;">
            <IMG NAME="roll_01" SRC="images/roll_01.gif" WIDTH=64 HEIGHT=64 BORDER=0 ALT=""></A></TD>
      <TD>
         <A HREF="#"
            ONMOUSEOVER="changeImages('roll_02', 'images/roll_02-over.gif'); return true;"
            ONMOUSEOUT="changeImages('roll_02', 'images/roll_02.gif'); return true;">
            <IMG NAME="roll_02" SRC="images/roll_02.gif" WIDTH=64 HEIGHT=64 BORDER=0 ALT=""></A></TD>
      <TD>
         <A HREF="#"
            ONMOUSEOVER="changeImages('roll_03', 'images/roll_03-over.gif'); return true;"
            ONMOUSEOUT="changeImages('roll_03', 'images/roll_03.gif'); return true;">
            <IMG NAME="roll_03" SRC="images/roll_03.gif" WIDTH=64 HEIGHT=64 BORDER=0 ALT=""></A></TD>
   </TR>
</TABLE>
<!-- End ImageReady Slices -->
</BODY>
</HTML>
Ну и бред!... Нет, ну работает, конечно, там в Adobe тож не дураки сидят. Но мусора то сколько! Зачем так сложно? Многим новичкам будет непонятно, что же там такое понаписано то. В общем, давайте лучше своими руками всё сделаем, да как можно проще.

Способ создания ролловера БЕЗ ImageReady.

Итак, откроем в Фотошопе созданный нами ранее файл roll.psd. Все созданные нами слайсы нам не нужны, забываем о них. Инструментом Crop Tool вырезаем первый из трёх фрагментов. (ни в коем случае не нажимаем save!). Теперь File->Save for web и сохраняем под названием pic1_no.gif. Теперь Blending mode для слоя с "лицом" выставляем на Normal (мы ведь выставили для всех трёх слоёв Luminosity, помните?). Теперь File->Save for web и сохраняем под названием pic1_yes.gif. Сохранили.

Теперь, чтобы вернуться на два шага назад (до вырезания первой из трёх картинок) нажимаем два раза CTRL+ALT+Z. Проделываем тот же путь для создания остальных четырёх картинок. Получили:


pic1_no.gif

pic2_no.gif

pic3_no.gif

pic1_yes.gif

pic2_yes.gif

pic3_yes.gif


Теперь напишем код странички, на которой просто расположим три картинки. Располагать будем картинки pic1_no.gif, pic1_no.gif и pic1_no.gif. Приставка "_no" означает, что это картинка, которая будет видна, если на неё не наводить мышь. Итак, хтмл-файл создайм в той же папке, в которой у нас лежат картинки. Код будет такой:

<html>
<head>
<title>roll</title>
</head>
<body>

<table align="center">
   <tr>
      <td width="64">
         <img src="pic1_no.gif" name="Pic1" width="64" height="64">
      </td>
      <td width="64">
         <img src="pic2_no.gif" name="Pic2" width="64" height="64">
      </td>
      <td width="64">
         <img src="pic3_no.gif" name="Pic3" width="64" height="64">
      </td>
   </tr>
</table>


</body>
</html>

!!! Не забываем поставить для каждой картинки name, оно нам потом понадобится.
Смотрим, что получилось:



Ага! Непорядок! Между картинками пространство. Меняем строку
<table align="center">
на
<table align="center" cellpadding="0" cellspacing="0">

Получаем:



Вот теперь порядок. Теперь нам надо подумать, как бы это сделать так, чтобы картинки при наведении на них мыши менялись на другие картинки. Использовать будем, как и в ImageReady Javascript. Ну и, само-собой, картинки послужат нам буттонами для ссылки на три различных странички. Но давайте сначала разберёмся с Javascript. Это объяснение расчитано на читателя, который хотя бы немного знает, что это такое и с чем его едят. Итак, между <head> и </head> пишем две следующее:

<script language="JavaScript">
<!--
if (document.images) {
    // Kartinka nomer 1
    Pic1on = new Image();
    Pic1on.src = "pic1_yes.gif";
    Pic1off = new Image();
    Pic1off.src = "pic1_no.gif";
    // Kartinka nomer 2
    Pic2on = new Image();
    Pic2on.src = "pic2_yes.gif";
    Pic2off = new Image();
    Pic2off.src = "pic2_no.gif";
    // Kartinka nomer 3
    Pic3on = new Image();
    Pic3on.src = "pic3_yes.gif";
    Pic3off = new Image();
    Pic3off.src = "pic3_no.gif";
}
function picon(imja) {
    if (document.images) {
       document[imja].src = eval(imja + "on.src");
}
}
function picoff(imja) {
    if (document.images) {
       document[imja].src = eval(imja + "off.src");
}
}
//-->
</script>


Давайте разберёмся. Мы имеем внизу две функции. Первая function picon указывает на событие, которое должно произойти при наводке на картинку мыши. Вторая function picoff указывает на событие при отводе с картинки мыши.

Итак! При наводе мыши на картинку, скажем, pic1_no.gif с параметром imja, которое означает не имя файла, а имя картинки (помните мы писали name="Pic1" в хтмл-коде выше?) и значение которого мы передадим функции имя картинки для нашего скрипта будет это переданное имя плюс приставка on, в нашем случае Pic1on.

Во второй функции function picoff (событие при отводе мыши) происходит то же самое, только имя картинки для скрипта будет переданный параметр imja (который в нашем случае Pic1) плюс приставка off, то-есть Pic1off.

Само-собой, что нам необходимо для каждой из наших трёх картинок указать состояния on и off, что мы и делаем немного выше в скрипте (над обоими функциями). Мы пишем:
Pic1on = new Image();
Pic1on.src = "pic1_yes.gif";
Pic1off = new Image();
Pic1off.src = "pic1_no.gif";

Это означает, что при вызове function picon с параметром jmja, равным Pic1, будет загружаться на место этой картинки другая картинка, скриптовое название которой Pic1on, а название файла которого pic1_yes.gif.

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

Всё понятно? Немного сложно я объясняю, но если присмотреться к коду, то всё очень просто. Ну да ладно, будем сводить наши черновики в один действующий код.

Итак, наш код почти готов, необходимо лишь вызывать эти самые функции function picon и function picoff при загрузке картинок. Для этого используем mouseover и mouseout:

<html>
<head>
<title>roll</title>

<script language="JavaScript">
<!--
if (document.images) {
    // Kartinka nomer 1
    Pic1on = new Image();
    Pic1on.src = "pic1_yes.gif";
    Pic1off = new Image();
    Pic1off.src = "pic1_no.gif";
    // Kartinka nomer 2
    Pic2on = new Image();
    Pic2on.src = "pic2_yes.gif";
    Pic2off = new Image();
    Pic2off.src = "pic2_no.gif";
    // Kartinka nomer 3
    Pic3on = new Image();
    Pic3on.src = "pic3_yes.gif";
    Pic3off = new Image();
    Pic3off.src = "pic3_no.gif";
}
function picon(imja) {
    if (document.images) {
       document[imja].src = eval(imja + "on.src");
}
}
function picoff(imja) {
    if (document.images) {
       document[imja].src = eval(imja + "off.src");
}
}
//-->
</script>

</head>

<body>

<table align="center" cellpadding="0" cellspacing="0">
   <tr>
      <a href="link1.htm" onmouseover="picon('Pic1')" onmouseout="picoff('Pic1')">
         <td width="64">
            <img src="pic1_no.gif" name="Pic1" width="64" height="64">
         </td>
      </a>
      <a href="link2.htm" onmouseover="picon('Pic2')" onmouseout="picoff('Pic2')">
         <td width="64">
            <img src="pic2_no.gif" name="Pic2" width="64" height="64">
         </td>
      </a>
      <a href="link3.htm" onmouseover="picon('Pic3')" onmouseout="picoff('Pic3')">
         <td width="64">
            <img src="pic3_no.gif" name="Pic3" width="64" height="64">
         </td>
      </a>
   </tr>
</table>


</body>
</html>



ВОТ И ВСЁ! Сравните этот код с громоздким кодом, созданным в ImageReady. Результат этого кода можно посмотреть здесь, а сам код ещё раз глянуть (для тех, кто хотел бы сохранить себе этот код) можно тут. А полностью весь пример без объяснений (хтмл-файл с написанным с подсветкой кодом, хтмл-файл с картинками и сами картинки) можете скачать там.

Послесловие: я надеюсь, что хоть кто-то понял то, что я пытался втолковать на протяжении 7 часов (как время летит, аж глаза болят! :-) ). Суть этого урока - пытайтесь сами своими руками делать странички и скрипты. Вспомогательные программы - это, конечно, хорошо, но может случиться, что когда-нибудь их у вас под руками не будет. Я не призываю вас пользоваться только Блокнотом, но всё же...



Rambler's Top100 TopList