jQuery: paginazione avanzata degli slideshow

In questo articolo vorrei mostrare una semplice soluzione in jQuery per la creazione di un sistema di paginazione per uno slideshow che mostri il numero corrente e l'avanzamento delle slide.

Partiamo dalla seguente marcatura:


<div id="slideshow">
    <div id="slideshow-wrapper">
        <div class="slide" id="s1"></div>
        <div class="slide" id="s2"></div>
        <div class="slide" id="s3"></div>
        <div class="slide" id="s4"></div>
    </div>
    <div id="slideshow-nav"> 
    <a href="#s1">1</a>
 <a href="#s2">2</a>
 <a href="#s3">3</a>
 <a href="#s4">4</a>
	<div><span id="slideshow-nav-current">1</span> of <span id="slideshow-nav-total"></span>
        </div>
    </div>
</div>

Da questa struttura appare chiaro come effettivamente vi siano solo due elementi nella paginazione che a noi interessano, vale a dire gli elementi con ID slideshow-nav-current e slideshow-nav-total. Dato che si comincia sempre dalla prima slide, il primo elemento avrà come contenuto testuale il numero 1 sin dall'inizio. Viceversa il numero totale delle slide verrà calcolato da jQuery e andrà nel secondo elemento (inizialmente vuoto).

Quindi possiamo scrivere il seguente codice:


var Slideshow = {

    paginate: function () {
        var slides = $('div.slide', '#slideshow'),
            total = slides.length; // numero totale di slide
        $('#slideshow-nav-total').text(total);
        slides.each(function (i) {
            // aggiungo il numero corrispondente a ciascuna slide
            $(this).data('index', i + 1);
        });
    },

    navigate: function () {
        $('a', '#slideshow-nav').click(function (e) {
            e.preventDefault();
            var $a = $(this);
            var slide = $($a.attr('href'));
            var wrapper = $('#slideshow-wrapper');

            wrapper.animate({
                left: -slide.position().left
            }, 1000, 'linear', function () {
                // mostro il numero corrente
                $('#slideshow-nav-current').text(slide.data('index'));
                $a.addClass('active').siblings('a').removeClass('active');
            });

        });
    },

    init: function () {
        this.paginate();
        this.navigate();
    }

};

$(function () {
    Slideshow.init();
});

Torna su