Раздвижное меню при помощи jQuery

Захотелось для одного моего проекта(о проекте немного позже, делаю :)) сделать какое-то вместительно и в тоже время компактное меню. А тут недавно мы наконец-то поставили двери в шкаф купе, от сюда и идея взялась.

Это у меня первый jQuery-плагин, думаю дальше будут еще.

Реализация очень простая. Набор списков(ul) для которых изначально выставляется overflow: hidden и ширина первого элемента списка. А при наведении ширину меняем до полной, аналогично при уходе курсора - выставляем опять ширину первого элемента для всего списка. Ширину элемента нужно брать при помощи .innerWidth() что бы учитывались отступы. И что бы не пересчитывать общую длину каждый раз, я ее ложу в атрибут списка при инициализации.

Весь код доступен на GitHub

И конечно же “как это сделано”:

HTML структура меню:

  • Yamaha

  • KTM

  • Ducati

  • Kawasaki

  • Audi

  • Honda

  • Suziki

  • BMW

  • Mercedes–Benz

  • Merida

  • TREK

  • Kellys

  • Comanche

CSS:

#header {
    background-color: #eee;
}
#header ul.menu,
#header ul.menu li {
    margin: 0;
    padding: 0;
    list-style-type: none;
    float: left;
}
#header ul.menu li {
    padding: 2px 5px;
}

#header ul.menu.gray,
#header ul.menu.gray li {
    background-color: #ddd;
}

И сам плагин:

(function($){

    $.fn.slide_menu = function(options) {

        var settings = {
            'animate': true,
            'animate-speed': 600
        }

        if (options) {
            $.extend(settings, options);
        }

        return this.each(function(){
            var _this = $(this);
            var li_first = $(_this.find('li:first'));

            _this.attr('full-width', _this.innerWidth());
            _this.height(li_first.innerHeight());
            _this.css('overflow', 'hidden');
            _this.width(li_first.innerWidth());

            _this.mouseenter(function(){
                var _this = $(this);
                var full_width = parseInt(_this.attr('full-width'));

                if (settings['animate']) {
                    var small_width = _this.find('li:first').innerWidth();
                    _this.animate({width: '+=' + (full_width - small_width)}, settings['animate-speed']);
                } else {
                    _this.width(_this.attr('full-width'));
                }
            });

            _this.mouseleave(function(){
                var _this = $(this);
                var small_width = _this.find('li:first').innerWidth();

                if (settings['animate']) {
                    var full_width = parseInt(_this.attr('full-width'));
                    _this.animate({width: '-=' + (full_width - small_width)}, settings['animate-speed']);
                } else {
                    _this.width(small_width);
                }
            });
        });
    }
})(jQuery);