Данный скрипт работает корректно только в IE4+
<html>
<head>
<title>JavaPortal</title>
<style>
.menu
{
 font-size: 12pt;
 font-weight: bold;
 text-align: center;
 text-decoration: none;
 cursor: hand;
 border: none;
}
</style>
<SCRIPT language="JavaScript">
<!--

//Author: Yura Ladik yuraladik@javaportal.ru
//1. Переменные
var cBorder = 'f0fff0'//Цвет рамки
var cBg = '#006000'    //Цвет фона
var cBgAct = 'lightgrey' //Цвет фона активного меню
var cFont = 'white'    //Цвет шрифта
var cFontAct = 'red'   //Цвет шрифта активного меню
var closeTimeout = 500 // задержка на закрытие подменю
var menuLeft=15//Положение меню по X
var menuTop=150//Положение меню по y
var orientation="vertical"//Тип меню: вертикальный (vertical) или горизонтальный(horizontal)
var cellp=10//Отстум надписи в меню
var cellpChild=2//Отступ подменю от меню
var timerID //Таймер
var overChildMenu = ''//используется для запоминания текущего подменю
//---------------------------------

//2. Создаём массив описывающий меню.
var menu  = new Array()
menu[0]  = new Array()
menu[0][0] = new Array("Новости","http://www.javaportal.ru/news/news.html","Новости проекта")

menu[1]  = new Array()
menu[1][0] = new Array("О проекте","http://www.javaportal.ru/project.html","О проекте")

menu[2]  = new Array()
menu[2][0] = new Array("Рассылки","http://www.javaportal.ru/subs/subs.html","Рассылки")

menu[3]  = new Array()
menu[3][0] = new Array("Связь с нами","http://www.javaportal.ru/link.html","Связь с нами")

menu[4]  = new Array()
menu[4][0] = new Array("Java","","Всё о Java")//Название, URL, описание
menu[4][1] = new Array("Апплеты","http://www.javaportal.ru/java/applets/applets.html","Коллекция Java апплетов")
menu[4][2] = new Array("Вопрос-ответ","http://www.javaportal.ru/java/faq/faq.html","FAQ по Java")
menu[4][3] = new Array("Классы","http://www.javaportal.ru/java/class/class.html","Описание Java классов")
menu[4][4] = new Array("Конференция","http://www.javaportal.ru/conference/conference.html","Конференция по Java")
menu[4][5] = new Array("Примеры","http://www.javaportal.ru/java/examples/examples.html","Примеры Java")
menu[4][6] = new Array("Статьи","http://www.javaportal.ru/java/articles/articles.html","Статьи по Java")

menu[5]  = new Array()
menu[5][0] = new Array("JavaScript","","Всё о JavaScript")//Название, URL, описание
menu[5][1] = new Array("Вопрос-ответ","http://www.javaportal.ru/javaScript/faq/faq.html","FAQ по JavaScript")
menu[5][2] = new Array("Конференция","http://www.javaportal.ru/conference/conference.html","Конференция по JavaScript")
menu[5][3] = new Array("Примеры","http://www.javaportal.ru/javaScript/examples/examples.html","Примеры JavaScript")
menu[5][4] = new Array("Статьи","http://www.javaportal.ru/javaScript/articles/articles.html","Статьи по JavaScript")

menu[6]  = new Array()
menu[6][0] = new Array("Разное ","","Всего помаленьку")
menu[6][1] = new Array("Словарь терминов","http://www.javaportal.ru/dictionary/dictionary.html","Словарь терминов")
menu[6][2] = new Array("Статьи","http://www.javaportal.ru/articles/articles.html","Статьи")
//---------------------------------

