Menú vertical desplegable con CSS

Crear un menú vertical desplegable sin necesidad de utilizar JavaScript es posible. Empleando CSS y HTML para crear las listas es suficiente.

En este artículo vamos a ver como crear un menú sencillo, vertical y desplegable creando la plantilla HTML y el código CSS necesario.

En el ejemplo que vamos a ilustrar presentamos unos estilos muy simples que pueden ser modificados muy fácilmente a través de la hoja de estilos CSS.

El menú vertical desplegable está pensado para situarlo en alguna de las columnas (izquierda o derecha) de tu página Web, así que deberás posicionarte en esa parte del código de tu página para añadir una lista anidada con ul y li dentro de un contenedor con id=»menu». En el caso del ejemplo en funcionamiento tenemos lo siguiente:

<div id="menu">
    <ul>
        <li class="has-sub"><a title="" href="https://www.jose-aguilar.com/tienda/es/3-prestashop">Prestashop</a>
            <ul>
                <li class="has-sub"><a title="" href="#">Módulos</a>
                    <ul>
                        <li><a title="" href="https://www.jose-aguilar.com/modulos-prestashop/es/3-backoffice">Administración</a></li>
                        <li><a title="" href="https://www.jose-aguilar.com/modulos-prestashop/es/4-busqueda-y-filtros">Búsqueda y filtros</a></li>
                        <li><a title="" href="https://www.jose-aguilar.com/modulos-prestashop/es/12-publicidad-y-marketing">Publicidad y Marketing</a></li>
                        <li><a title="" href="https://www.jose-aguilar.com/modulos-prestashop/es/8-front-office">Front Office</a></li>
                        <li><a title="" href="https://www.jose-aguilar.com/modulos-prestashop/es/7-exportacion-e-importacion">Importación y Exportación</a></li>
                        <li><a title="" href="https://www.jose-aguilar.com/modulos-prestashop/es/10-formas-de-pago">Formas de pago</a></li>
                        <li><a title="" href="https://www.jose-aguilar.com/modulos-prestashop/es/5-precios-descuentos-y-ofertas">Precio y Descuentos</a></li>
                        <li><a title="" href="https://www.jose-aguilar.com/modulos-prestashop/es/14-seo">SEO</a></li>
                        <li><a title="" href="https://www.jose-aguilar.com/modulos-prestashop/es/6-envios-y-logistica">Transporte y Logística</a></li>
                        <li><a title="" href="https://www.jose-aguilar.com/modulos-prestashop/es/13-redes-sociales">Redes Sociales</a></li>
                        <li><a title="" href="https://www.jose-aguilar.com/modulos-prestashop/es/15-modulos-gratis">GRATIS</a></li>
                    </ul>
                 </li>
                 <li><a title="" href="#">Themes</a></li>
             </ul>
        </li>
        <li class="has-sub"><a title="" href="https://www.jose-aguilar.com/blog/secciones/wordpress/">WordPress</a>
        <li class="has-sub"><a title="" href="https://www.jose-aguilar.com/blog/secciones/joomla/">Joomla</a>
    </ul>
</div>

El código anterior no es más que la lista de los elementos del menú con varios niveles. La clave del asunto está en la hoja de estilos que presentamos a continuación:

#menu {
    padding: 0;
    margin: 0;
    border: 0; 
}
 
#menu ul, li {
    list-style: none;
    margin: 0;
    padding: 0; 
}
 
#menu ul {
    position: relative;
    z-index: 597;
    float: left; 
}
 
#menu ul li {
    float: left;
    min-height: 1px;
    line-height: 1em;
    vertical-align: middle; 
}
 
#menu ul li.hover,
#menu ul li:hover {
    position: relative;
    z-index: 599;
    cursor: default; 
}
 
#menu ul ul {
    visibility: hidden;
    position: absolute;
    top: 100%;
    left: 0;
    z-index: 598;
    width: 100%; 
}
 
#menu ul ul li {
    float: none; 
}
 
#menu ul li:hover > ul {
    visibility: visible; 
}
 
#menu ul ul {
    top: 0;
    left: 100%; 
}
 
#menu ul li {
    float: none; 
}
 
#menu {
    width: 255px; 
}
 
#menu span, #menu a {
    display: inline-block;
    font-family: Arial, Helvetica, sans-serif;
    font-size: 12px;
    text-decoration: none; 
}
 
#menu:after, #menu ul:after {
    content: '';
    display: block;
    clear: both; 
}
 
