Pull to refresh

jQuery для начинающих. Часть 2. JavaScript Меню.

Reading time 8 min
Views 45K


В первой части были рассмотрены базовые принципы работы селекторов и приведены несколько примеров, в данной статье я постараюсь акцентировать внимание на реализации JavaScript меню для Вашего сайта.

Если Вам готовый код наглядней документации, то переходим от слов к делу, т.е. на страницу с примерами.


Slide меню


Два slide-меню на странице: вверху и внизу.



Кликаем по ссылке с классом «btn-slide», выезжает панель с меню.

Частично данный пример присутствует в первой части, так что особо углубляться в реализацию не буду, приведу лишь JavaScript код с пояснениями:

<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:

<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»:

	// создаем обработчик событий для ссылок с классом "btn-slide"
	$(".btn-slide").toggle(function(){
		// ... 1-ый клик по ссылке
		// возвращаем false
		return false;
	},function(){
		// ... 2-ой клик по ссылке
		// возвращаем false
		return false;
	});

Затем нам необходимо найти элемент с классом «panel» и выдвинуть его на 120 пикселей:
// идем по DOM'у на 2-а уровня вверх, внутри элемента (это div c классом left/right) находим нужный нам элемент и приращиваем ему 120 пикселей в ширину
$(this).parent().parent().find(".panel").animate({"width": "+=120px"}, "slow");
// заменяем класс кнопки (для изменение стрелочки)
$(this).toggleClass("active"); 


Соединяем это вместе:
$(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:

    <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:
    $('.topmenu ul li').hover(
        function() {
            // ...
        },
        function() {
            // ...
        }
    );


И отображаем под-меню:
// находим элемент ul и вызываем анимацию slideDown
$(this).find('ul').slideDown();
// изменяем фон выбранного элемента путем добавления класса active
$(this).addClass("active");


А теперь всё вместе:
$(document).ready(function(){
    $('.topmenu ul li').hover(
        function() {
            $(this).addClass("active");
            $(this).find('ul').slideDown();
        },
        function() {
            $(this).removeClass("active");        
            $(this).find('ul').slideUp('fast');
        }
    );
});


Drop-down AJAX меню


Горизонтальное выпадающее меню с подгрузкой элементов AJAX'ом.
Для начала нам понадобится само меню:
    <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:

<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:

$(document).ready(function(){
    $('.topmenu ul li').hover(
        function() {
            // ... тут необходимо внести изменения в код 
            $(this).addClass("active");
        },
        function() {
            // тут оставляем так как есть
            $(this).removeClass("active");        
            $(this).find('ul').slideUp('fast');
        }
    );
});

Теперь необходимо загрузить недостающие элементы меню посредством AJAX'a:
// получаем 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');
     }
});

Собираем:
$(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').slideDown();
                         li.removeClass('loading');
                    }
                });
            } else {
                $(this).find('ul').slideDown();
            }            
            $(this).addClass("active");
        },
        function() {            
            $(this).find('ul').slideUp('fast');            
            $(this).removeClass("active");
        }
    );
});


Drop-down меню


Вертикальное выпадающее меню. Достаточно простенький примерчик:



$(document).ready(function(){
    // добавить обработчик события hover
    $('.topmenu ul li').hover(
        function() {
            $(this).find('ul:first').slideDown();
        },
        function() {            
            $(this).find('ul:first').slideUp('fast'); 
        }
    );
    // всем элементам меню с вложенностью добавить символ »
    $('.topmenu li:has(ul)').find('a:first').append('»');
});


Float меню


Плавающее меню. Нам понадобится плагин Dimensions (дабы работали методы height() и width()). Ну с HTML я думаю, Вы разберетесь:



Теперь по порядку — начнем с получение информации о текущем расположении «плавающих» меню:

// получаем информацию из css о расположении верхнего меню
menu1 = parseInt($(".right").css("top").substring(0,$(".right").css("top").indexOf("px")));
// расположении нижнего меню вычисляем отталкиваясь от размеров окна (96 взято на глаз)
menu2 = $(window).height() - 96;


Далее, нам необходимо «повесить» свою функцию для события scroll:
$(window).scroll(function () { 
// тут будем перетаскивать наши меню
});


Ну и собственно наполнение:
$(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});
});


Так же добавим отображение/скрытие элементов подменю:
    // для всех элементов "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; 
    });


Так же Вы можете скачать все примеры в одном архиве.

Цикл статей


  1. jQuery для начинающих
  2. jQuery для начинающих. Часть 2. JavaScript Меню.
Tags:
Hubs:
+67
Comments 26
Comments Comments 26

Articles