¿Cómo crear un menú desplegable como el del tema Twenty Eleven?
Me gusta mucho la solución del menú desplegable del tema Twenty Eleven:
http://twentyelevendemo.wordpress.com/
y me gustaría crear uno similar pero no puedo entender cómo funciona, ¿está basado en algún código existente para menús desplegables?
¿Hay algún código fuente que se pueda utilizar, o alguien puede explicar el principio detrás de él?
Sé que internet está lleno de soluciones tanto con JavaScript como sin él, incluso he creado algunas yo mismo, pero en mi opinión nada se acerca a este menú, así que agradezco cualquier ayuda :)

Aquí hay un fragmento rápido que uso para comenzar mis proyectos:
El primer paso es agregar algo de código al archivo functions.php. Esto es lo que habilitará el Menú Personalizado de WordPress. Los controles estarán en Apariencia>Menús una vez que hayas terminado. Código para functions.php:
<?php
add_action( 'init', 'register_my_menus' );
function register_my_menus() {
register_nav_menus(
array(
'main' => __( 'Menú Principal' ),
'secondary-menu' => __( 'Menú Secundario' ),
));
}
?>
El código anterior permite dos menús. Te mostraré cómo agregar uno, y si quieres puedes usar el mismo método para agregar un segundo donde desees.
El siguiente paso es agregar el código al archivo header.php. Observa que arriba el primer menú en el array está etiquetado como main. Esto es lo que usaremos para colocar el menú en el header.php.
Aquí está el código para header.php:
<div id="menu" class="menu-center">
<?php wp_nav_menu( array( 'theme_location' => 'main' ) ); ?>
</div>
Esto debe colocarse dentro de tus <div id="header">
(no es obligatorio, pero es el lugar más común para este código).
El último paso es agregar algo de CSS para estilizar el menú y hacer que realmente "descienda", en lugar de ser un montón de enlaces multinivel.
El código 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;
}
Puedes jugar con el CSS para ajustarlo a tu gusto, pero esto debería darte un buen punto de partida.
Editado para compatibilidad con WordPress 3.3:
Después de actualizar a la última versión de WordPress (v3.3) parece que los menús no funcionarán si tu tema está usando el hook after_setup_theme y usas el hook 'init' para registrar los menús.
La solución:
Para este ejemplo usaré el nombre yourtheme como nombre_de_la_función.
Ejemplo de archivo 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() {
// Agrega estilos al editor visual (editor-style.css)
add_editor_style();
add_theme_support( 'automatic-feed-links' );
// Registrar Menús Personalizados
register_nav_menus(
array(
'main' => 'Menú Principal',
'secondary' => 'Menú Secundario',
)
);
// Agregar Miniaturas de Entradas y Tamaños de Imagen Personalizados
add_theme_support( 'post-thumbnails', array( 'post' ) );
// Agregar soporte para varios formatos de entrada
add_theme_support( 'post-formats', array( 'aside', 'link', 'gallery', 'status', 'quote', 'image' ));
}
endif; // yourtheme_setup
/**
* Comienza el resto del código de tu archivo functions.php...
*
*/
?>
Mira el archivo functions.php del tema TwentyTen para ver otras funciones que puedes incluir en el hook after_theme_setup.

Jeremy - Inserté ese código en functions, pero no aparece en mi "menú" bajo apariencia. ¿Hay algún lugar específico donde debería pegarlo??? ¡Gracias!

Solo necesita colocarse en el archivo functions.php. Asegúrate de que tu tema no esté usando 'register_my_menus'. Tal vez puedas cambiarlo a 'register_my_custom_menus'. Solo asegúrate de cambiar ambas instancias. Acabo de probarlo en un tema del repositorio que no venía con menús personalizados y funcionó bien. Algunas preguntas para ti: ¿Tu tema actual ya usa menús personalizados? ¿Es tu tema uno que pueda descargar? Lo revisaré si está disponible y si me da algún problema.

@Megan at Fiterature: Parece que hubo un problema. Por alguna razón, cuando lo probé en mi sitio usando la instalación beta de WordPress funcionó. Acabo de crear un nuevo sitio, instalé WordPress 3.3. Fue entonces cuando noté que los menús no se registraban como dijiste. Consulta el código anterior para ver la solución que lo solucionó para mí.

Estaba haciendo exactamente esto recientemente. No sé qué tan avanzado estás, así que puede que ya sepas algunas de estas cosas.
Encontré este video que es muy bueno (más su segunda parte)
Creo que una de las investigaciones originales que se hicieron fue esta
Creo que Twenty Eleven también usa el plugin jQuery Superfish
Como mencionó otro usuario, puedes encontrar el código de Twenty Eleven en algún lugar entre los archivos del tema
