Aprende como hacer un acordeón desplegable con HTML, CSS y Jquery.

Share on Pinterest
Comparte con tus amigos










Enviar

En previos artículos, casi siempre hemos utilizado librerías de terceros para implementar diversos elementos de nuestra web. Esta vez lo implementaremos nosotros desde cero.

Se trata de un elemento muy usual en las web, donde al pulsar en un determinado sitio, barra, botón, etc, se expande más información relacionada que previamente estaba oculta, lo que se conoce como estilo acordeón. Muy parecido a lo que hace la librería Jquery UI y sus accordions https://jqueryui.com/accordion/

Para implementar este interesante elemento utilizaremos la librería de javascript Jquery, html y css.

Este sería el resultado final:

See the Pen Example Accordion by Enrique (@enriquearkas) on CodePen.0

Es muy sencillo de implementar. Sólo debemos saber lo básico de html, css, y un poco de las animaciones de jquery.

Como hacer un Acordeón con HTML, CSS y Javascript (Jquery)

Codigo HTML:

<div id="container-main">
    <h1>Mejores Jugadores Liga BBVA</h1>

    <div class="accordion-container">
        <a href="#" class="accordion-titulo">Messi<span class="toggle-icon"></span></a>
        <div class="accordion-content">
            <img src="http://e0.365dm.com/15/05/660x350/champions-league-barcelona-bayern-munich-soccer-messi_3299830.jpg?20150506214236" alt=""/>
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.

            Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
        </div>  
    </div>
    
    <div class="accordion-container">
        <a href="#" class="accordion-titulo">Cristiano<span class="toggle-icon"></span></a>
        <div class="accordion-content">
            <img src="http://www.abc.es/Media/201301/10/cristiano-ronaldo--644x362.jpg" alt=""/>
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.

            Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
        </div>
    </div>
</div>

Codigo CSS:

body{
    background: #ecf0f1;
}

#container-main{
    margin:40px auto;
    width:95%;
    min-width:320px;
    max-width:960px;
}

#container-main h1{
    font-size: 40px;
    text-shadow:4px 4px 5px #16a085;
}

.accordion-container {
    width: 100%;
    margin: 0 0 20px;
    clear:both;
}

.accordion-titulo {
    position: relative;
    display: block;
    padding: 20px;
    font-size: 24px;
    font-weight: 300;
    background: #2c3e50;
    color: #fff;
    text-decoration: none;
}
.accordion-titulo.open {
    background: #16a085;
    color: #fff;
}
.accordion-titulo:hover {
    background: #1abc9c;
}

.accordion-titulo span.toggle-icon:before {
    content:"+";
}

.accordion-titulo.open span.toggle-icon:before {
    content:"-";
}

.accordion-titulo span.toggle-icon {
    position: absolute;
    top: 10px;
    right: 20px;
    font-size: 38px;
    font-weight:bold;
}

.accordion-content {
    display: none;
    padding: 20px;
    overflow: auto;
}

.accordion-content p{
    margin:0;
}

.accordion-content img {
    display: block;
    float: left;
    margin: 0 15px 10px 0;
    width: 50%;
    height: auto;
}


@media (max-width: 767px) {
    .accordion-content {
        padding: 10px 0;
    }
}

Como vemos en el código HTML, tenemos dos contenedores <div> con clase accordion-container,  que contendrán toda la información de ese ítem, característica, sección, etc. En concreto tenemos un elemento <a> que representa el título, y es la barra horizontal con el nombre del jugador, y otro elemento div con clase accordion-content que en principio está oculta y que contiene una imagen del jugador y texto.

En este ejemplo se trata de un listado con dos jugadores, que al hacer click en cada uno de ellos se expande información relacionada. Si nos fijamos, también se cambia el icono de la derecha de la barra con “+” y “-“según este cerrado o abierto, esto lo logramos con código css.

Por último, queda lo más importante, implementar mediante jquery la acción de hacer click en la barra de título y como consecuencia se visualice u oculte la información según se encuentre visible o no el contenedor de información .accordion-content”

Codigo Jquery:

$(".accordion-titulo").click(function(){
		
   var contenido=$(this).next(".accordion-content");
			
   if(contenido.css("display")=="none"){ //open		
      contenido.slideDown(250);			
      $(this).addClass("open");
   }
   else{ //close		
      contenido.slideUp(250);
      $(this).removeClass("open");	
  }
							
});

