Simple Carousel

by rulokc

HTML

<div class="container">
    <div class="carousel">
        <ul>
            <li><img src="http://lorempixel.com/500/100/nature/1"/></li>
            <li><img src="http://lorempixel.com/500/100/nature/2"/></li>
            <li><img src="http://lorempixel.com/500/100/nature/3"/></li>
        </ul>        
    </div>
    <a class="nav prev" href="#">&lt;</a>
    <a class="nav next" href="#">&gt;</a>
</div>

CSS

.container {
    width: 500px;
    height: 100px;
    margin: 0 auto;
    background-color: #666;
    position: relative;
}
.carousel {
    position: relative;
    height: 100px;
    width: 100%;
    overflow: hidden;
}
.carousel ul {
    list-style: none;
    padding: 0;
    margin: 0;
}
.carousel ul li {
    float: left;
    height: 100px;
}
a.nav {
    display: block;
    position: absolute;
    top: 0;
    width: 20px;
    height: 100px;
    text-decoration: none;
    line-height: 100px;
    font-size: 20px;
    font-weight: bold;
    color: transparent;
    background-color: transparent;
    text-align: center;
}
a.nav.prev {
    left: 0;
}
a.nav.next {
    right: 0;
}
a.nav.prev:hover,
a.nav.next:hover {
    color: #fff;
    background-color: rgba(0,0,0,0.3);
}

JavaScript

var $car = $('.carousel');
var $ul = $('.carousel ul');
var n = $ul.children().length;
$ul.css('width', (100 * n) + '%');
$ul.children().css('width', (100 / n) + '%');

// if not exists default .active then it is the first
if ($ul.find('li.active').length == 0) {
    $ul.find('li:first').addClass('active');
}

// initial offset
var initialOffset = '-' + 100 * $('.carousel ul li.active').index() + '%';
$ul.css({'margin-left': initialOffset}, 1000);

$('a.nav.prev').on('click', function(e) {
    e.preventDefault();
    var $li = $('li.active', $ul);
    if ($li.prev().length) {
        var s = $li.removeClass('active').prev().addClass('active').position().left;
        //$ul.animate({'margin-left':'+=100%'}, 1000);
        $car.stop().animate({scrollLeft: s}, 1000);
    }
});
$('a.nav.next').on('click', function(e) {
    e.preventDefault();
    var $li = $('li.active', $ul);
    if ($li.next().length) {
        var s = $li.removeClass('active').next().addClass('active').position().left;
        //$ul.animate({'margin-left':'-=100%'}, 1000);
        $car.stop().animate({scrollLeft: s}, 1000);
    }
});