He estado siguiendo uno de los mejores tutoriales sobre jQuery en internet y al ver el ejemplo de carlosssasd sobre un acordeón con CSS3 y HTML5 recordé que en el curso de jQuery nos muestran un ejemplo similar.
Lo he adaptado un poco para hacer el javascript más legible, sin funciones anónimas y al final ha quedado esto:
Ver demo: Acordeón en jQuery.
Es el mismo que se muestra en el tutorial en inglés pero como mencioné, adapté un poquito el javascript para que sea menos confuso.
Al final este es el HTML:
Código :
<!doctype html> <html> <head> <meta charset=utf-8> <title>Acordeón con jQuery</title> <link rel='stylesheet' href='styles.css'> </head> <body> <dl> <dt>Juegos Gratis</dt> <dd><a href='http://games-garden.com/'>Games-Garden.com</a></dd> <dt>Subir Imágenes</dt> <dd><a href='http://l4c.me/'>l4c.me</a></dd> <dt>Curso de CSS3</dt> <dd><a href='http://www.cristalab.com/css3/'>Cristalab.com/css3</a></dd> <dt>Tutoriales</dt> <dd><a href='http://www.cristalab.com/tutoriales/'>Cristalab.com/tutoriales</a></dd> </dl> <script src='https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js'></script> <script> function init() { $('dd').addClass('esconder'); $('dl').on('mouseenter', 'dt', mostrarDetalles); } function mostrarDetalles() { $(this).next() .slideDown() .siblings('dd').slideUp(); } init(); </script> </body> </html>
El HTML es muy simple, tenemos una 'definition list' (<dl>) que es una lista de artículos y su descripción. Los artículos se definen en el tag <dt> y la descripción en el tag <dd>.
Agregamos la librería jQuery que esta hospedada en Google ya que es posible que tus usuarios la tengan en su memoria cache aunque puedes descargarla y ponerla directamente en tu servidor (es mejor si por ejemplo trabajas 'off-line' y no tienes acceso a internet).
Las funciones de javascript son:
Código :
function init() { $('dd').addClass('esconder'); $('dl').on('mouseenter', 'dt', mostrarDetalles); }
Con jQuery, accedemos a todos los elementos dd y los escondemos con la clase 'esconder' que está definida en nuestro CSS. Recuerden, <dd> es la descripción del articulo. Ya veremos más adelante el CSS.
En la siguiente línea, con jQuery accedemos al elemento dl y le decimos que 'escuche' cuando el ratón esté sobre alguno de sus elementos dt y si es así, que ejecute la función mostrarDetalles.
Código :
function mostrarDetalles() { $(this).next() .slideDown() .siblings('dd').slideUp(); }
La función mostrarDetalles ha sido llamada por un dt por ende, en este caso jQuery $(this) es el dt que la ha llamado. Dicho dt le dice al siguiente elemento que se muestre (next().slideDown()) y a los demás elementos dd que se contraigan (slideUp()).
slideDown() y slideUp() son funciones de jQuery que expanden y contraen al elemento que las llama.
El CSS es muy básico, te toca a tí cambiarlo a tu gusto y hacerlo más atractivo.
Código :
body { background: #eee; margin: auto; text-align: center; width: 500px; } dt { background: #e3e3e3; border-bottom: 1px solid #c5c5c5; border-top: 1px solid white; cursor: pointer; font-weight: bold; font-size: 1.5em; line-height: 2em; } dd { margin: 0; padding: 1em 0; } .esconder { display: none; }
- Al body le damos un margen automático para que se centre en nuestro navegador, centramos el texto y le damos un ancho de 500 píxeles.
- Los dt tendrán un borde gris abajo y blanco arriba. Como queremos que los usuarios sepan que pueden interactuar con los dt, le agregamos la manita del cursor.
- Los dd tendrán de margen 0 y de padding 1em.
- La clase esconder, hace eso, esconde los elementos que la usen.
Listo! Prueba, descárgalo, cámbialo a tu gusto y utilízalo en tus proyectos
¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.
Por penHolder el 01 de Marzo de 2012
como cierro los paneles? es decir, paso el mouse, se abre; vuelvo a pasar, se cierra
Por Acreonte el 01 de Marzo de 2012
penHolder :
como cierro los paneles? es decir, paso el mouse, se abre; vuelvo a pasar, se cierra
En la funcion mostrarDetalles, cambia el slideDown por un slideToggle.
Código :
Toggle es 'cambiar', entonces si esta abierto, lo cerrara o viceversa.
Por penHolder el 01 de Marzo de 2012
Acreonte :
Código :
Toggle es 'cambiar', entonces si esta abierto, lo cerrara o viceversa.
hey cool tnx!
Por Nicolas el 01 de Marzo de 2012
Por Acreonte el 01 de Marzo de 2012
Nicolas-blog :
Es mas divertido sin el stop
nah... solo bromeo. Gracias por el tip! asi que chicus, agreguen lo que Nicolas menciona.
Por HtrMancera el 03 de Marzo de 2012
Por ocr1987 el 04 de Marzo de 2012
Por Acreonte el 05 de Marzo de 2012
Pepe-blog :
Juegos gratis
- diablo 3
- diablo 2
Es simple HTML. Por ejemplo yo lo haria usando listas sin orden (unordered list, <ul>):
Código :
Gracias a todos por sus comentarios
Por clindy el 05 de Marzo de 2012
Por Acreonte el 05 de Marzo de 2012
clindy :
Puedes mostrarnos tu codigo para hacer pruebas?
Por clindy el 05 de Marzo de 2012
http://infogrupo.info/chameleon-develop-web/conJQuery/acordeon-jquery.html
Por HtrMancera el 05 de Marzo de 2012
.siblings('div') por .siblings('article')
Por clindy el 05 de Marzo de 2012
Por alejo8591 el 05 de Marzo de 2012
Por Acreonte el 06 de Marzo de 2012
clindy :
http://infogrupo.info/chameleon-develop-web/conJQuery/acordeon-jquery.html
Cambia
Código :
por
Código :
Similar a lo que HtrMancera menciona. Por cierto, gracias HtrMancera, no recordaba siblings().
alejo8591 :
Gracias por tu comentario, aunque personalmente considero muy mala practica las funciones anónimas, pero quiza a alguna gente le hubiese interesado el tema (y aprender como NO hacer las cosas ).
Por clindy el 06 de Marzo de 2012
Por el 07 de Mayo de 2012
Por Acreonte el 08 de Mayo de 2012
-blog :
Se nota que no leíste el primer parrafo, donde mencioné el curso de Jeffrey Way y tienes razón, no cambie el CSS, pero si cambié el javascript.
-blog :
Aunque estoy de acuerdo contigo que plagiar no es bueno, no veo nada malo que alguien traduzca algo y lo comparta con los que no sabemos inglés. Amargado!
Por pablo el 27 de Septiembre de 2012
Por melquisedecwt el 11 de Enero de 2013
$('dd').addClass('esconder');
Pon lo siguiente:
$('dd').first().removeClass('esconder');
Por mk14 el 03 de Febrero de 2013
<script>
function init()
{
$('dd').addClass('esconder');
$('dl').on('click', 'dt', mostrarDetalles);
$('dl').on('click', 'dt', esconderDetalles);
}
function mostrarDetalles()
{
$(this).next()
//.stop(true, true)
.slideDown()
.siblings('dd').slideUp();
}
function esconderDetalles()
{
$(this).siblings('dd').slideUp();
//.stop(true, true);
}
init();
</script>
Pero lo que consigo es que se habra y se cierre en el 1r click, como lo hago para que se quede abierto y con el segundo click se cierre?
Gracias!