Выпадающее меню на JavaScript
Как создать выпадающее меню при наведении курсора мышки на пункт меню с использованием JavaScript.
Выполним горизонтальное меню без применения таблиц, для этого будем использовать блоки div и свойство CSS - float (обтекание). Тогда пункты меню достаточно будет записать подряд в блоках div, с классом punkt. Также заключим все меню в блок с классом menu, и еще для наглядности все пункты меню поместим в блок с идентификатором block_menu. То есть на данном этапе получим следующий HTML-код:
В итоге получается строчка из пунктов меню. Также добавлен блок footer_menu со свойством clear:both, с помощью которого уберается действие свойства float пунктов меню на последующее содержимое странички.
Пункты выпадающего меню - это подпункты.
Далее делаем выпадающее меню блоком div с абсолютным позиционированием. Тогда нужно обозначить блок div с классом punkt как относительно позиционируемый, и в нем прописать блок div со списком подпунктов, как абсолютно позиционируемый. Для блока div со списком подпунктов определим класс list_punkts. Этот блок нужно будет сделать невидимым, и лишь при наведении на пункт делать его видимым. Сделать первоначально его невидимым нам поможет свойство display:none. В дальнейшем показывать и убирать его будем при помощи JavaScript, управляя все тем же свойством display. Отображаться же будет блок со списком подпунктов ниже пункта меню и выравниваться по левому краю. На данном этапе получим следующий код:
Для отображения выпадающего меню при наведении курсора мышки на пункт меню будем использовать обработчик событий onMouseOver, которому укажем функцию, делающую наш блок видимым. Для скрытия выпадающего меню при уводе указателя мыши с пункта меню будем использовать обработчик событий onMouseOut, которому укажем функцию, делающую наш блок невидимым. Теперь осталось решить, как получить доступ к пункту меню и блоку со списком подпунктов. Решим эту задачу с помощью DOM. Для этого в обработчике событий передадим исполняющей функции объект пункта меню, у нас это div с классом punkt. Реализуем это с помощью ключевого слова this, которое означает текущий объект, например, если мы напишем
то при вызове функции overPunkt(obj_block){…} переменная obj_block будет содержать объект блока div приведенного в примере.
Однако использование DOM потребует заключить текст пункта меню в блок div и повышенного внимания при наборе HTML-кода. Давайте рассмотрим уже готовый к употреблению код:
Для того, чтобы правильно работали функции обработки пункта меню и списка подпунктов, нужно блок пункта меню, блок с названием и блок со списком подпунктов писать без пробелов, при необходимости переносить текст на новую строку можно в теге, следующим образом:
<div class=punkt onMouseOver=overPunkt(this) onMouseOut=outPunkt(this)><div>PHP</div><div class=list_punkts></div></div>
Этот способ облегчает написание как самих функций, так и исключает некоторые действия другого рода.
При наведении курсора на пункт меню, обработчик событий onMouseOver вызовет функцию overPunkt() и переменной obj_listPunkt будет передан объект div с классом punkt. Согласно записанному HTML-коду 1-м дочерним объектом будет блок div с названием пункта. К нему доступ можно получить, записав следующее:
obj_listPunkt.childNodes[0]
Доступ к блоку div с классом list_punkts, содержащий список подпунктов (выпадающее меню) можно получить следующим образом:
obj_listPunkt.childNodes[1]
Так как свойство childNodes содержит список потомков узла и для доступа к какому-нибудь потомку нужно указать номер потомка (отсчет начинается с нуля), что мы и применили.
Кроме управления видимостью выпадающего меню в функциях overPunkt() и outPunkt() также меняется и внешний вид пункта меню, т.к. в HTML-коде добавлены еще элементы оформления внешнего вида меню.