//3. Пишем в документ структуру меню
for(i=0;i<menu.length;i++)
{
 document.write('<div id="divMenu'+i+ '" style="position:absolute;" onmouseover="openMenu('+i+


')" onmouseout="closeMenu('+i+')" onclick="clickMenu('+i+')">') document.write('<table cellpadding=0 cellspacing=0><tr><td bgcolor="'+cBorder+

'"><table cellpadding="0" cellspacing="1" border="0"><TR><TD id="tabMenu'+i+

'" bgcolor="'+cBg+'" style="color:'+cFont+';">') document.write(menu[i][0][0]+'</td></tr></table></td></tr></table></div>') if (menu[i].length > 1) { document.write('<div id="divChildMenu'+i+'" style="position:absolute;visibility:hidden;" onmouseout="closeMenu('+i+

')"><table cellpadding=0 cellspacing=0><tr><td bgcolor="'+cBorder+

'"><table id="tabChildMenu'+i+'" cellpadding="0" cellspacing="1" border="0">') for(j=1;j<menu[i].length;j++) { document.write('<span id="spanChildMenu'+i+'a'+j+ '" onmouseover="openChildMenu('+i+','+j+


')" onmouseout="closeChildMenu('+i+','+j+')" onclick="clickChildMenu('+i+','+j+


')"><tr><td ID="tabChildMenu'+i+'a'+j+'" bgcolor="'+cBg+'" style="color:'


+cFont+';">') document.write(menu[i][j][0]) document.write('</td></tr></SPAN>') } document.write('</TABLE></td></tr></table></div>') } } //--------------------------------- //4. Производим конфигурирование меню a=document.all['divMenu0'] a.style.pixelLeft=menuLeft; a.style.pixelTop=menuTop; document.all['tabMenu0'].style.width=document.all['tabMenu0'].offsetWidth+cellp wh1=0; if(orientation=="horizontal") { if(menu[0].length>1) { document.all['divChildMenu0'].style.pixelTop=a.style.pixelTop+a.offsetHeight+cellpChild document.all['divChildMenu0'].style.pixelLeft=a.style.pixelLeft } for(i=1;i<menu.length;i++) { a=document.all['divMenu' + i] document.all['tabMenu'+i].style.width=document.all['tabMenu'+i].offsetWidth+cellp wh1+=document.all['divMenu' + (i-1)].offsetWidth-1 a.style.pixelTop=menuTop a.style.pixelLeft=menuLeft+wh1 if(menu[i].length>1) { document.all['divChildMenu' + i].style.pixelTop=a.style.pixelTop+a.offsetHeight +cellpChild document.all['divChildMenu' + i].style.pixelLeft=a.style.pixelLeft } } } else if(orientation=="vertical") { ww1=document.all['tabMenu0'].offsetWidth for(i=1;i<menu.length;i++) { a=document.all['divMenu' + i] document.all['tabMenu'+i].style.width=document.all['tabMenu'+i].offsetWidth+cellp wh1+=document.all['divMenu' + (i-1)].offsetHeight-1 a.style.pixelTop=menuTop+wh1 a.style.pixelLeft=menuLeft if(document.all['tabMenu'+i].offsetWidth>ww1)ww1=document.all['tabMenu'+i].offsetWidth } for(i=0;i<menu.length;i++) { document.all['tabMenu'+i].style.width=ww1 a=document.all['divMenu' + i] if(menu[i].length>1) { document.all['divChildMenu' + i].style.pixelTop=a.style.pixelTop document.all['divChildMenu' + i].style.pixelLeft=a.style.pixelLeft+a.offsetWidth +cellpChild } } } //--------------------------------- //5. Функция открытия меню function openMenu(x) { paintLayer('tabMenu' + x, active = true) showLayer('divChildMenu' + x) for (i = 0; i < menu.length; i++) if (i != x) closeMenu(i, 0) overChildMenu = 'divChildMenu' + x window.status = menu[x][0][2] } //--------------------------------- //6. Функция закрытия меню function closeMenu(x, timeout) { paintLayer('tabMenu' + x, active = false) clearTimeout(timerID) if (timeout == 0) hideLayer('divChildMenu' + x) else timerID = setTimeout('hideLayer("divChildMenu' + x + '")', closeTimeout) overChildMenu = '' window.status = defaultStatus } //--------------------------------- //7. Функция закраски меню function paintLayer(layerID, active) { if (layer = document.all[layerID]) { if (active) { clBg = cBgAct; clFn = cFontAct } else { clBg = cBg; clFn = cFont } layer.style.backgroundColor = clBg layer.style.color = clFn } } //--------------------------------- //8. Функция открытия подменю function openChildMenu(x, y) { paintLayer('tabChildMenu' + x + 'a' + y, active = true) overChildMenu = 'divChildMenu' + x window.status = menu[x][y][2] } //--------------------------------- //9. Функция закрытия подменю function closeChildMenu(x, y) { window.status = defaultStatus paintLayer('tabChildMenu' + x + 'a' + y, active = false) } //--------------------------------- //10. Функция показывающая подменю function showLayer(layerID) { if (layer = document.all[layerID]) layer.style.visibility = 'visible' } //--------------------------------- //11. Функция убирающая подменю function hideLayer(layerID) { if (layer = document.all[layerID] && (overChildMenu != layerID)) document.all[layerID].style.visibility = 'hidden' } //--------------------------------- //12. Функция обрабатывающая нажатие на основное меню function clickMenu(x) { openHref(menu[x][0][1]) } //--------------------------------- //13. Функция обрабатывающая нажатие на подменю function clickChildMenu(x,y) { openHref(menu[x][y][1]) } //--------------------------------- //14. Функция перехода по ссылке function openHref(s) { if (s.indexOf('javascript:') == 0) eval(s); else if (s != '') window.location.href = s; } //--> </script> </head> <body bgColor="#ffffff"> </body> </html>
Давайте рассмотрим всё по пунктам.

1. Переменные

