В первой части были рассмотрены базовые принципы работы селекторов и приведены несколько примеров, в данной статье я постараюсь акцентировать внимание на реализации JavaScript меню для Вашего сайта.
Если Вам готовый код наглядней документации, то переходим от слов к делу, т.е. на страницу с примерами.
Материалы данной статьи включены в учебник «jQuery для начинающих». Учебник распространяется бесплатно, и сопровождается интерактивными примерами.
Slide меню
Два slide-меню на странице: вверху и внизу.
Кликаем по ссылке с классом “btn-slide”, выезжает панель с меню.
Частично данный пример присутствует в первой части, так что особо углубляться в реализацию не буду, приведу лишь JavaScript код с пояснениями:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <script type= "text/javascript" > // когда страница загрузится $(document).ready( function (){ // вешаем обработчик на ссылку с классом "btn-slide" (верхнее меню) $( ".btn-slide" ).click( function (){ // выдвигаем/прячем панель с id = panel1 $( "#panel1" ).slideToggle( "slow" ); // изменяем класс самой ссылки $( this ).toggleClass( "active" ); // и ничего не делаем дальше (дабы не было перехода по ссылки) return false ; }); // вешаем обработчик на ссылку с классом "btn-slide2" (нижнее меню) $( ".btn-slide2" ).click( function (){ // выдвигаем/прячем панель с id = panel2 $( "#panel2" ).slideToggle( "slow" ); // изменяем класс самой ссылки $( this ).toggleClass( "active2" ); // и ничего не делаем дальше (дабы не было перехода по ссылки) return false ; }); }); </script> |
Slide меню 2
Slide-меню слева и справа страницы. Для начала приготовим HTML :
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 | < div class = "left" > <!-- Непосредственно содержание меню, мы его прячем --> < div class = "panel" > < ul > < li >< a href = "#" title = "Элемент 1" >Элемент 1</ a ></ li > < li >< a href = "#" title = "Элемент 2" >Элемент 2</ a ></ li > < li >< a href = "#" title = "Элемент 3" >Элемент 3</ a ></ li > </ ul > < ul > < li >< a href = "#" title = "Элемент 1" >Элемент 1</ a ></ li > < li >< a href = "#" title = "Элемент 2" >Элемент 2</ a ></ li > < li >< a href = "#" title = "Элемент 3" >Элемент 3</ a ></ li > </ ul > < ul > < li >< a href = "#" title = "Элемент 1" >Элемент 1</ a ></ li > < li >< a href = "#" title = "Элемент 2" >Элемент 2</ a ></ li > < li >< a href = "#" title = "Элемент 3" >Элемент 3</ a ></ li > </ ul > </ div > <!-- Панелька с кнопкой --> < p class = "slide" >< a href = "#" class = "btn-slide" >Меню</ a ></ p > </ div > |
У нас должно получиться что-то наподобие следующего:
Теперь создадим обработчик событий для ссылок с классом “btn-slide”:
01 02 03 04 05 06 07 08 09 10 | // создаем обработчик событий для ссылок с классом "btn-slide" $( ".btn-slide" ).toggle( function (){ // ... 1-ый клик по ссылке // возвращаем false return false ; }, function (){ // ... 2-ой клик по ссылке // возвращаем false return false ; }); |
Затем нам необходимо найти элемент с классом “panel” и выдвинуть его на 120 пикселей:
1 2 3 4 | // идем по DOM'у на 2-а уровня вверх, внутри элемента (это div c классом left/right) находим нужный нам элемент и приращиваем ему 120 пикселей в ширину $( this ).parent().parent().find( ".panel" ).animate({ "width" : "+=120px" }, "slow" ); // заменяем класс кнопки (для изменение стрелочки) $( this ).toggleClass( "active" ); |
Соединяем это вместе:
1 2 3 4 5 6 7 8 9 | $(document).ready( function (){ $( ".btn-slide" ).toggle( function (){ $( this ).parent().parent().find( ".panel" ).animate({ "width" : "+=120px" }, "slow" ); $( this ).toggleClass( "active" ); return false ; }, function (){ $( this ).parent().parent().find( ".panel" ).animate({ "width" : "-=120px" ,opacity: "hide" }, "slow" ); $( this ).toggleClass( "active" ); return false ; }); }); |
Drop-down меню
Одна из самых распространенных реализаций меню для сайта это горизонтальное выпадающее меню, его конечно можно реализовать при помощи CSS, но статья у нас о jQuery, так что будем орудовать оным. Начнем с HTML’a (замечу, что для всех остальных примеров код практически не отличается):
Ну и собственно сам HTML:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | < div class = "topmenu" > < ul > < li >< a href = "#" title = "Меню 1" >Меню 1</ a > < ul > < li >< a href = "#" title = "Элемент 1.1" >Элемент 1.1</ a ></ li > < li >< a href = "#" title = "Элемент 1.2" >Элемент 1.2</ a ></ li > < li >< a href = "#" title = "Элемент 1.3" >Элемент 1.3</ a ></ li > </ ul > </ li > < li >< a href = "#" title = "Меню 2" >Меню 2</ a > < ul > < li >< a href = "#" title = "Элемент 2.1" >Элемент 2.1</ a ></ li > < li >< a href = "#" title = "Элемент 2.2" >Элемент 2.2</ a ></ li > < li >< a href = "#" title = "Элемент 2.3" >Элемент 2.3</ a ></ li > </ ul > </ li > < li >< a href = "#" title = "Меню 3" >Меню 3</ a > < ul > < li >< a href = "#" title = "Элемент 3.1" >Элемент 3.1</ a ></ li > < li >< a href = "#" title = "Элемент 3.2" >Элемент 3.2</ a ></ li > < li >< a href = "#" title = "Элемент 3.3" >Элемент 3.3</ a ></ li > </ ul > </ li > </ ul > </ div > |
Далее нам необходимо добавить обработчик для события hover для элементов li:
1 2 3 4 5 6 7 8 | $( '.topmenu ul li' ).hover( function () { // ... }, function () { // ... } ); |
И отображаем под-меню:
1 2 3 4 | // находим элемент ul и вызываем анимацию slideDown $( this ).find( 'ul' ).slideDown(); // изменяем фон выбранного элемента путем добавления класса active $( this ).addClass( "active" ); |
А теперь всё вместе:
01 02 03 04 05 06 07 08 09 10 11 12 13 | $(document).ready( function (){ $( '.topmenu ul li' ).hover( function () { $( this ).addClass( "active" ); $( this ).find( 'ul' ).stop( true , true ); // останавливаем всю текущую анимацию $( this ).find( 'ul' ).slideDown(); }, function () { $( this ).removeClass( "active" ); $( this ).find( 'ul' ).slideUp( 'fast' ); } ); }); |
Drop-down AJAX меню
Горизонтальное выпадающее меню с подгрузкой элементов AJAX’ом.
Для начала нам понадобится само меню:
1 2 3 4 5 6 7 | < div class = "topmenu" > < ul > < li id = "menu1" >< a href = "#" title = "Меню 1" >Меню 1</ a ></ li > < li id = "menu2" >< a href = "#" title = "Меню 2" >Меню 2</ a ></ li > < li id = "menu3" >< a href = "#" title = "Меню 3" >Меню 3</ a ></ li > </ ul > </ div > |
И заготовки для подменю, назовем их menu1.html, menu2.html и menu3.html – по id соответствующих элементов меню (скорей всего данные элементы будут генерироваться динамически, но для упрощения примера используем статические странички):
Пример menu1.html:
1 2 3 4 5 | < ul > < li >< a href = "#" title = "Элемент 1" >Элемент 1</ a ></ li > < li >< a href = "#" title = "Элемент 2" >Элемент 2</ a ></ li > < li >< a href = "#" title = "Элемент 3" >Элемент 3</ a ></ li > </ ul > |
Теперь, как и в предыдущем примере, нам необходим обработчик события hover:
01 02 03 04 05 06 07 08 09 10 11 12 13 | $(document).ready( function (){ $( '.topmenu ul li' ).hover( function () { // ... тут необходимо внести изменения в код $( this ).addClass( "active" ); }, function () { // тут оставляем так как есть $( this ).removeClass( "active" ); $( this ).find( 'ul' ).slideUp( 'fast' ); } ); }); |
Теперь необходимо загрузить недостающие элементы меню посредством AJAX’a:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 | // получаем id активного элемента меню var id = $( this ).attr( 'id' ); // запихиваем активный элемент в локальную переменную var li = $( this ); $.ajax({ // формируем имя запрашиваемой посредством AJAX страницы url: 'ajax/' +id+ '.html' , beforeSend: function (){ // перед тем как "спросить" изменяем класс элемента - отображаем loading картинку li.addClass( 'loading' ); }, success: function (data){ // наполняем подменю li.append(data); // показываем что получилось li.find( 'ul' ).slideDown(); // убираем loading картинку li.removeClass( 'loading' ); } }); |
Собираем:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | $(document).ready( function (){ $( '.topmenu ul li' ).hover( function () { // добавляем проверочку - не загружали ли до этого элементы if ($( this ).find( 'ul' ).length == 0) { var id = $( this ).attr( 'id' ); var li = $( this ); $.ajax({ url: 'ajax/' +id+ '.html' , beforeSend: function (){ li.addClass( 'loading' ); }, success: function (data){ li.append(data); li.find( 'ul' ).stop( true , true ); // останавливаем всю текущую анимацию li.find( 'ul' ).slideDown(); li.removeClass( 'loading' ); } }); } else { $( this ).find( 'ul' ).stop( true , true ); // останавливаем всю текущую анимацию $( this ).find( 'ul' ).slideDown(); } $( this ).addClass( "active" ); }, function () { $( this ).find( 'ul' ).slideUp( 'fast' ); $( this ).removeClass( "active" ); } ); }); |
Drop-down меню
Вертикальное выпадающее меню. Достаточно простенький примерчик:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 | $(document).ready( function (){ // добавить обработчик события hover $( '.topmenu ul li' ).hover( function () { $( this ).find( 'ul:first' ).stop( true , true ); $( this ).find( 'ul:first' ).slideDown(); }, function () { $( this ).find( 'ul:first' ).slideUp( 'fast' ); } ); // всем элементам меню с вложенностью добавить символ » $( '.topmenu li:has(ul)' ).find( 'a:first' ).append( '»' ); }); |
Float меню
Плавающее меню. Нам понадобится плагин Dimensions (дабы работали методы height() и width()) – для jQuery 1.3.x данный плагин уже не нужен. Ну с HTML я думаю, Вы разберетесь:
Теперь по порядку – начнем с получение информации о текущем расположении “плавающих” меню:
1 2 3 4 | // получаем информацию из css о расположении верхнего меню menu1 = parseInt($( ".right" ).css( "top" ).substring(0,$( ".right" ).css( "top" ).indexOf( "px" ))); // расположении нижнего меню вычисляем отталкиваясь от размеров окна (96 взято на глаз) menu2 = $(window).height() - 96; |
Далее, нам необходимо “повесить” свою функцию для события scroll:
1 2 3 | $(window).scroll( function () { // тут будем перетаскивать наши меню }); |
Ну и собственно наполнение:
1 2 3 4 5 6 7 8 9 | $(window).scroll( function () { // определяем новое положение для наших меню offset1 = menu1 + $(document).scrollTop() + "px" ; offset2 = menu2 - $( '.left .panel' ).height() + $(document).scrollTop() + "px" ; // перетаскиваем элементы на новое место $( '.right' ).animate({top:offset1},{duration:500,queue: false }); $( '.left' ).animate({top:offset2},{duration:1000,queue: false }); }); |
Так же добавим отображение/скрытие элементов подменю:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 | // для всех элементов "a" которые находятся в "li" со вложенными списками "ul" $( '.panel ul li:has(ul) a' ).click( function () { // идем к паренту, находим "ul" и прячем/скрываем его $( this ).parent().find( 'ul' ).slideToggle(); return false ; }); // кнопка "+" - скрываем все "ul" вложенные в "li" $( 'a.plus' ).click( function (){ // идем к паренту, находим следующий элемент в доме, ищем в нем "ul li ul", выполняем "slideUp" $( this ).parent().next().find( 'ul li ul' ).slideUp( 'fast' ); return false ; }); // кнопка "-" - отображаем все "ul" вложенные в "li" $( 'a.minus' ).click( function (){ // идем к паренту, находим следующий элемент в доме, ищем в нем "ul li ul", выполняем "slideDown" $( this ).parent().next().find( 'ul li ul' ).slideDown( 'slow' ); return false ; }); |
Так же Вы можете скачать все примеры в одном архиве.
Цикл статей
- jQuery для начинающих
- jQuery для начинающих. Часть 2. JavaScript Меню
- jQuery для начинающих. Часть 3. AJAX
- jQuery для начинающих. Часть 4. Селекторы
- jQuery для начинающих. Часть 5. Эффекты
- jQuery для начинающих. Часть 6. События
- jQuery для начинающих. Часть 7. Пишем плагины
- jQuery для начинающих. Часть 8. Расширяем фильтры
- jQuery для начинающих. Часть 9. Пишем плагины анимации
красиво, сделал! Благодарю!!!
Не подскажите как боротьс я с такой проблемой:
При наведении на панельку у нее увеличивается ширина, когда курсор убираем она уменьшается, и частенько возникает такая ситуация – панель начинает без остановки закрываться-открываться.. Код простой, queue:false добавила как раз что бы избавиться от этой бесконечной езды, но помогает только если панелька скрывается быстро:
// Меню
$(“.hide ul”).hover(
function () {
$(this).animate({
width: “275px”,
queue:false
}, 500);
$(this).children(‘li’).animate({
width: “270px”,
queue:false
}, 500 );
},
function () {
$(this).animate({
width: “35px”,
queue:false
}, 500 );
$(this).children(‘li’).animate({
width: “35px”,
queue:false
}, 500 );
}
);
Но если ставлю время побольше, опять тоже самое, как от этого избавиться?
Даже когда быстро все равно ездит :(
Вопрос по меню Float.
При достижении третьего и последующих уровней меню, при нажатии на пункт меню первого уровня раскрываются все уровни, а нужно чтобы открывались только пункты второго уровня…
Разобрался)))
Нужно в этом фрагменте кода добавить :first
$(‘.panel ul li:has(ul) > a’).click(function() {
$(this).parent().find(‘ul:first’).slideToggle();
return false;
});
а как внутрь “Slide меню 2” засунуть “Гармошка #1”
Здравствуте ! Подскажите, добавил я скрипт “Drop-down меню” к своему меню на wordpress из вешего примера, но оно работает не так как надо т.е. если обновить страницу и навести на меню то плавность эта происходит только после повторного наведения на один и тоже пункт меню. Что я не так делаю ?
Меню отличное! Подредактировал и вышло так – flagmanstroy.kg
Привет! А не подскажите при помощи чего реализовано меню на сайте fdoctor.ru