Lo slideshow che presenterò in questo articolo è più complesso rispetto agli altri visti in precedenza, in quanto oltre all'effetto di scorrimento sono presenti un cursore mobile ed un'animazione su ciascuna slide. In linea di massima i princìpi sono gli stessi di molti altri slideshow, con l'unica eccezione che in questo esempio è necessario operare prima sul DOM. Vediamone i dettagli.
Abbiamo la seguente marcatura:
<div id="gallery">
<div id="gallery-wrapper">
<div class="img-wrapper">
<img src="1.jpg" alt="" />
</div>
<!-- altre slide -->
</div>
</div>
<div id="controls">
<a href="#">
<img src="1-thumb.jpg" alt="" />
</a>
<!-- altri link-->
<div id="cursor"></div>
</div>
Notiamo che:
- la navigazione tra le slide avviene mediante i link posti all'interno dell'elemento
controls
, i quali a loro volta contengono delle miniature delle immagini - il cursore di posizione è già stato inserito all'interno dell'elemento che contiene i controlli dello slideshow
Vogliamo che in ciascuna slide l'immagine principale scompaia per far posto alla miniatura e che il cursore segua il movimento del mouse e mantenga la posizione sul link corrente. Prepariamo il nostro CSS:
#gallery {
width: 550px;
height: 400px;
position: relative;
overflow: hidden;
margin: 0 auto;
}
#gallery-wrapper {
width: 3300px;
height: 400px;
position: relative;
}
div.img-wrapper {
float: left;
width: 550px;
height: 400px;
position: relative;
background: #d34545;
}
div.img-wrapper img {
width: 100%;
height: 100%;
display: block;
}
div.img-wrapper img.thumb {
width: 100px;
height: 100px;
position: absolute;
top: 50%;
left: 50%;
margin: -50px 0 0 -50px;
display: none;
}
#controls {
width: 550px;
margin: 1em auto;
height: 95px;
position: relative;
}
#controls a {
float: left;
width: 85px;
height: 85px;
margin-right: 5px;
}
#controls a img {
display: block;
height: 100%;
width: 100%;
border: none;
}
#cursor {
width: 0px;
overflow: hidden;
height: 10px;
background: #d34545;
position: absolute;
bottom: 0;
left: 0;
}
La miniatura sarà posizionata in modo contestuale all'interno di ciascuna slide. Il cursore verrà spostato usando il posizionamento assoluto.
Con jQuery dobbiamo innanzitutto mettere in relazione i link presenti nella barra dei controlli con le slide corrispondenti. Inoltre dobbiamo copiare le miniature in ciascuna slide e assegnare loro la classe CSS thumb
. Ecco come:
var wrapper = $('#gallery-wrapper', '#gallery');
$('div.img-wrapper', wrapper).each(function(i) {
var $div = $(this);
$div.attr('id', 'slide-' + (i+1));
$('a', '#controls').eq(i).
attr('rel', $div.attr('id'));
var $img = $('a', '#controls').eq(i).find('img').clone();
$img.attr('class', 'thumb');
$img.appendTo($div);
});
- abbiamo assegnato a ciascuna slide un ID progressivo usando l'indice dell'array usato nel ciclo
each()
(slide-1
,slide-2
ecc.) - abbiamo assegnato a ciascun link nella barra dei controlli un attributo
rel
impostandolo sull'ID creato per ciascuna slide - abbiamo clonato ogni miniatura presente in ciascun link di controllo, le abbiamo assegnato la classe
thumb
e quindi l'abbiamo inserita in ciascuna slide
A questo punto la barra dei controlli e le slide sono collegate tra di loro e le miniature sono al loro posto all'interno di ciascuna slide. Ora possiamo implementare le animazioni principali:
$('a', '#controls').each(function() {
var $a = $(this);
var id = '#' + $a.attr('rel');
var slide = $(id, wrapper);
var left = slide.position().left;
var thumb = slide.find('img.thumb');
$a.click(function(event) {
$('img.thumb', wrapper).hide();
$('img', wrapper).not('img.thumb').show();
wrapper.animate({
left: - left
}, 'slow', function() {
$('img', slide).not('img.thumb').
fadeOut('slow', function() {
thumb.fadeIn('slow');
});
});
event.preventDefault();
});
// continua
});
Quando si clicca su una miniatura, usiamo l'ID ottenuto unendo il carattere #
con il valore dell'attributo rel
di ciascun link per selezionare la slide corrispondente. Di questa slide useremo l'offset sinistro per far scorrere il contenitore principale. Quando l'effetto di scorrimento è completato, l'immagine principale della slide scompare per far posto alla miniatura. Ovviamente prima di tutto questo dobbiamo sempre resettare le immagini all'interno dello slideshow usando il seguente codice:
$a.click(function(event) {
$('img.thumb', wrapper).hide();
$('img', wrapper).not('img.thumb').show();
// continua
});
Ora dobbiamo animare il cursore facendolo spostare quando l'utente muove il mouse su una miniatura:
$a.mouseover(function() {
$('#cursor', '#controls').stop(true, true).animate({
width: 85,
left: $a.position().left
});
});
La larghezza usata è la stessa di quella definita nel CSS. L'offset sinistro è calcolato usando l'offset corrente di ciascun link. Potete visionare l'esempio finale in questa pagina.