Síganos en Facebook
Volver al Blog de Emenia

Lista desplegable y plegable con jQuery

Escrito el por

Supongamos que tenemos una lista de elementos, en el que cada elemento está compuesto por un titular y una descripción. Por ejemplo:

18 Wheels Extreme Trucker
Ya está aquí el último simulación de camiones dentro de la conocida serie 18 Wheels.
Simulación – PC CD-ROM

A Stroke of Fate: Operation Valkyrie
Basada en hechos históricos reales. El último atentado contra Adolf Hitler.
Aventura Gráfica – PC DVD-ROM

A Vampire Story
Una aventura gráfica tradicional creada por Bill Tiller, famoso por aventuras como The Dig, The Curse of Monkey Island e Indiana Jones.
Aventura Gráfica – PC DVD-ROM

Aion
Descubre un espectacular mundo online lleno de historias y leyendas.
On-Line - PC DVD-ROM

Airbus Fleet para FSX
Airbus Fleet te ofrece la oportunidad de pilotar la mayoría de la flota de aviones de Airbus. Add-On de Microsoft Flight Simulator
Add-on – PC CD-ROM

American Civil War
Juego de gran estrategia histórica creado por Philippe Thibaut, autor de Europa Universalis. El juego se desarrolla mediante turnos simultáneos y sitúa a los jugadores al frente de los bandos combatientes de la Guerra Civil Americana (1861- 1865).
Estrategia -PC CD-ROM

Around the World in 80 Flights
Circunnavega el globo, en rumbo este, desde el histórico aeródromo de Farnborough, en el Reino Unido, en un épico viaje de 80 etapas alrededor del mundo en este add-on para Microsoft FSX y FS2004.
Add-on – PC CD-ROM

Battle of Britain 2: Wings of Victory
Battle of Britain 2 “Wings of Victory” es un simulador de vuelo que recrea las famosas batallas aéreas que tuvieron lugar en el sur de Inglaterra en 1.940
Simulación – PC CD-ROM

Supongamos igualmente que sólo queremos que se vean los títulos y que la descripción se vea únicamente cuando hacemos click sobre el título correspondiente. Además, si hay alguna descripción ya abierta queremos que se cierre si hacemos click sobre otro título diferente o sobre el mismo título (un segundo click sobre el mismo).

¿Cómo lo hacemos? Con jQuery es muy sencillo.

Pero primero vamos a ver cómo escribimos el código de la lista. Lo más lógico es hacer una lista de definición o definition list:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<dl>
<dt>18 Wheels Extreme Trucker</dt>
<dd>Ya está aquí el último simulación de camiones dentro de la conocida serie 18 Wheels. Simulación - PC CD-ROM</dd>
 
<dt>A Stroke of Fate: Operation Valkyrie</dt>
<dd>Basada en hechos históricos reales. El último atentado contra Adolf Hitler.
Aventura Gráfica - PC DVD-ROM</dd>
 
<dt>A Vampire Story</dt>
<dd>Una aventura gráfica tradicional creada por Bill Tiller, famoso por aventuras como The Dig, The Curse of Monkey Island e Indiana Jones.
Aventura Gráfica - PC DVD-ROM</dd>
 
<dt>Aion</dt>
<dd>Descubre un espectacular mundo online lleno de historias y leyendas.
On-Line 	- PC DVD-ROM</dd>
 
<dt>Airbus Fleet para FSX</dt>
<dd>Airbus Fleet te ofrece la oportunidad de pilotar la mayoría de la flota de aviones de Airbus. Add-On de Microsoft Flight Simulator
Add-on - PC CD-ROM</dd>
 
<dt>American Civil War</dt>
<dd>Juego de gran estrategia histórica creado por Philippe Thibaut, autor de Europa Universalis. El juego se desarrolla mediante turnos simultáneos y sitúa a los jugadores al frente de los bandos combatientes de la Guerra Civil Americana (1861- 1865).
Estrategia -PC CD-ROM</dd>
 
