Pull to refresh

«Плавающее» меню на jQuery для начинающих

Reading time3 min
Views36K
image

Данная статья призвана помочь начинающим разработчикам jQuery. Сам я – новичек, поэтому хотелось бы поделиться опытом с такими же людьми, как я.

Передо мной стояла задача создать «Плавающее» меню на сайте очередного клиента, так как CMS под проект была выбрана не лучшая (Joomla 1.5), а найти адекватный готовый модуль и подстроить его под свои нужды казалось невероятно трудоемким занятием, было решено написать свой «плагин»(именно в кавычках, результат с трудом можно назвать плагином) для плавающего меню.

Результатом выполнения задания является не очень оптимизированный, возможно, где-то нелогичный код, но он был разработан самостоятельно и, я надеюсь, поможет новичкам столкнувшимся с подобной задачей.

Было создано решение, которое в дальнейшем можно встроить практически в любую систему.

Разметка меню в данном конкретном случае имеет вид:
<div id="topMenu">
<div id="activeMenu" style="left: -999px; width: 0px;"></div>
    <ul>
        <li><a href="#" class="mainlevel" id="active_menu">Пункт 1</a></li>
        <li><a href="#" class="mainlevel">Пункт 2</a></li>
        <li><a href="#" class="mainlevel">Пункт 3</a></li>
        <li><a href="#" class="mainlevel lastMenuItem">Пункт 4</a></li>
    </ul>
</div>​

Элемент activeMenu, собственно, и есть тот самый «плавающий» элемент. Разметку меню можно изменить под свои нужды, при этом не забыв подправить jQuery код.

CSS данного примера:
#topMenu{
    clear: both;
    position: relative;
    overflow: hidden;
    top: 23px;
    margin-left: 14px;
}
#topMenu a{
    font-family: Arial;
    font-size: 12px;
    font-weight: bold;
    text-transform: uppercase;
    color: #686868;
    text-decoration: none;
    display: block;
    float: left;
    height: 32px;
    vertical-align: middle;
    padding-top: 14px;
    padding-left: 20px;
    padding-right: 20px;
    border-left: 1px solid #ccc;
    z-index: 2;
    position: relative;
}
#topMenu a:hover{
    text-decoration: none;
    color: #3d3d3d;
}
#topMenu a.lastMenuItem{
    border-right: 1px solid #ccc;
}
#activeMenu{
    position: absolute;
    width: 0px;
    height: 47px;
    left: -999px;
    background: #c0c0c0;
    z-index: 1;
}


Ну и, собственно, сам jQuery код с комментариями:
jQuery(document).ready(function(){
    if(jQuery("#active_menu").length>0){ // если есть активный пункт меню, то позиционируем двигающуюся плашку на нем
        var menuWidth = jQuery("#active_menu").outerWidth(); // определяем ширину активного пункта меню
        var menuLeft = jQuery("#active_menu").position().left; // определяем смещение активного пункта меню слева
        jQuery("#activeMenu").stop().animate({ // анимируем движущуюся плашку
            left: menuLeft+'px',
            width: menuWidth+'px'
        }, 500, 'linear');
    }
    jQuery("#topMenu a.mainlevel").mouseover(function(){ // поведение движущейся плашки при наведении на любой пункт меню. Все тоже самое, что и при наличии активного пункта, только позиция плашки определяется относительно пункта, на который произошло наведение курсора мыши
            var menuWidth = jQuery(this).outerWidth();
            var menuLeft = jQuery(this).position().left;
            jQuery("#activeMenu").stop().animate({
                left: menuLeft+'px',
                width: menuWidth+'px'
            }, 300, 'linear');      
    });
    jQuery("#topMenu").mouseleave(function(){ // поведение плашки при окончании события наведения мыши на пункт меню (выход курсора мыши на пределы блока, в котором содержится меню)
        if(jQuery("#active_menu").length<=0){ // если активного пункта нет, то перемещаем плашку за границу экрана
            jQuery("#activeMenu").stop().animate({
                left: '-999px',
                width: '0px'
            }, 500, 'linear');
        }
        else{ // иначе, если есть активный пункт меню – возвращаем плашку на него
            var menuWidth = jQuery("#active_menu").outerWidth();
            var menuLeft = jQuery("#active_menu").position().left;
            jQuery("#activeMenu").stop().animate({
                left: menuLeft+'px',
                width: menuWidth+'px'
            }, 500, 'linear');
        }
    });
});
​


Не претендую на идеальность или даже сносность написанного кода, буду рад конструктивной критике – поможет как и мне, так и новичкам, прочитавшим данную статью.

Демо посмотреть можно здесь – jsfiddle.net/bYY6Y/7

Правки от yurik417:
А по поводу конструктивной критики:
1. Анимация у вас при разных событиях ведь одинаковая, поетому следует написать одну лишь функцию и вызывать ее когда это нужно.
2. Вы постоянно обращаетесь к одним и тем же элементам и у вас постоянно идет поиск по DOM — это неправильно. Следует закешировать эти элементы в переменных
3. Ну и почитайте про событие .on()
jsfiddle.net/bYY6Y/71/
Tags:
Hubs:
Total votes 15: ↑8 and ↓7+1
Comments12

Articles