En primer lugar guardamos en la variable “contenido” el objeto div que contiene la información, en este caso de uno de los jugadores, según donde hayamos pulsado, a través de la función next(), que coge el primer elemento hermano con clase .accordion-content

Seguidamente comprobamos si está oculto o no, y dependiendo del caso mostramos u ocultamos a través de dos funciones de jquery, con el objetivo de que el cambio no se produzca de forma brusca, sino animada.

slideDown() => Muestra el contenido de forma animada (slide).

slideUp() => Esconde el contenido de forma animada (slide).

Así de fácil es implementar nuestra propio estilo acordeón sin tener que recurrir a librerías externas como Jquery UI.

Share on Pinterest
Comparte con tus amigos










Enviar

Enrique de la Torre

Twitter Google + Linkedin Acerca de

46 respuestas a “Como hacer un Acordeón con HTML, CSS y Javascript (Jquery)”

  1. Pablo Meléndez Guerrero dice:

    ¿Se pude de alguna forma corregir el error que provoca que cuando es desplegado el contenido de un articulo la pagina te manda de vuelta al inicio?
    Gracias :3

  2. Abel Lopez Pani dice:

    Muy buen articulo Enrique, ojala hagan un videotutorial acerca de ello, gracias por el aporte.

  3. López Farfán José Alberto dice:

    No me sale el ejemplo, no hace el efecto acordeon

    • Enrique de la Torre dice:

      has cargado la librería Jquery?

      • juan gonzales dice:

        En mi caso tampoco pude hacerlo, no logro el efecto acordeón.
        Utilizo wordpress, ¿como debería realizar la llamada al JS desde mi plantilla y desde que parte de esta?
        Cual es la librería a importar y como realizarlo en wordpress?

        Saludos y disculpa la molestia.

  4. No se abre el contenido, tengo linkeado el js en mi de la siguiente manera:

    Y el container.js es el que ponen en el ejemplo que está primero, porque si se fijan, el que el pone en el ejemplo y el que está abajo en la guía, son diferentes…

    Espero alguien me pueda ayudar ya que veo que a varios les ha funcionado y la verdad no veo qué estoy haciendo mal.

  5. fernando garcia lopez dice:

    ya cargue las librerias y copie el codigo js de codepen pero no me sale, entonces que tengo que quitar y añadir?

  6. Javier Pulcini dice:

    Pregunta Enrique.

    Como puedo hacer para que, cuando abro un content (abierto), se cierren los otros ó el que este abierto anteriormente?
    Para que abra un solo content a la vez.

    Se entinde?. Gracias.

  7. Brian Alvarez dice:

    por alguna extraña razon no me funciona

    • Le Dicen Sebastián dice:

      a mí tampoco me funciona, creé la web pero al momento de intentar desplegar algún menú no pasa nada. Por favor ayuda.
      Gracias.

    • Eliza dice:

      jQuery(document).ready(function(){

      $(«.accordion-titulo»).click(function(){

      var contenido=$(this).next(«.accordion-content»);

      if(contenido.css(«display»)==»none»){ //open

      contenido.slideDown(250);

      $(this).addClass(«open»);

      }

      else{ //close

      contenido.slideUp(250);

      $(this).removeClass(«open»);

      }

      });

      });

      • Andres dice:

        recuerda importar el jquery.

        • Stefan Yujansson Sibaja dice:

          De donde se importa?

          • Andres dice:

            Hola que tal Stefan, Recuerda que este ejercicio utiliza JQuery como tal , entonces lo que tienes que hacer es importarla, en mi caso yo me baje el JS de jQuery entonces lo que hago es poner en mi CODIGO:

            pero tambien cabe la posibilidad de cargarlo de desde web con las CDN de google, seria algo así

            ahi lo que hace es importar la libreria Jquery…. con esto ya deberia de funcionarte , saludos!

  8. Oscar Mendiola dice:

    Una pregunta…
    Como le puedo hacer para que no puedan abrir todas?
    Que si tengo una abierta y quiero abrir otra, se cierre la primera que abrí?

    • Memo Barrientos dice:

      Lo único que tienes que hacer es, dentro del if en las dos primeras instrucciones, agregar:

      $(«.accordion-titulo»).removeClass(«open»);
      $(«.accordion-content»).slideUp(250);

      Espero que te sirva.

  9. VvCidR dice:

    Como hago para que cierre la que este abierta antes de abrir otra?? Gracias

  10. Jose Manuel Tello R dice:

    Buenas tardes dime por favor donde coloco el Codigo Jquery: en el HTML gracias

  11. Sofia dice:

    Hola, mi problema es el siguiente yo dentro de la acordeon quiero poner un boton pero al momento de ponerle on click no funcionada dentro del acordeon, a que se debe eso? no puedo usar botones y utilizarlos dentro de este ?

  12. Felipe cardona dice:

    hola, estoy teniendo un problema lo que sucede es que implemente el acordeon en un ciclo en php para que me trajera datos de una base en mysql, entonces por ende se me pusieron muchos acordeones y mucho scroll, el problema se origina cuando abro un acordeón la pagina se me va a la parte superior del scroll, como si tuviese un ancla, alguen sabe como solucionarlo?

    • Martin Jose Mirabal dice:

      hola tengo el mismo problema

      • fenix1997 dice:

        ya somos dos;tu ya lo solucionastes?bueno en realidad lo que me pasa a mi es que no se me logra quedar abierto me abre, pero se cierra en menos de 5 segundos

      • fenix1997 dice:

        mira esta es la solucion;asi lo solucione yo para un for;solo quitare lo del for y te servira o si lo necesitas pues usalo

        • Jhoann Posada dice:

          No se donde ponerlo para que no me suba la pagina

          jQuery(document).ready(function()
          {
          $(«.accordion-titulo»).click(function()
          {
          var contenido=$(this).next(«.accordion-content»);
          /*
          if(contenido.css(«display»)==»none»)
          { //open
          $(«.accordion-titulo»).removeClass(«open»);
          $(«.accordion-content»).slideUp(1000);
          contenido.slideDown(500);
          $(this).addClass(«open»);
          }
          else{ //close
          contenido.slideUp(250);
          $(this).removeClass(«open»);
          }
          */
          contenido.toggle();
          });
          });

  13. Memo Barrientos dice:

    Lo único que tienes que hacer es, dentro del if en las dos primeras instrucciones, agregar:

    $(«.accordion-titulo»).removeClass(«open»);
    $(«.accordion-content»).slideUp(250);

    Espero que te sirva.

  14. Exelente!!Falcon,Muy buen trabajo gracias.!!!!

  15. Pipe Muñoz dice:

    no me funciona

  16. Jair Andres Palma Choappa dice:

    hola buenas tardes
    ¿como puedo abrir automáticamente al cargar la pagina el primer content?
    saludos y gracias

  17. Natalia Martin dice:

    Holaa! no puedo descargar jquery, no me lo quiere abrir, ¿Qué hago? ayudaa, es un proyecto de la escuelaa

  18. Natalia Martin dice:

    Holaa! no puedo descargar jquery, no me lo quiere abrir, ¿Qué hago? ayudaa

  19. Lucía Etchemendy dice:

    Excelente!!!!! lo use y anduvo muy bien, incluso le agregue el código para cerrar cuando se abre otro!
    Mil gracias!!!!!

  20. natalia dice:

    Hola! necesito ayuda. tengo problemas debido a que no me resulta el menu acordeon.. hice todo paso a paso… alguien sabe donde pueda estar el error?

  21. Julio Enrique Cornejo dice:

    por que no me funciona, tengo problemas con el jquery, trabajo con brackets y me muestra herrores.

  22. Luis Hernandez dice:

    Hola, te queria preguntar como harias esto dentro de una tabla. Gracias

Deja una respuesta

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


Aprende con nuestros cursos

React y Firebase: El Curso Completo, Práctico y desde Cero

React y Firebase: Curso Completo, Práctico y desde Cero

En este curso aprenderás React desde lo mas básico y paso por paso hasta un nivel avanzado donde podrás crear sitios y aplicaciones web reales.

Inicia el curso

Diseño Web Profesional El Curso Completo, Practico y desde 0

Bienvenido al Curso de Diseño Web, el curso en el que aprenderás paso por paso y desde cero todo lo que necesitas para convertirte en un diseñador web.

Inicia el curso

Bootstrap 5: El Curso Completo, Práctico y Desde Cero

Aprende Bootstrap 4, el framework de diseño web mas importante del mundo.

Inicia el curso
PHP y MYSQL: El Curso Completo, Practico y Desde Cero

PHP y MYSQL: El Curso Completo, Practico y Desde Cero

Aprende a crear cualquier Aplicacion y Sitio Web!. Aprende PHP y MySQL.

Inicia el curso