Сегодня расскажу, как сделать оригинальное меню на jQuery.
Решил написать эту заметку, потому что я провозился не один час, чтобы сделать меню и все что вы здесь прочитаете моих рук дело.
Чтобы далеко не ходить и сразу решить для себя нужно ли читать эту статью дальше, посмотрите что в итоге у нас получится:

Неоднократно встречал на сайтах подобные меню, но когда я их видел, у меня не возникало желания посмотреть, как они реализованы. Недавно самому понадобилось сделать подобное меню, а конкретного решения я не знал, найти и посмотреть, как сделаны подобные меню на сайтах которые мне встречались, я не смог — с поисками у меня, как и прежде, сложно.
Первый блин комом
Первое что мне пришло на ум, для реализации этой задачи — это конечно создать картинки, поместить их на фон (css свойство background) и передвигать их с помощью функции animate() библиотеки jQuery . Но как оказалось animate() не умеет корректно работать с CSS свойством background-position, точнее нет возможности задать оба параметра X и Y (background-position:X Y), можно только X.
Чтобы решить эту проблему существует jQuery плагин (Background-Position Animations).
После его установки я смог создать такое меню, используя картинки вместо текста, но такой вариант мне показался крайне неудобным, ведь если, к примеру, нам нужно будет поменять название пункта меню, то придется перерисовывать картинки и переназначать размеры в CSS, а это очень неудобно.
Поэтому от такого варианта я отказался и решил сделать его с помощью CSS и HTML разметки.
Создаем меню
Чтобы создать такое меню без использования текстов-картинок и без подключения различных jQuery плагинов нужно не так уж и много.
Давайте разберем все по этапам:
1. В первую очередь, создадим меню в html:
<ul class="menu"> <li><a href="#">О сайте</a></li> <li><a href="#">Бизнес</a></li> <li><a href="#">Искусство</a></li> <li><a href="#">Живопись</a></li> <li><a href="#">Дизайн</a></li> <li><a href="#">Творчество</a></li> <li><a href="#">История</a></li> </ul>
2. Подключим библиотеку jQuery, если она еще не подключена: добавим в начало html документа такую строчку:
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
jQuery в данном случае подключается из репозитории Google. Разумеется, можно подключить как-то иначе.
3. Добавим CSS стили:
<style type='text/css' rel='stylesheet'>
/* сброс */
ul, li{ margin:0; padding:0; vertical-align:baseline; list-style:none; }
/* обязательные */
.menu li{ float:left; height:40px; overflow:hidden; }
.menu li a,
.menu li a div{ display:block; padding:0 20px; line-height:40px; }
.menu li a div{ margin:0 -20px; }
/* раскраска */
.menu{ position:absolute; margin:100px 10px; font:12px Georgia; }
.menu li{ border-right:1px dashed #999; text-transform:uppercase; }
.menu li a{ color:#4C596F; }
.menu li a:hover{ text-decoration:none; }
.menu li a div{ background:#F0F3F4; }
</style>
Как видите, я разделил стили на «обязательные» и те, которые отвечают за внешний вид меню и не влияют на корректную работоспособность jquery скрипта. Т.е. если удалить вторые стили, меню по-прежнему будет работать.
4. Добавляем jQuery код:
<script type="text/javascript">
(function($){
$(function(){
var munu = $('.menu li a');
munu.each(function(){
$(this).append('<div>'+ $(this).html() +'</div>');
});
munu.hover(
function(){
$(this).stop().animate( {marginTop:'-40px'}, 300 );
},
function(){
$(this).animate( {marginTop:'0'}, 500 );
}
)
})
})(jQuery)
</script>
Разберем немного код. В munu.each(...) мы добавляем внутрь ссылки (тега a) блок div с анкором ссылки, т.е. мы делаем как бы двух уровненный анкор ссылки, который в последствии будет двигаться. В munu.hover(...) задаем действие при наведении на ссылку: передвигаем её на 40 пикселей вверх.
Важно! Значение marginTop:'-40px' обязательно должно совпадать со значениями свойств в обязательных CSS стилях height: 40px и line-height: 40px (см. CSS стили).
Вот и все. Теперь, такое меню можно редактировать без лишних телодвижений.
Я уже говорил, что это меню — плод моей фантазии, поэтому хотелось бы увидеть то, как реализованы подобные менюшки на других сайтах. Если вдруг у вас есть примеры, поделитесь пожалуйста!
Еще раз напомню, что этот блог можно комментировать, задавать любые вопросы, подписаться на RSS, ретвитить все без исключения статьи и при этом не забывать, что всегда можно воспользоваться справочником по функциям WordPress, на русском 
На условиях обмена ссылками, можно заказать неплохие видео обзоры блогов — видео-блог Юрия Гусева.
- Предыдущие по меткам
- Предыдущие записи
- 3 способа построения циклов в WordPress ← 20.Июн.2011 // 21
- Произвольное меню в WP 3.0+ (wp_nav_menu) ← 16.Окт.2010 // 23
- Что такое цикл the loop в WordPress ← 20.Июл.2010 // 14
- Файл шаблона functions.php в WordPress ← 6.Окт.2010 // 15
- Пишем плагин: Методы деинсталяции плагинов ← 13 Июль 2011 // 6
- 3 способа построения циклов в WordPress ← 20 Июнь 2011 // 21
- Блок произвольных полей в админке WordPress своими руками ← 8 Июнь 2011 // 29
Хорошее меню, посмотри как реализовано здесь: http://www.sohtanaka.com/web-design/animate-navigation-with-css-jquery/
Фактически - одно и тоже.
Ага, те же яйца только с боку, как сказал один из комментаторов этого блога — легендарная фраза. Надо бы её запотентовать
Подход точно такой же, разница лишь в CSS. Уже разбираться не стал как там сделано, там все в купе, обязательные и не обязательные стили. jQuery код — почти копия.
Мне мой велосипед ближе, потому что понятнее.
Спасибо за ссылку!
Здравствуйте.
Версия WordPress 3.2.1
Вопрос по jQuery:
Для произвольного поля дата страницы нужно было сделать datepicker, для этого решил использовать jQuery UI, в листинге своего плагина я указал:
/* Цепляем более новую библиотеку jquery 1.6.2*/ wp_deregister_script('jquery'); wp_register_script('jquery', ("http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"), false, '1.6.2'); wp_enqueue_script('jquery'); /* Цепляем код диалога и календарика */ wp_register_script('jquery-ui-dialog.datepicker', (agro_tender_PLUGIN_URL."js/jquery-ui-1.8.15.dialog.datepicker.js"), false, '1.8.15'); wp_enqueue_script('jquery-ui-dialog.datepicker');Столкнулся со следующей проблемой - всё работает, кроме конструктора Меню в разделе Внешний Вид, а точнее не работает drug-and-drop, консоль JS выдаёт вот такое сообщение:
load-scripts.php:11 - Uncaught ReferenceError: jQuery is not defined
jquery-ui-1.8.15.dialog.datepicker.js:29 - Uncaught TypeError: undefined is not a function
Если оставить jquery 1.6.1 - который идёт по умолчанию в этой вервии WordPress то не работает datepicker, консоль JS выдаёт такую ошибку
Uncaught TypeError: Property '$' of object [object DOMWindow] is not a function
Хотя на сайте http://jqueryui.com/ сказано что jQuery UI 1.8.15 должен работать с jQuery 1.3.2+
Буду признателен за помощь.
Я бы рад помочь и вопрос довольно интересный. Но к сожалению в этом вопросе я слаб и помочь мне нечем
Разобрался сам - надо было весь JQuery код оборачивать вот в такую конструкцию:
(function ($) { // All your code here }(jQuery))Вот полная ветка на форуме по этой проблеме codex.wordpress.org
Очень понравился дизайн, в первую очередь - динамичностью и органичностью при этом. Воспользуюсь Вашими советами по jQuery плюшкам для сайта турагентства, по факту завершения примеры скину.
Спасибо, интересно.
Имеет ли смысл скачивать jQuery библиотеку и подключать с сайта?
И еще вопрос, можно ли воспользоваться?
Я реально как frontEnd ненавижу вот эту мутку писать стили в одну строку, особенно когда *ля исправляешь ошибки после умельцев разных
пс.все таки с помощью css3 это можно сделать проще и не подключать jQuery для замута небольшого
кстати, может пригодится написал статью как сделать кнопку демонстрации урока в wordpress