Possiamo creare un accordion dall'effetto di espansione e contrazione composito con jQuery operando sia sul contenitore che sui contenuti dell'accordion. Di fatto useremo due effetti su due elementi distinti. Vediamo i dettagli dell'implementazione.
Abbiamo la seguente struttura HTML ripetuta:
<div class="accordion">
<h3>...</h3>
<div class="accordion-content">
<p>...</p>
</div>
</div>
Opereremo prima sull'elemento accordion-content
e quindi sul paragrafo al suo interno. Entrambi gli elementi vengono inizialmente nascosti grazie a regole CSS, che sono le seguenti:
div.accordion {
overflow: hidden;
font-size: 1.2em;
}
div.accordion h3 {
background: rgb(254,255,232); /* Old browsers */
background: -moz-linear-gradient(top, rgba(254,255,232,1) 0%, rgba(214,219,191,1) 100%); /* FF3.6+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(254,255,232,1)), color-stop(100%,rgba(214,219,191,1))); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, rgba(254,255,232,1) 0%,rgba(214,219,191,1) 100%); /* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(top, rgba(254,255,232,1) 0%,rgba(214,219,191,1) 100%); /* Opera11.10+ */
background: -ms-linear-gradient(top, rgba(254,255,232,1) 0%,rgba(214,219,191,1) 100%); /* IE10+ */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#feffe8', endColorstr='#d6dbbf',GradientType=0 ); /* IE6-9 */
background: linear-gradient(top, rgba(254,255,232,1) 0%,rgba(214,219,191,1) 100%); /* W3C */
height: 2em;
line-height: 2;
text-indent: 20px;
font-size: 1.4em;
border: 1px solid #ccc;
cursor: pointer;
border-radius: 12px;
}
div.accordion-content {
background: #ccc;
margin: 1em 0;
line-height: 1.4;
border-radius: 12px;
display: none;
}
div.accordion-content p {
margin: 0;
padding: 1em;
display: none;
}
Animeremo il primo elemento mostrandolo e attribuendogli un'altezza, mentre per il secondo useremo il metodo slideDown()
. Useremo lo stesso procedimento, ma all'inverso, per nascondere gli elementi:
$(function() {
$('div.accordion', 'body').each(function() {
var $div = $(this);
var $h3 = $('h3', $div);
var next = $h3.next();
var $p = $('p', next);
$h3.click(function() {
if(next.is(':hidden')) {
next.animate({
visibility: 'show',
height: 200
}, 'slow', function() {
$p.slideDown('slow');
});
} else {
$p.slideUp('slow', function() {
next.animate({
height: 0,
visibility: 'hide'
}, 'slow');
});
}
});
});
});
Nell'evento click
assegnato a ciascuna intestazione verifichiamo che l'accordion sia nascosto o meno. Se lo è, eseguiamo le animazioni sul contenitore e il paragrafo per mostrarli in sequenza. Se non lo è, nascondiamo entrambi gli elementi con un procedimento e una sequenza inversa.
Potete visionare l'esempio finale in questa pagina.