Здесь мы описываем все необходимые переменные, они будут доступны по всему документу. var cBorder = 'f0fff0' - цвет рамки var cBg = '#006000' - цвет фона var cBgAct = 'lightgrey' - цвет фона активного меню var cFont = 'white' - цвет шрифта var cFontAct = 'red' - цвет шрифта активного меню var closeTimeout = 500 - задержка на закрытие подменю var menuLeft=15 - положение меню по X var menuTop=150 - положение меню по y var orientation="vertical" - тип меню: вертикальный (vertical) или горизонтальный(horizontal) var cellp=10 - отступ надписи в меню var cellpChild=2 - отступ подменю от меню var timerID - таймер var overChildMenu = '' - используется для запоминания текущего подменю

2. Создаём массив описывающий меню.

Здесь мы указываем состав нашего меню. Делаем это следующим образом: Создаём массив

var menu = new Array()
menu[0]  = new Array()
menu[0][0]= new Array("Название раздела 0","Ссылка(если надо)","Описание ")
menu[0][1]= new Array("Название подраздела 1","Ссылка(если надо)","Описание ")
menu[0][2]= new Array("Название подраздела 2","Ссылка(если надо)","Описание ")
…
menu[0][j]= new Array("Название подраздела j","Ссылка(если надо)","Описание ")
…
menu[i]  = new Array()
menu[i][0]= new Array("Название раздела i","Ссылка(если надо)","Описание ")
menu[i][1]= new Array("Название подраздела 1","Ссылка(если надо)","Описание ")
menu[i][2]= new Array("Название подраздела 2","Ссылка(если надо)","Описание ")
…
menu[i][j]= new Array("Название подраздела j","Ссылка(если надо)","Описание ")
Получается двухуровневое меню с неограниченным количеством разделов и подразделов.

3. Пишем в документ структуру меню

В цикле по i создаём разделы меню в виде элемента <div> и двух таблиц за счет которых получаем рамку. В цикле по j создаём подразделы меню в виде элементов <div> и <span> и двух таблиц за счет которых получаем рамку.

4. Производим конфигурирование меню

В данном отрывке кода мы организуем меню в зависимости от значения переменной orientation – вертикально или горизонтально. И если меню располагается вертикально, то производим выравнивание всех разделов меню по ширине. 5. Функция открытия меню

function closeMenu(x, timeout)

Делаем раздел меню активным:

paintLayer('tabMenu' + x, active = true)
Показываем подменю:

showLayer('divChildMenu' + x)
Закрываем все разделы меню открытые ранее:

for (i = 0; i < menu.length; i++)
if (i != x) closeMenu(i, 0)
В строке статуса пишем описание раздела:

window.status = menu[x][0][2] }

6. Функция закрытия меню

function closeMenu(x, timeout)

Делаем раздел меню не активным:

paintLayer('tabMenu' + x, active = false)
Устанавливает таймер закрытия подменю:

clearTimeout(timerID)
setTimeout('hideLayer("divChildMenu' + x + '")', closeTimeout)
В строке статуса пишем значение установленное по умолчанию:

window.status = defaultStatus

7. Функция закраски меню

function paintLayer(layerID, active)

Если active true устанавливаем цвета активного меню:

if (active) { clBg = cBgAct; clFn = cFontAct }
Если active false устанавливаем цвета не активного меню:

else { clBg = cBg; clFn = cFont }
layer.style.backgroundColor = clBg layer.style.color = clFn }

8. Функция открытия подменю

function openChildMenu(x, y)

Делаем подраздел меню активным:

paintLayer('tabChildMenu' + x + 'a' + y, active = true)
В строке статуса пишем описание подраздела:

window.status = menu[x][y][2] }

9. Функция закрытия подменю

function closeChildMenu(x, y)

В строке статуса пишем значение установленное по умолчанию:

window.status = defaultStatus
Делаем подраздел меню не активным:

paintLayer('tabChildMenu' + x + 'a' + y, active = false)

10. Функция показывающая подменю

function showLayer(layerID)

Делаем слой с подменю видимым:

if (layer = document.all[layerID]) layer.style.visibility = 'visible'

11. Функция убирающая подменю

function hideLayer(layerID)

Делаем слой с подменю невидимым:

if (layer = document.all[layerID] && (overChildMenu != layerID))
document.all[layerID].style.visibility = 'hidden'

12. Функция обрабатывающая нажатие на основное меню

function clickMenu(x)

Идём по ссылке из меню:

openHref(menu[x][0][1])

13. Функция обрабатывающая нажатие на подменю

function clickChildMenu(x,y)

Идём по ссылке из подменю:

openHref(menu[x][y][1])

14. Функция перехода по ссылке

function openHref(s)

Если вместо ссылки JavaScript код выполняем его:

if (s.indexOf('javascript:') == 0) eval(s);
Или переходим по ссылке:

else if (s != '')
window.location.href = s;