#menu ul, #menu li {
    width: 100%; 
}
#menu li {
    background: #dddddd;
}
#menu li:hover {
    background: #f6f6f6; 
}
#menu a {
    color: #666666;
    line-height: 160%;
    padding: 11px 28px 11px 28px;
    width: 253px; 
}
#menu ul ul li {
    background: #f6f6f6; 
}
#menu ul ul li:hover {
    background: #dddddd; 
}
#menu ul ul li:hover a {
    color: #666666; 
}
#menu ul ul li ul li {
    background: #dddddd; 
}
#menu ul ul li ul li:hover {
    background: #b7b7b7; 
}
#menu .has-sub {
    position: relative; 
}
 
#menu .has-sub:after, #menu .has-sub > ul > .has-sub:hover:after {
    content: '';
    display: block;
    width: 10px;
    height: 9px;
    position: absolute;
    right: 5px;
    top: 50%;
    margin-top: -5px;
}
 
#menu .fa-angle-right {
    float: right;
}

Obteniendo como resultado:

menu-vertical-desplegable

Ver demo Descargar

Esta entrada ha sido actualizada el 05/11/2018.

Autor
Escrito por Jose Aguilar - Director ejecutivo y tecnológico en JA Modules. Experto programador PrestaShop y Experto programador WordPress.
Te ha servido? Valora esta entrada!
(22 votos, promedio: 5 de 5)
Comparte en las redes sociales
¿Buscas trabajo de programador?