<dt>Around the World in 80 Flights</dt>
<dd>Circunnavega el globo, en rumbo este, desde el histórico aeródromo de Farnborough, en el Reino Unido, en un épico viaje de 80 etapas alrededor del mundo en este add-on para Microsoft FSX y FS2004.
Add-on - PC CD-ROM</dd>
 
<dt>Battle of Britain 2: Wings of Victory</dt>
<dd>Battle of Britain 2 “Wings of Victory” es un simulador de vuelo que recrea las famosas batallas aéreas que tuvieron lugar en el sur de Inglaterra en 1.940
Simulación - PC CD-ROM</dd>
 
</dl>

A continuación cargamos jQuery. Podéis ver como hacerlo en este artículo: Curso de jQuery – Introducción.

Y a continuación escribimos el siguiente código dentro del header:

1
2
3
4
5
6
7
8
9
10
11
<script type="text/javascript">
    $(document).ready(function(){
      	$("dd").hide();
	$("dt").click(function(event){
             var desplegable = $(this).next();
             $('dd').not(desplegable).slideUp('fast');
              desplegable.slideToggle('fast');
              event.preventDefault();
              })
        });
</script>

Como veis es muy sencillo. Primero ocultamos todos los elementos dd con

1
$("dd").hide();

Luego decimos que al hacer click sobre un elemento dt se ejecute una función:

