Password
    
 К титульной странице  |  Форум  |  О проекте  |  Словарь  |  Товары  |  Сделать стартовой  |  В Закладки   
Авторизация
Забыли пароль?
Регистрация 
 
Программирование
Безопасность
Демосцена
Игры
WEB-мастерская
Программное обеспечение
Аппаратное обеспечение



Последние материалы
  The Chronicles of Riddick: Escape from Butcher bay

  Что такое хорошо и что такое плохо, или FAQ по LCD-мониторам

  Организация удаленного доступа

  Инсталляция программного обеспечения используя GPO

  Smarty в веб-разработке

  BioShock или кафе разбитых надежд...



Последние новости
  Латвия подписала АСТА

  Примечательная промо-акция игры STAR WARS: The Old Republic на Times Square в Нью Йорке

  На сайте выложены первые выпуски легендарной телепередачи о компьютерных играх "От винта!"

  На сайте опубликован энциклопедический словарь по информатике Э.Якубайтиса

  Конференция Разработчиков Видеоигр, 1979

  Более шустрый и динамичный Mail.lv



Charitable advertising
Њл ­г¦¤ Ґ¬бп ў ў иҐ© Ї®¬®йЁ!



Ziedot.lv

Penn State Child Life Program



WEB-мастерская--->JavaScript
Создаём Div’ное,выпадающее меню (div+javascript menu)
  
Автор: Mihail Chernov
Опубликовано: [2005-03-05 22:54]
В этой статье расскажу о создании простенького двухуровнего меню с помощью JavaScript и слоёв (Div). Несмотря на то, что к каждому примеру я буду давать комментарии, для нормального воспириятия материала всё же рекомендуется иметь хотя бы поверхностное представление о работе с HTML и с JavaScript.

Идея

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

Как вы видите, перед нами стоит вполне выполнимая задача. =) А раз так, давайте перейдём непосредственно к реализации!

Реализация

Для выполнения операций со слоями мы будем использовать JavaScript.
Соответствующий сценарий приведён ниже:

<Script Language="JavaScript">

//  Установка глобальных переменных
.

cm=null;                    // сюда будем запоминать 
                                // видимый слой. Начальное 
                               // значение - null.
hide_delay=500;       // Время задержки (в м.с.) авто-закр.
                              // меню. 
tstat=0;                  // Признак активности таймера авто-закр.

// Определяем браузер пользователя

isNS4 = (document.layers) ? true : false;
isIE4 = (document.all && !document.getElementById) ? true : false;
isIE5 = (document.all && document.getElementById) ? true : false;
isNS6 = (!document.all && document.getElementById) ? true : false;


// Функция отображающая и скрывающая слои

// Вход:
// objElement - идентификатор(id) слоя;
// bolVisible - булева переменная:
// true  - отобразить слой;
// false - скрыть слой.

// Выход:
// 1


// P.S: В зависимости от типа браузера
// сценарий для манипуляции с видимостью слоёв
// несколько различается.

function switchDiv(objElement,bolVisible){
if(isNS4||isIE4){
     if(!bolVisible) {
       objElement.visibility ="hidden"
     } else {
       objElement.visibility ="visible"
     }     
 } else if (isIE5 || isNS6) {
      if(!bolVisible){
         objElement.style.display = "none";
         
      } else {
        objElement.style.display = "";
        
        }

      }

return 1;
}



// Функция возвращающая значение указанного ей 
// свойства объекта (не обязательно слоя).

// Вход:
// el    - идентификатор элемента;
// sProp - свойство (left,top...)

// Выход:
// Значение какого-нибудь свойства объекта.



function getPos(el,sProp) {
	var iPos = 0;
	while (el!=null) {
		iPos+=el["offset" + sProp]
		el = el.offsetParent
	}
	return iPos

}



// Функция выдаёт объект с указанным
// ей названием.

// Вход:
// myid - название объекта

// Выход: объект.

function getelementbyid(myid) {
   if (isNS4){
        objElement = document.layers[myid];
     }else if (isIE4) {
        objElement = document.all[myid];
     }else if (isIE5 || isNS6) {
             objElement = document.getElementById(myid);
     }
return(objElement);
}



// Функция отображающая|скрывающая
// ,а предварительно ещё и передвигающая
// должным образом слои.


// Вход:
// el - яйчейка таблицы на которой 
// находится указатель;
// m  - наименование слоя, который надо
// отобразить под этой яйчейкой.

function show(el,m) {

// Если имеется видимый слой,
// сделать его невидимым.

 if (cm!=null) {
 switchDiv(cm,false);
 }


// Если указано название слоя для отображения,
// то:
// 1) Получаем его объект;
// 2) X слоя = X яйчейки;
// 3) Y слоя = Y яйчейки + высота яйчейки;
// 4) Делаем слой видимым;
// 5) Сохраняем копию слоя в cm.  


 if (m!=null) {
 m=getelementbyid(m);
 m.style.left = getPos(el,"Left")+"px";
 m.style.top =  getPos(el,"Top")+el.offsetHeight+"px";
 switchDiv(m,true);
 cm=m;
 }

}



// Функция "закрывающая" меню.

// Функция ничего не принимает на вход
// и возвращает 1.