19 respuestas a “Menú vertical desplegable con CSS”

  1. Jesús dice:

    Como puedo hacer que los submenú se muestren al mismo nivel, es decir que todos comiencen hasta arriba como en el primer item del menú, que no sea como escalón

    • Jose Aguilar dice:

      Hola Jesús,

      Para conseguir lo que necesitas tendrás que jugar con la posición absoluta de los niveles ajustando el atributo left de la hoja de estilos según tu conveniencia.

      Saludos

  2. Hector dice:

    Excelente, funciono de maravilla

  3. david dice:

    muy útil e ideal para proyectos que no puede usar muchos recursos.

  4. Raúl dice:

    Hola, ¿qué cambios habría que hacer en tu código para que las subcategorías se mostrasen debajo de su categoría padre y no a la derecha de la categoria padre? Es decir, al poner el ratón sobre «prestashop», se mostraría «modulos» y «themes» debajo de prestashop con una pequeña sangría y «wordpress», «joomla» y «proyectos» quedaría debajo de «modulos» y «themes» sin la sangria. Lógicamente solo habrá un nivel de subcategoría, no habría otro desplegable al poner el raton sobre «modulos» o «themes».
    Muchas gracias

  5. JC dice:

    Eres lo mejor de vida!!!!

  6. Xico Castañón dice:

    Buenas, esta muy entendible tu ejemplo y aun más para uno de novato, mi duda es como podría hacer para que en mi primer subcategoria apareciera una lista doble, ya que mi primer subcategoria tiene 26 elementos y para verlos todos se tiene que desplazar la ventana hacia abajo, en vez de eso me gustaria que aparecieran dos listas de 13, ojalá me pudieras orientar, saludos.

  7. lita dice:

    Gracias José, lo mejor que encotré relacionado en la web

  8. EXCELENTE TUTORIAL! justo lo que necesitaba

  9. UlyssesMAc dice:

    Hola que tal el ejemplo no funciona para internet explorer 10, saludos

  10. Negro dice:

    Muchisimas gracias, habia intentado hacerlo con la misma ideologia que el horizontal pero tenia conflictos despues de la primera subcategoria, excelente colaboracion, gracias

  11. Alvaro dice:

    Buenos días, esto es justo lo que andaba buscando pero tengo un problema. No soy ningún experto ni mucho menos en CSS y necesito trasladar esto al bloque de categorias de prestashop, ¿podrías indicarme cómo hacerlo? Es que no encuentro ningún módulo con estas características para instalar. Muchas gracias.

    P.D. Mi versión de PS en 1.5.6

  12. Rafael dice:

    Impresionante es justo lo que anda buscando gracias !!! Jose.

  13. heiner gonzalez neira dice:

    buenos días, soy un aprendiz, y este ejemplo me sirvió mucho, pero tengo un problema yo tengo una galería de fotos que quiero mostrar junto al menú pero no se puede, el menú sale debajo de la galería, o encima, mas no en linea como yo lo quiero.

    mi pagina es http://www.logisticarecreacionyeventos.com

    nesecito que me ayudes con este invonveniente, gracias.

    * { margin: 0; outline: none; }
    body { background-color: }
    .c { clear: both; }
    #wrapper { margin: auto; padding: 0 40px 60px 40px; width:100px;}
    h2 { padding: 20px 0 10px 0; font-size: 24px; line-height: 40px; font-weight: normal; color: #adc276; text-shadow: 0 1px 3px #222222; }



    #menu {
    padding: -10;
    margin: -10;
    border: 0;
    }

    #menu ul, li {
    list-style: none;
    margin: 5;
    padding: 1;
    }

    #menu ul {
    position: relative;
    z-index: 597;
    float: left;
    }

    #menu ul li {
    float: left;
    min-height: 1px;
    line-height: 1em;
    vertical-align: middle;
    }

    #menu ul li.hover,
    #menu ul li:hover {
    position: relative;
    z-index: 599;
    cursor: default;
    }

    #menu ul ul {
    visibility: hidden;
    position: absolute;
    top: 100%;
    left: 0;
    z-index: 598;
    width: 100%;
    }

    #menu ul ul li {
    float: none;
    }

    #menu ul li:hover > ul {
    visibility: visible;
    }

    #menu ul ul {
    top: -115;
    left: 95%;
    }

    #menu ul li {
    float: none;
    }

    #menu {
    width: 180px;
    }

    #menu span, #menu a {
    display: inline-block;
    font-family: Arial black, Helvetica, sans-serif;
    font-size: 14px;
    text-decoration: none;
    }

    #menu:after, #menu ul:after {
    content: »;
    display: block;
    clear: both;
    }

    #menu ul, #menu li {
    width: 100%;
    }
    #menu li {
    background: #99FFEE;
    }
    #menu li:hover {
    background: #FFFFEE;
    }
    #menu a {
    color: #111111;
    line-height: 160%;
    padding: 11px 28px 11px 28px;
    width: 144px;
    }
    #menu ul ul li {
    background: #99FFEE;
    }
    #menu ul ul li:hover {
    background: #FFFF88;
    }
    #menu ul ul li:hover a {
    color: #111111;
    }
    #menu ul ul li ul li {
    background: #99FFEE;
    }
    #menu ul ul li ul li:hover {
    background: #FFBBFF;
    }
    #menu .has-sub {
    position: relative;
    }

    #menu .has-sub:after, #menu .has-sub > ul > .has-sub:hover:after {
    content: »;
    display: block;
    width: 10px;
    height: 9px;
    position: absolute;
    right: 5px;
    top: 50%;
    margin-top: -5px;
    background-image: url(right.png);
    }
    #menu .has-sub > ul > .has-sub:after, #menu .has-sub:hover:after {
    background-image: url(right.png);
    }



    effectsDemo2 = ‘rain,stairs,fade’;
    var demoSlider_2 = Sliderman.slider({container: ‘SliderName_2’, width: 700, height: 500, effects: effectsDemo2,
    display: {
    autoplay: 4000,
    loading: {background: ‘#000000’, opacity: 0.7, image: ‘img/loading.gif’},
    buttons: {hide: true, opacity: 1, prev: {className: ‘SliderNamePrev_2’, label: »}, next: {className: ‘SliderNameNext_2’, label: »}},
    description: {hide: true, background: ‘#000000’, opacity: 0.7, height: 50, position: ‘bottom’},
    navigation: {container: ‘SliderNameNavigation_2’, label: »}
    }
    });

    Talleres Corporativo y consultorias
    Eventos Empresariales
    Alquiler de Material Rcreativo

    Potro Mecanico
    Inflable Resbaladero
    Inflable Multy PlayGround
    Inflable Saltarin Castillo
    Mini Inflable Saltarin

    Paquetes Recreativos

    Paquetes Recreativos Basicos
    Paquetes Recreativos Especiales

    Chiquy Baby
    La Mision del Pirata
    Paquete de Princesas
    Mini Feria Inflable
    Fiesta Vaquera

    Paquetes Recreativos Personalizados

    Sonido y Luces
    Personajes Infantiles
    Decoracion
    Contactenos

  14. Lennin dice:

    EXCELENTE EL MEJOR QUE PUDE CONSEGUIR Y RESOLVI CON ESTE, GRACIAS POR COMPARTIR

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Ver más sobre