Per poter utilizzare le rotazioni e trasformazioni CSS3 in jQuery abbiamo bisogno del plugin jQuery 2D Transform che consente a metodi quali css()
e animate()
di supportare la proprietà rotate
. Realizzare quindi una galleria di immagini con questo effetto di rotazione diventa semplice. Vediamo l'implementazione.
Abbiamo la seguente struttura DOM e HTML di partenza:
<div id="slideshow">
<img src="1.jpg" alt="" />
<img src="2.jpg" alt="" />
<img src="3.jpg" alt="" />
</div>
<div id="controls">
<a href="#" id="rotate">Ruota</a>
<a href="#" id="reset">Reset</a>
</div>
Un comando farà ruotare le immagini in senso orario e l'altro comando le riporterà nella posizione di partenza. Con jQuery abbiamo bisogno di un oggetto che:
- crei un timer che esegua le animazioni in sequenza
- associ le azioni ai due pulsanti
- permetta una rotazione nei due sensi per riportare poi le immagini allo stato normale
In questo oggetto dichiariamo subito le proprietà private che verranno utilizzate nei vari metodi:
var Slideshow = new function() {
var $images = $('img', '#slideshow');
var totalImages = $images.length;
var rotate = $('#rotate', '#controls');
var reset = $('#reset', '#controls');
var timeDiff = 1000, slideShowInterval;
var index = -1;
// continua
}();
Abbiamo:
$images
: l'intero set di immaginitotalImages
: il numero di immagini presenti (verrà usato dal nostro timer)rotate
,reset
: i due pulsanti della galleriatimeDiff
: l'intervallo di tempo del timerslideShowInterval
: il nostro timer (non ancora inizializzato)index
: l'indice che verrà usato col metodoeq()
per selezionare l'immagine corrente nel set jQuery
Definiamo l'unico metodo pubblico che inizializzerà l'oggetto Slideshow
:
this.init = function() {
initHandlers();
};
Il metodo privato initHandlers()
associa un evento click
ai due pulsanti con le rispettive azioni:
var initHandlers = function() {
rotate.bind('click', function(event) {
startSlideshow();
event.preventDefault();
});
reset.bind('click', function(event) {
stopSlideshow();
event.preventDefault();
});
};
Questo metodo invoca a sua volta altri due metodi privati, startSlideshow()
e stopSlideshow()
definiti come segue:
var startSlideshow = function() {
rotateImages(1);
};
var stopSlideshow = function() {
rotateImages(-1);
};
Come si può notare, il cuore dell'oggetto in questione è rappresentato dal metodo rotateImages(dir)
. Il parametro dir
accetta due valori numerici: 1 per una rotazione e -1 per il ritorno allo stato normale dell'immagine selezionata:
var rotateImages = function(dir) {
var rotateTo = (dir == 1) ? '30deg' : '0deg';
slideShowInterval = setInterval(function() {
index++;
if(index == totalImages) {
index = -1;
clearInterval(slideShowInterval);
}
$images.eq(index).animate({
rotate: rotateTo
}, timeDiff);
}, timeDiff);
};
Questo metodo inizializza il nostro timer, il quale a sua volta usa il contatore della proprietà index
per selezionare le immagini del set. Quando il contatore raggiunge il limite del numero di immagini del set, viene resettato a -1 e il timer viene cancellato.
Notate come il metodo animate()
ora accetti la proprietà rotate
con questa sintassi:
rotate: 'ndeg'
dove n
è un numero (positivo o negativo) e deg
è la parola chiave che indica i gradi della rotazione.
Potete visionare l'esempio finale in questa pagina.