function hidemenu() {

// Устанавливаем задержку равную 
// hide_delay м.с. с помощью таймера; 

timer1=setTimeout("show(null,null)",hide_delay);

// Устанавливаем tstat=1 - признак, того, что таймер запущен.
tstat=1;

return 1;
}



// Функция, останавливающая таймер запущенный
// прошлой функцией. Таким образом,
// меню не пропадает.

// Функция ничего не принимает на вход
// и возвращает 1.

function cancelhide() {
 if (tstat==1) {
 clearTimeout(timer1);
 tstat=0;
 }
return 1;
}

</Script>

Когда мы знакомы со сценарием, самое время познакомиться и с актёрами для которых он написан.

В нашем сегодняшнем представлении главные роли исполняют слои (div), а также таблица, выполняющая роль основного меню. Вот пример HTML работающий со сценарием:

<TABLE WIDTH=300 BORDER=1 onMouseOut="hidemenu()" onMouseOver="cancelhide()">
<TR>
<TD width=100 align="center" onMouseOver="show(this,'submenu1')"><a href="">Меню 1</a></TD>
<TD Width=100 align="center" onMouseOver="show(this,'submenu2')"><a href="">Меню 2</a></TD>
<TD width=100 align="center" onMouseOver="show(this,'submenu3')"><a href="">Меню 3</a></TD>
</TR>
</TABLE>

Таблица - основное меню. При наведении курсора на неё (самый первый onMouseOver ) вызывается функция “cancelhide()”. Когда курсор отъезжает (первый onMouseOver) выполняется функция “hidemenu()”.

При наведении курсора на какую-нибудь из её яйчеек, вызывается функция “show(this,[id_слоя])”. Где [id_ слоя] - наименование слоя.




<DIV ID="submenu1" STYLE="LEFT: -1000px;OVERFLOW: hidden;POSITION: absolute;TOP: -1000px;" onMouseOut="hidemenu()" onMouseOver="cancelhide()">
<table cellpadding=1 cellspacing=0 BORDER=1 width=100>
<tr>
<td width=”100%”><a href="">SubMenu1_1</a></td>
</tr>
<tr>
<td><a href="">SubMenu1_2</a></td>
</tr>
<tr>
<td><a href="">SubMenu1_3</a></td>
</tr>
<tr>
<td><a href="">SubMenu1_4</a></td>
</tr>
</table>
</DIV>


Один из изначально невидимых (OVERFLOW: hidden), находящихся за пределами экрана (LEFT: -1000px; TOP: -1000px) слоёв. При наведении курсора мыши на него (onMouseOver) вызывается функция “cancelhide()”, а когда курсор мыши «уходит» (onMouseOut), то “hidemenu()” (описания этих функций см. выше).

Вот так будет выглядеть изготовленное нами меню:



Меню 1 Меню 2 Меню 3







Посмотреть пример на отдельной странице

Итог

В статье я рассказал лишь о создании простого двухуровневого выпадающего меню. Оно у нас получилось скромненькое,без наворотов - всего 2 уровня и никаких там «спЭцИфЭктов» при выпадении. Насчёт создания многоуровнего меню и эффектов я постараюсь рассказать в одной из следующих статей. А с графическим оформлением думаю вы и сами без труда справитесь ;) На этом я с вами прощаюсь! До свидания! До новых встреч!





Перейти к рубрике --> JavaScript

Наши друзья
Juridiskie pakalpojumi  
IT Works
  Codenet - всё для программиста
   
• Hi-tech NEWS • InCube e-mag
  Программисты, Вам сюда!
КомментарииВсего:5
mirazh38 mirazh38
  alex@mirazh38.ru
[2011-03-18 19:19:40]спс за код без тебя бы не справился, пример как использовал www.mirazh38.ru
Mihail Chernov
  mihack@inbox.lv
[2007-01-18 11:50:46] Angel, очевидно Вам надо указать браузеру нужную кодировку страницы поддерживающую латышский (например Baltic Windows или UTF-8). Это можно сделать с помощью заголовка HTTP (например в PHP:
header("Content-type: text/html; charset=windows-1257")
).
Или непосредственно в самом HTML документе:
<meta http-equiv="Content-Type" content="text/html; charset=windows-1257">
(вставляется после закрывающего тэга "</title>").
Angel
  Shaft666@inbox.lv
[2007-01-18 10:09:03]Pomogite. U menja na JS no tam ne otobrazhaetsa lati6skij jazik (garumzimi i vsjo takoe). Kak eto ispravitj?
konstantins
[2005-05-11 00:56:05]mnogo ochenj horoshih variantov na http://www.java-scripts.net/ da i esche na mnogih mnogo otkritih codov. Vse ravno vipadajuschimi menju i tool tipami luchshe ne uvlekatsja, tolko po mere nadobnosti, vse ravno na kakih nibudj brauserah rabotatj ne b
Antonina
  anezd@yandex.ru
[2005-05-03 13:39:59]У меня есть похожий пример, все классно, только если просколить по горизонтали, то весь текст выведет, а ширину слоя сделает 12px, после долгих мучений выяснила, что 12 становиться после lay.style.left = x + 'px' не пашет естественно в Opera и Mozill


Только зарегистрированные пользователи могут оставлять здесь комментарии. Зарегистрироваться можно здесь. Если вы уже зарегистировались ранее, то можете войти в систему здесь.


© Mihail Chernov (MiHack) Обмен ссылками