Dropdown con jQuery

jQuery

En este tutorial vamos a ver cómo puedes crear un menú con elementos dropwdown utilizando jQuery. Si no sabes usar jQuery, consulta primero el tutorial de introducción a jQuery.

Un dropdown es un elemento de un menú que muestra un submenú cuando haces clic en él. Estos elementos suelen representarse mediante una flecha apuntando hacia abajo, indicando la dirección en la que se desplegará el menú.

Si quieres agregar este elemento, comienza por incluir el script de jQuery y a luego sigue los pasos que verás a continuación.

Versión simplificada

Primero agregaremos el código HTML, en el que definimos un elemento semántico de tipo <nav> que contendrá un menú en su interior. El menú se compone de una lista cuyos elementos contienen un enlace. Además, en caso de agregar un dropdown, añadimos otra lista de enlaces con la clase .dropdown al mismo nivel que el enlace de menú.

<h1>Dropdown</h1>

<nav>
  <ul>
    <li>
      <a href="#">Dropdown A</a>
      <ul class="dropdown">
        <li><a href="#">Enlace A1</a></li>
        <li><a href="#">Enlace A2</a></li>
        <li><a href="#">Enlace A3</a></li>
      </ul>
    </li>
    <li>
      <a href="#">Enlace B</a>
    </li>
  </ul>
</nav>

A continuación vamos a agregar el código jQuery que nos permitirá interactuar con el dropdown. Vamos a detectar cualquier clic en un enlace del menú que contenga más de un elemento. Para ello usamos el selector 'nav ul li a:not(:only-child)'. De este modo, la acción se asociará exclusivamente a los elementos del menú que también contengan un submenú.

En el interior de la función que agregamos como acción, cambiamos la visibilidad del elemento del elemento .dropdown que se incluye junto con el enlace en el que hemos hecho clic. Para ello usamos el método siblings('.dropdown'), que sirve para seleccionar los nodos hermanos del elemento actual que tengan la clase especificada.

Seguidamente, seleccionamos todas las listas con la clase .dropdown que haya en el menú, salvo la actual, y las ocultamos. Además, también usamos el método event.stopPropagation() para que se deje de computar el clic en otros elementos tal y como hemos podido ver en este tutorial.

$("nav ul li a:not(:only-child)").click(function(event) {
  $(this).siblings(".dropdown").toggle();

  $(".dropdown").not($(this).siblings()).hide();
  event.stopPropagation();
});

$(document).click(function() {
  $(".dropdown").hide();
});

Finalmente, detectaremos también cualquier clic en el documento HTML y asociaremos una acción que cierre todos los menús. Esta función se ejecutará siempre y cuando no se haga clic en un enlace con un dropdown, gracias al método event.stopPropagation() que hemos definido.

Ahora vamos a ocultar poo defecto todos los dropdowns mediante CSS:

.dropdown {
  display: none;
}

Y con esto ya estaría todo listo. Puedes ver el resultado en funcionamiento aquí.

Versión avanzada

Vamos a mejorar algo el aspecto de nuestro menú. Para ello bastará con que agreguemos algunos estilos CSS. Vamos a hacer que los elementos del menú se muestren en horizontal y que los dropdowns se muestren debajo de cada elemento al que pertenecen. Agregaremos también una flecha apuntando hacia abajo en los elementos que incluyan un dropdown:

html {
  min-height: 100%;
  font-family: 'Nunito', sans-serif;
}

body {
  background: #7db4fc;
  line-height: 1.5;
}

h1 {
  font-weight: 200;
  font-size: 3rem;
  color: #fff;
  text-align: center;
}

nav {
  margin: 0 auto;
  max-width: 400px;
  color: #222222;
  background:#f6f7f9;
}

nav::after {
  display: block;
  content: '';
  clear: both;
}

nav ul {
  padding: 0;
  margin: 0;
  list-style: none;
}

nav ul li {
  float: left;
  position: relative;
}

nav ul li a {
  display: block;
  color: #222222;
  text-decoration: none;
  padding: 1rem;
}

nav ul li a:hover,
nav ul li a:focus {
  background: #e7e9ef;
  color: #000;
}

nav ul li a:not(:only-child)::after {
  padding-left: 4px;
  content: ' ▾';
}

nav ul li ul li {
  min-width: 200px;
}

nav ul li ul li a {
  background: transparent;
  color: #4a5666;
  border-bottom: 1px solid #DDE0E7;
}

.dropdown {
  display: none;
  position: absolute;
  margin-top: 8px;
  background: #f6f7f9;
  box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);
}

.dropdown::after {
  content: '';
  position: absolute;
  left: 25px;
  top: -8px;
  border-left: 8px solid transparent;
  border-right: 8px solid transparent;
  border-bottom: 8px solid white;
}

.dropdown:hover::after {
  border-bottom: 8px solid #F6F7F9;
}

Y con esto ya estaría listo. Puedes ver el resultado en funcionamiento aquí.


Avatar de Edu Lazaro

Edu Lázaro: Ingeniero técnico en informática, actualmente trabajo como desarrollador web y programador de videojuegos.

👋 Hola! Soy Edu, me encanta crear cosas y he redactado esta guía. Si te ha resultado útil, el mayor favor que me podrías hacer es el de compatirla en Twitter 😊

Si quieres conocer mis proyectos, sígueme en Twitter.

Deja una respuesta

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

“- Hey, Doc. No tenemos suficiente carretera para ir a 140/h km. - ¿Carretera? A donde vamos, no necesitaremos carreteras.”