Сегодня мы сделаем плагин jQuery одноуровневого меню в стиле "лава лампы". Лава лампа
- модный в 70-х годах прошлого века светильник, хотя и в наши дни он
пользуется популярностью благодаря своему гипнотизирующему эффекту
плавного перетекания полупрозрачных пузырей. Шаг 1. Разметка HTML
До того, как запустить в работу функционал плагина,
нужно создать форму, на которой будет базироваться его работа. Создаем
неупорядоченный список для элементов навигации, и импортируем jQuery и
jQuery UI с сайта Google.
view sourceprint?05 | < meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" > |
06 | < title >Пример для сайта RUSELLER.COM</ title > |
07 | < link href = "css/style.css" rel = "stylesheet" type = "text/css" /> |
15 | < li id = "selected" >< a href = "#" >Главная</ a ></ li > |
16 | < li >< a href = "#" >Обо мне</ a ></ li > |
17 | < li >< a href = "#" >Блог</ a ></ li > |
18 | < li >< a href = "#" >Портфолио</ a ></ li > |
19 | < li >< a href = "#" >Контакт</ a ></ li > |
Заметьте, что мы присвоили id "selected” ссылке на главную страницу.
Чтобы сделать функционал меню доступным для
использования в других проектах, сделаем наш небольшой скрипт плагином и
вызовем его на нашей странице следующим образом:
view sourceprint?
Так как мы решили сделать скрипт плагином, то для
него надо создать отдельный файл и присоединить его к нашей странице.
Файл плагина назовем jquery.spasticNav.js. А в код разметки в конце надо добавить следующие строки:
view sourceprint?1 | < script type = "text/javascript" src = "js/jquery.spasticNav.js" ></ script > |
3 | < script type = "text/javascript" > |
Шаг 2. Начинаем писать плагин
Чтобы уменьшить количество глобальных переменных,
которые нужно будет создать, а также чтобы исключить конфликты
использования символа $ в других скриптах, наш плагин будет реализован в
виде анонимной функции:
view sourceprint?
Теперь jQuery передается в наш плагин и будет доступен через символ $.
Хорошей практикой является предоставление
пользователю плагина как можно большей опций для настройки при
использовании. Для этого мы реализуем возможность передать в плагин
литеральный объект, с помощью которого можно будет изменить установки по
умолчанию. В набор опций плагина будет входить::
- Установка размера перекрытия нашего маленького "пузырька". Таким
образом мы опишем насколько далеко пузырек выступает над краями
навигационного меню.
- Установка скорости перемещения "пузырька".
- Установка времени сброса, который перемещает "пузырек" обратно на
пункт текущей страницы (предположим, что пользователь не нажал ни на
одну ссылку)
- Установка цвета "пузырька". Это можно сделать с помощью CSS, но тем не менее, опция очень удобна в использовании.
- Установка параметров эффекта перехода.
Теперь дадим имя нашему плагину и сделаем его эквивалентным функции. $.fn является псевдонимом для jquery.prototype.
view sourceprint?1 | $.fn.spasticNav = function (options) { |
Чтобы иметь возможность изменять установки по умолчанию функция принимает параметр "options”.
Шаг 3. Опции конфигурации
После того, как мы задали имя для нашего плагина нужно определить опции конфигурации:
view sourceprint?
Таким образом определяется переменная конфигурации,
устанавливаются значения по умолчанию, а затем производится расширение
до параметра, который передается в функцию. Таким образом, передаваемые
значения могут изменять установки по умолчанию. Например, при вызове
плагина можно сделать так::
view sourceprint?3 | easing : 'easeOutElastic' |
Указанные опции изменят установки по умолчанию, а для всех остальных опций все останется без изменений.
Шаг 4. Реализуем функционал плагина
Теперь можно организовать цикл, который будет
проходить по всем элементам, переданным плагину, и реализовывать
функционал "лава лампы". Для этого мы вызываем this.each для прохода по всем пунктам в наборе.
view sourceprint?1 | return this .each( function () { |
В данной функции мы создаем несколько переменных. Не
все из них получают значения сразу после создания, но так как JavaScript
поднимает все имена переменных наверх функции в любом случае, то
хорошей практикой будет объявление их наверху, а инициализация - по мере
надобности.
view sourceprint?2 | currentPageItem = $( '#selected' , nav), |
- nav : "Кэширует” this, обернутый в объект jQuery.
- currentPageItem : Содержит пункт списка с id="selected".
Мы передаем второй параметр для установки контекста поиска. Таким
образом не нужно проходить по всему DOM для того, чтобы найти данный
элемент.
- blob : За неимением лучшего определения скажем, что
данная переменная ссылается на выделяющий блок, который следует за
указателем мыши по меню.
- reset : Данная переменная хранит ссылку на функцию setTimeout, которая будет создана позже. Она нужна для вызова clearTimeout.
Теперь создадим реальный "пузырек":
view sourceprint?1 | $( '<li id="blob"></li>' ).css({ |
2 | width : currentPageItem.outerWidth(), |
3 | height : currentPageItem.outerHeight() + options.overlap, |
4 | left : currentPageItem.position().left, |
5 | top : currentPageItem.position().top - options.overlap / 2, |
6 | backgroundColor : options.color |
Причина того, что мы вызываем метод CSS, вместо того,
чтобы просто добавить класс, заключается в том, что данные значения
варьируются в зависимости от элементов списка текущей страницы. Таким
образом нам нужно использовать JavaScript для того, чтобы получить
реальные значения.
- width: получаем ширину currentPageItem, включая любые рамки и отступ.
- height: получаем высоту currentPageItem, включая любые рамки и отступ. Также добавляется величина overlap, чтобы "пузырек" выступал за меню.
- left: устанавливаем свойство left "пузырька" равным положению слева currentPageItem. (Мы должны установить позиционирование контекста в CSS для данного значения, чтобы получить эффект.)
- top: устанавливаем свойство top и центрируем "пузырек" по вертикали.
- backgroundColor: устанавливаем цвет фона.
В завершении мы добавляем новый элемент списка к this, или #nav.
Теперь нужно сохранить ссылку на #blob. Таким образом нам не нужно будет просматривать DOM каждый раз, когда мы захотим получить доступ к нему. Переменная blob была объявлена наверху функции, теперь инициализируем ее.
view sourceprint?
Шаг 5. Событие hover
Теперь мы должны "слушать", когда пользователь передвинет указатель мыши на пункт списка (исключая #blob) нашего навигационного меню. Когда событие произойдет, мы устанавливаем свойства width и left "пузырька" равными свойствам элемента, на котором произошло событие.
view sourceprint?01 | $( 'li:not(#blob)' , nav).hover( function () { |
06 | left : $( this ).position().left, |
07 | width : $( this ).width() |
10 | duration : options.speed, |
11 | easing : options.easing, |
17 | reset = setTimeout( function () { |
19 | width : currentPageItem.outerWidth(), |
20 | left : currentPageItem.position().left |
Приведенный скрипт выполняет следующие операции:
- Получаем все пункты списка (за исключением #blob) в навигационном меню, и когда курсор мыши проходит над объектом, выполняем функцию.
- Анимируем "пузырек" и устанавливаем значения left и width равными соответствующим свойствам пункта списка, над которым находится курсор мыши.
- Передаем литеральный объект в качестве второго параметра для функции animate, и устанавливаем длительность и параметры перехода равными конфигурационным опциям плагина. Устанавливаем свойство queue в значение false для предотвращения включения анимации в очередь.
- Когда курсор мыши сдвигается с пункта списка меню, вызываем
setTimeOut, которая сдвигает "пузырек" обратно к текущей позиции. Если
не сделать этого, и пользователь не нажмет на ссылку навигации, меню
будет показывать пункт, над которым находился курсор мыши в последний
раз, а не текущую страницу. Данное действие возвращает "пузырек"
обратно к currentPageItem.
Вот и весь код. "Это очень простой плагин! Далее мы зададим стиль для навигационного меню.
Шаг 6. Задаем стили меню
Без использования стилей наше меню будет выглядеть следующим образом:
Изменим стиль для элемента <ul> #nav. Открываем файл style.css и добавляем в него следующие строки:
view sourceprint?
Затем добавляем стиль для элементов списка:
view sourceprint?4 | border-right : 1px solid #4a4a4a ; |
5 | border-left : 1px solid black ; |
Просто сдвигаем все элементы влево и добавляем каждому рамку:
Затем задаем стиль для тегов ссылок в навигационном меню:
view sourceprint?07 | font-family : helvetica , arial , sans-serif ; |
08 | text-decoration : none ; |
Устанавливаем цвет, сдвигаем влево, устанавливаем значения для шрифта и отступы. Обратите внимание на свойство z-index. Такое значение необходимо и вскоре будет понятно почему.
Так как мы не используем полный сброс свойств с нашей
таблице стилей, то нужно установить значения по умолчанию для отступов и
полей для наших элементов ul и li для того, чтобы избежать возможных проблем.
view sourceprint?
И в завершение устанавливаем стиль для "пузырька":
view sourceprint?02 | border-right : 1px solid #0059ec ; |
03 | border-left : 1px solid #0059ec ; |
08 | background : -moz-linear-gradient( top , #0b2b61 , #1153c0 ); |
09 | background : -webkit-gradient(linear, left top , left bottom , from( #0b2b61 ), to( #1153c0 )); |
10 | -moz-border-radius: 4px ; |
11 | -webkit-border-radius: 4px ; |
12 | -moz-box-shadow: 2px 3px 10px #011331 ; |
13 | -webkit-box-shadow: 2px 3px 10px #011331 ; |
Мы устанавливаем цвета для рамки и фона (включая
свойства CSS3 для градиентов/рамки/тени для Firefox и Safari/Chrome).
Здесь снова используется свойство z-index. Без него "пузырек" вывдился бы поверх всего текста в навигационном меню. чтобы избежать этого, нужно установить свойство z-index "пузырька" меньше, чем у пункта списка! Также нужно установить абсолютное позиционирование для использования значений top и left в плагине.
Готово!