1
$("dt").click(function(event){

Como vemos a esta función le pasamos el evento como parámetro. El objeto evento da información sobre el evento que se invoca sobre cada elemento en cuestión y nos ofrece métodos que afectan a la progresión del evento, como veremos al final de la función.

A continuación asignamos a una variable que hemos denominado “despleglable” el elemento “dd” que sigue al elemento “dt” concreto sobre el que hemos hecho click:

1
var desplegable = $(this).next();

Como vemos eso lo conseguimos con $(this) que es como decir “este”, de todos los “dt” sólo este, sobre el que hemos hecho click.

A continuación buscamos cualquier “dd” que esté desplegado pero que no sea el recogido en la variable “desplegable”, y lo plegamos:

1
2
3
<script type="text/javascript">
 $('dd').not(desplegable).slideUp('fast');
</script>

Y a continuación desplegamos el “dd” concreto que almacenamos en la variable “desplegable” y lo plegamos si estaba desplegado:

1
  desplegable.slideToggle('fast');

Por último, cancelamos el evento si es cancelable para evitar que el efecto se propague:

1
 event.preventDefault();

De esta manera se detiene el efecto cuando hacemos click sobre un titulo y acabamos de hacer click sobre otro juntándose a la vez varios efectos de pliegue y despliegue.

Podemos ver la Demo en http://www.emenia.es/demos-blog/lista-desplegable/

Sigue a Juan en Twitter, en Google+, o suscríbete al RSS Feed de Emenia para estar al día de nuestros artículos.

Artículos relacionados

15 Comentarios a Lista desplegable y plegable con jQuery

  1. Miguel Ruiz dice:

    Hola, he hecho el tutorial paso a paso y me queda casi igual que el ejemplo, solo que a mi no se me cambia el cursor cuando paso por encima de el texto que se va a desplegar. Puedes verlo aquí: http://socialbit.blogspot.com/p/mi-glosario-es-la-transformacion-bits.html

    Habría que añadir alguna funcion al html?, algún onmouseover?.

    Gracias y un saludo!

  2. Miguel Ruiz dice:

    Gracias a tí Juan.
    He añadido la propiedad que me has dicho desde JQuery y ha funcinado!. La dejo aquí por si alguien la necesitara:

    1
    2
    
            $("dt").css({
            'cursor':'pointer'});

    (Se puede colocar por ejemplo justo despues de la función documet(ready))

    Un saludo!

  3. Bibiana dice:

    He hecho todo como se indica y he obtenido un menú similar, pero las definiciones de lista dd me quedan con la sangría correspondiente, no como en el ejemplo.

    Alguien sabe como solucionarlo?

    Saludos!

  4. martin dice:

    genial,

    acabo de ponerlo en práctica

    saludos

  5. martin dice:

    Juan:

    implementé con éxito el tutorial en un wordpress remoto (alojado en un servidor pago), pero esta vez quise implementarlo en wp en localhost y no funcionó,

    tienes alguna idea de como cargar jquery en localhost?

    aquí como cargue wordpress (me funciona en remoto pero no en localhost):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    function mi_inicio() {
    	if (!is_admin()) {
    		wp_deregister_script('jquery');
    		wp_register_script('jquery', 'http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js', false, '1.3.2', true);
    		wp_enqueue_script('jquery');
     
    		// cargar el fichero js de mi theme: js/theme.js
    		wp_enqueue_script('dimensions', get_bloginfo('template_url') . '/js/jquery.dimensions.js', array('jquery'), '1.0', true);
    		wp_enqueue_script('flotante', get_bloginfo('template_url') . '/js/flotante.js', array('jquery', 'dimensions'), '1.0', true);
    		wp_enqueue_script('desplegable', get_bloginfo('template_url') . '/js/desplegable.js', array('jquery'), '1.0', true);
    	}
    }
    add_action('init', 'mi_inicio');
    • Juan Diaz-Bustamante dice:

      Hola Martin,

      A mi me funciona en localhost sin problemas

      1
      2
      3
      4
      5
      
      if( !is_admin()){
         wp_deregister_script('jquery');
         wp_register_script('jquery', ("http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"), false, '1.4.4');
         wp_enqueue_script('jquery');
      }
      • martin dice:

        tampoco anduvo …

        copio y pego:

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        
        function mi_inicio() {
        	if( !is_admin()){
           wp_deregister_script('jquery');
           wp_register_script('jquery', ("http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"), false, '1.4.4');
           wp_enqueue_script('jquery');
         
         
        		// cargar el fichero js de mi theme: js/theme.js
        		wp_enqueue_script('dimensions', get_bloginfo('template_url') . '/js/jquery.dimensions.js', array('jquery'), '1.0', true);
        		wp_enqueue_script('flotante', get_bloginfo('template_url') . '/js/flotante.js', array('jquery', 'dimensions'), '1.0', true);
        		wp_enqueue_script('desplegable', get_bloginfo('template_url') . '/js/desplegable.js', array('jquery'), '1.0', true);
        	}
        }
        add_action('init', 'mi_inicio');
        • Juan Diaz-Bustamante dice:

          Es raro, igual tiene que ver con tu tema o el hook? Prueba a poner lo que puse yo tal cual en functions.php, sin meterlo dentro de ninguna función.

  6. martin dice:

    sobre el comentario mío anterior, aclaro que uso localhost pero conectado a internet , y es dentro de un child theme

    saludos

  7. martin dice:

    Juan:

    en realidad no se determinar si lo que NO se esta cargando es Jquery , o el script para el efecto desplegable (desplegable.js) en mi hook

    como determino si se esta cargando jquery? se puede determinar con el firebug?

    saludos

    • Juan Diaz-Bustamante dice:

      Com Web Developer, en Información/Ver código Javascript

      Con Firebug lo más sencillo es que viendo el código HTML haces click sobre el enlace de jQuery y tienes que ver el contenido del archivo

  8. martin dice:

    solucionado!

    el problema estaba en que no se cargaban los scripts, me equivoqué al pensar que el problema estaba con Jquery,

    lo solucioné dentro de mi hook, en la parte donde llamo a los scripts , cambie

    1
    
    'get_bloginfo('template_url')'

    por

    1
    
    ' get_stylesheet_directory_uri() '

    , dado que estoy usando un child theme de Twentyten

    gracias por la ayuda Juan,

    un abrazo desde argentina

  9. lei wong dice:

    buenas, muchas gracias por el codigo, ando con un problema….. hice todo lo que dice arriba, pero no se despliega, oculta el contenido dd pero el texto del titulo “dt” esta como texto comun, sin evento de click, la verdad es que no se que le pasa que no anda.

    jquery 1.7

Deja un comentario

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

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title="" rel=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

2011-2012 © Copyright Emenia S.L. - Creación y Diseño web \ Marketing Online \ Comunicación - Todos los derechos reservados.