CSS3 Carousel
by Tim Ko
HTML
<article class="quickstats-container">
<div class="pacing-name-container"><label class="pacing-name">A</label></div>
<div class="wrapper">
<div class="slide">
<div class="pacing blue"><table class="quickstats"></table></div>
<div class="pacing yellow"><table class="quickstats"></table></div>
<div class="pacing green"><table class="quickstats"></table></div>
<div class="pacing pink"><table class="quickstats"></table></div>
<div class="pacing blue"><table class="quickstats"></table></div>
<div class="pacing yellow"><table class="quickstats"></table></div>
<div class="pacing green"><table class="quickstats"></table></div>
<div class="pacing pink"><table class="quickstats"></table></div>
</div>
</div>
<nav class="nav-buttons">
<div class="goPrevious">‹</div>
<div class="goNext">›</div>
</nav>
<nav class="nav-bullets">
<ul id="position">
<li class="bullet on" data-name="A"></li>
<li class="bullet" data-name="B"></li>
<li class="bullet" data-name="C"></li>
<li class="bullet" data-name="D"></li>
</ul>
</nav>
</article>
CSS
/* Quickstats */
.comment {
font-size: 70%;
white-space: nowrap;
}
.stats {
overflow: scroll;
max-width: 700px;
margin-bottom: 24px;
}
.stats td {
border-collapse: collapse;
padding: 5px;
height: 19px;
}
.stats tr td:first-of-type {
width: 55%;
}
.stats tr {
border-bottom: solid 1px #bfbfbf;
}
.stats tr:last-child {
border-bottom: none;
}
.quickstats-container {
position: relative;
}
.quickstats {
overflow: scroll;
max-width: 700px;
}
.quickstats td {
border-collapse: collapse;
width: 40%;
padding: 5px;
height: 19px;
}
.quickstats tr td:first-of-type {
width: 55%;
}
.quickstats tr {
border-bottom: solid 1px #bfbfbf;
}
.quickstats tr:nth-child(odd) {
background-color: #f4f4f4;
}
.quickstats tr:nth-child(even) {
background-color: #fafafa;
}
.quickstats tr:last-child {
border-bottom: none;
}
.quickstats th {
text-align: center;
border-collapse: collapse;
padding: 24px 0;
}
.wrapper {
position: relative;
overflow: hidden;
width: 100%;
left: 0px;
height: 245px;
}
.slide {
position: absolute;
top: 0px;
width: 800%; /* 100% * numSlides */
transition: left 0.3s, transform 2s;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.slide-animation {
-moz-transition: left 0.3s, -moz-transform 2s;
-webkit-transition: left 0.3s, -webkit-transform 2s;
-o-transition:width left 0.3s, -o-transform 2s;
}
.pacing {
position: relative;
float: left;
top: 0px;
width: 12.5%;
height: 245px;
}
.nav-buttons {
position: absolute;
top: 0px;
width: 100%;
}
.pacing-name-container {
vertical-align: middle;
text-align: center;
height: 30px;
padding-bottom: 5px;
}
.goPrevious, .goNext {
position: absolute;
font-style: normal !important;
top: 110px;
float: left;
...
JavaScript
// Carousel
var slide = 0;
var bufferSlides = 2;
var numSlides = $('.pacing').length;
var realSlides = numSlides - 2 * bufferSlides;
$('.bullet').on('click', function() {
goToSlide($(this).index());
});
$('.goPrevious').on('click', function() {
goToSlide(slide-1);
});
$('.goNext').on('click', function() {
goToSlide(slide+1);
});
$('.wrapper').swipeLeft(function() {
goToSlide(slide+1);
});
$('.wrapper').swipeRight(function() {
goToSlide(slide-1);
});
$(window).on('resize', function() {
setTimeout(function() {
var slideWidth = -1 * parseInt($('.slide div').width());
$('.slide').removeClass('slide-animation');
$('.slide').css('left', slideWidth * (slide % numSlides));
}, 1)
});
function goToSlide(n) {
// slideWidth needs to be calculated each time in case the user switches between portrait/landscape
var slideWidth = -1 * parseInt($('.slide div').width());
if (n == -1) {
$('.slide').removeClass('slide-animation');
$('.slide').css('left', slideWidth * realSlides);
slide = 3;
} else if (n == 8) {
$('.slide').removeClass('slide-animation');
$('.slide').css('left', slideWidth * (realSlides - 1));
slide = 4;
} else {
slide = (n + numSlides) % numSlides;
}
setTimeout(function() {
$('.slide').addClass('slide-animation');
$('.pacing-name').html($('.bullet').eq(slide % realSlides).data('name'));
$('.bullet.on').removeClass('on');
$('.bullet').eq(slide % realSlides).addClass('on');
$('.slide').css('left', slideWidth * (slide % numSlides));
}, 301);
}