Как создать выпадающее меню как в теме Twenty Eleven?
Мне очень нравится решение выпадающего меню в теме twenty eleven:
http://twentyelevendemo.wordpress.com/
и я хотел бы создать подобное, но не могу понять, как оно работает, или оно основано на каком-то существующем коде для выпадающих меню?
Есть ли исходный код, который можно использовать, или кто-то может объяснить принцип его работы?
Я знаю, что интернет полон как JavaScript, так и не-JavaScript решений, я даже сам создавал некоторые, но, на мой взгляд, ничто не приближается к этому меню, поэтому буду благодарен за помощь :)

Вот краткий пример кода, который я использую для начала работы над своими проектами:
Первый шаг — добавить код в файл functions.php. Это включит кастомное меню в WordPress. Управление меню будет доступно в разделе Внешний вид > Меню после завершения настройки. Код для functions.php:
<?php
add_action( 'init', 'register_my_menus' );
function register_my_menus() {
register_nav_menus(
array(
'main' => __( 'main' ),
'secondary-menu' => __( 'Secondary Menu' ),
));
}
?>
Приведенный выше код позволяет создать два меню. Я покажу, как добавить одно, и вы можете использовать тот же метод для добавления второго в любом месте.
Следующий шаг — добавить код в файл header.php. Обратите внимание, что первое меню в массиве помечено как main. Это то, что мы будем использовать для размещения меню в header.php.
Код для header.php:
<div id="menu" class="menu-center">
<?php wp_nav_menu( array( 'theme_location' => 'main' ) ); ?>
</div>
Этот код должен быть помещен внутрь вашего <div id="header">
(это не обязательно, но это наиболее распространенное место для него).
Последний шаг — добавить CSS для стилизации меню и сделать его выпадающим, а не просто набором многоуровневых ссылок.
CSS код:
ul.menu,ul.menu ul,ul.menu li,ul.menu a {
display:block;
margin:0;
padding:0;
}
ul.menu ul {
display:none;
}
ul.menu li:hover {
z-index:999;
}
ul.menu li:hover > ul {
display:block;
position:absolute;
float:left;
}
ul.menu li {
float:left;
width:auto;
}
ul.menu ul li {
float:left;
width:190px;
}
ul.menu ul li ul {
float:left;
width:190px;
position:absolute;
left:100%;
top:0;
}
ul.menu-ver,ul.menu-ver ul {
width:14em;
}
div.menu-center ul.menu {
float:left;
position:relative;
left:50%;
}
div.menu-center ul.menu li {
position:relative;
left:-50%;
}
div.menu-center ul.menu li li {
left:auto;
}
ul.menu li a {
border-bottom:1px outset ghostwhite;
}
ul.menu li a {
padding:8px 12px 10px;
}
ul.menu li a:link,ul.menu li a:hover,ul.menu li a:visited,ul.menu li a:active {
text-decoration:none;
border-bottom:1px outset black;
}
ul.menu li {
background: #45484d;
background: -moz-linear-gradient(top, #45484d 0%, #000000 100%);
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#45484d), color-stop(100%,#000000));
background: -webkit-linear-gradient(top, #45484d 0%,#000000 100%);
background: -o-linear-gradient(top, #45484d 0%,#000000 100%);
background: -ms-linear-gradient(top, #45484d 0%,#000000 100%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#45484d', endColorstr='#000000',GradientType=0 );
background: linear-gradient(top, #45484d 0%,#000000 100%);
}
.menu-center {
float:right;
margin-right:95px;
}
ul.menu li a{
color:ghostwhite;
}
ul.menu li a:hover {
background: #efefef;
background: -moz-linear-gradient(top, #efefef 0%, #ffffff 100%);
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#efefef), color-stop(100%,#ffffff));
background: -webkit-linear-gradient(top, #efefef 0%,#ffffff 100%);
background: -o-linear-gradient(top, #efefef 0%,#ffffff 100%);
background: -ms-linear-gradient(top, #efefef 0%,#ffffff 100%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#efefef', endColorstr='#ffffff',GradientType=0 );
background: linear-gradient(top, #efefef 0%,#ffffff 100%);
color:black;
}
Вы можете изменять CSS по своему усмотрению, но этот код поможет вам начать.
Обновлено для совместимости с WordPress 3.3:
После обновления до последней версии WordPress (v3.3) оказалось, что меню не работают, если ваша тема использует хук after_setup_theme, а вы регистрируете меню через хук 'init'.
Решение:
В этом примере я буду использовать имя yourtheme как function_name.
Пример файла functions.php:
<?php
if ( ! isset( $content_width ) )
$content_width = 610;
add_action( 'after_setup_theme', 'yourtheme_setup' );
if ( ! function_exists( 'yourtheme_setup' ) ):
function yourtheme_setup() {
// Добавляет стили для визуального редактора (editor-style.css)
add_editor_style();
add_theme_support( 'automatic-feed-links' );
//Регистрация кастомных меню
register_nav_menus(
array(
'main' => 'main',
'secondary' => 'secondary',
)
);
// Добавление миниатюр записей и кастомных размеров изображений
add_theme_support( 'post-thumbnails', array( 'post' ) );
// Поддержка различных форматов записей
add_theme_support( 'post-formats', array( 'aside', 'link', 'gallery', 'status', 'quote', 'image' ));
}
endif; // yourtheme_setup
/**
* Остальной код functions.php...
*
*/
?>
Посмотрите файл functions.php темы TwentyTen, чтобы увидеть другие функции, которые можно включить в хук after_theme_setup.

Джереми - Я вставил этот код в functions.php, но он не появляется в разделе "Меню" под "Внешний вид". Может быть, есть определенное место, куда его нужно вставить??? Спасибо!

Код просто нужно поместить в файл functions.php. Убедитесь, что ваша тема не использует 'register_my_menus'. Возможно, стоит изменить его на 'register_my_custom_menus'. Главное — изменить оба вхождения. Я проверил это на теме из репозитория, которая изначально не поддерживала кастомные меню, и все работало. Несколько вопросов к вам: Использует ли ваша текущая тема кастомные меню? Доступна ли ваша тема для скачивания? Я проверю её, если она доступна, и если у меня возникнут какие-то проблемы.

@Megan at Fiterature: Похоже, была проблема. По какой-то причине, когда я тестировал это на своем сайте с бета-версией WordPress, все работало. Я создал новый сайт, установил WordPress 3.3. Именно тогда я заметил, что меню не регистрировались, как вы и сказали. Смотрите код выше для решения, которое помогло мне.

Я недавно занимался именно этим. Не знаю, насколько вы продвинуты, поэтому, возможно, уже знаете некоторые из этих вещей.
Я нашел это видео очень полезным (и его вторую часть).
Думаю, одним из оригинальных исследований было это.
Кажется, Twenty Eleven также использует jQuery плагин Superfish.
Как уже упомянул другой участник, вы можете найти код Twenty Eleven среди файлов темы.
