jQuery: complete slideshow pagination

by Roberto Apasajja

HTML

<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>

CSS

#slideshow {
    margin: 2em auto;
    width: 70%;
    max-width: 40em;
    overflow: hidden;
}
#slideshow-wrapper {
    width: 1600em;
    height: 15em;
    position: relative;
}
div.slide {
    width: 40em;
    height: 15em;
    float: left;
    background-repeat: no-repeat;
    background-size: contain;
}
#s1 {
    background-image: url(https://lh3.googleusercontent.com/-G010N8iS3kM/UAGpMOe1kbI/AAAAAAAABD8/ZBDoeFQV1PE/s900/slide-1.jpeg);
}
#s2 {
    background-image: url(https://lh6.googleusercontent.com/-KOW-9jXpRJs/UAGpM_vlhdI/AAAAAAAABD8/MZvYcMEzdtA/s900/slide-21.jpeg);
}
#s3 {
    background-image: url(https://lh6.googleusercontent.com/-Xyc-ERpn1vk/UAGpNHK4YJI/AAAAAAAABD8/0cmDvfIFWNU/s900/slide-3.jpeg);
}
#s4 {
    background-image: url(https://lh6.googleusercontent.com/-o1zeOclXgro/UAGpNtCKZvI/AAAAAAAABD8/xNZnrWD8uRM/s900/slide-4.jpeg);
}
#slideshow-nav {
    margin: 1em 0;
    text-align: center;
}
#slideshow-nav a {
    display: inline-block;
    width: 1.5em;
    height: 1.5em;
    line-height: 1.5;
    border: 1px solid silver;
    color: #333;
    text-decoration: none;
    margin-right: 0.5em;
}
#slideshow-nav a.active {
    background: #000;
    color: #fff;
    border-color: #000;
}
#slideshow-nav div {
    margin: 1em 0;
}

JavaScript

var Slideshow = {

    paginate: function () {
        var slides = $('div.slide', '#slideshow'),
            total = slides.length;
        $('#slideshow-nav-total').text(total);
        slides.each(function (i) {
            $(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 () {
                $('#slideshow-nav-current').text(slide.data('index'));
                $a.addClass('active').siblings('a').removeClass('active');
            });

        });
    },

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

};

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