Last active
August 29, 2015 14:04
-
-
Save lbalceda/5a386c5690de836877a9 to your computer and use it in GitHub Desktop.
tinycarousel 1.9 + infinite scrolling + .destroy()
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*jshint browser:true laxcomma:true */ | |
/* | |
* Tiny Carousel 1.9 | |
* http://www.baijs.nl/tinycarousel | |
* | |
* Copyright 2010, Maarten Baijs | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* http://www.opensource.org/licenses/mit-license.php | |
* http://www.opensource.org/licenses/gpl-2.0.php | |
* | |
* Date: 01 / 06 / 2011 | |
* Depends on library: jQuery | |
* Date: 15 / 11 / 2012 | |
* @ilpaijin - Added infinite scrolling feature | |
* | |
*/ | |
(function ($) | |
{ | |
"use strict"; | |
$.tiny = $.tiny || { }; | |
$.tiny.carousel = { | |
options: { | |
start: 1, // where should the carousel start? | |
display: 1, // how many blocks do you want to move at 1 time? | |
axis: 'x', // vertical or horizontal scroller? ( x || y ). | |
controls: true, // show left and right navigation buttons. | |
pager: false, // is there a page number navigation present? | |
interval: false, // move to another block on intervals. | |
intervaltime: 3000, // interval time in milliseconds. | |
rewind: false, // If interval is true and rewind is true it will play in reverse if the last slide is reached. | |
animation: true, // false is instant, true is animate. | |
duration: 1000, // how fast must the animation move in ms? | |
callback: null, // function that executes after every move. | |
infinite : false | |
} | |
}; | |
$.fn.tinycarousel_start = function () { $(this).data('tcl').start(); }; | |
$.fn.tinycarousel_stop = function () { $(this).data('tcl').stop(); }; | |
$.fn.tinycarousel_move = function (iNum) { $(this).data('tcl').move(iNum - 1,true); }; | |
$.fn.tinycarousel_destroy = function() { $(this).data('tcl').destroy(); }; | |
function Carousel(root, options) | |
{ | |
var oSelf = this | |
, oViewport = $('.viewport:first', root) | |
, oContent = $('.overview:first', root) | |
, oPages = oContent.children() | |
, oBtnNext = $('.next:first', root) | |
, oBtnPrev = $('.prev:first', root) | |
, oPager = $('.pager:first', root) | |
, iPageSize = 0 | |
, iSteps = 0 | |
, iCurrent = 0 | |
, oTimer = undefined | |
, bPause = false | |
, bForward = true | |
, bAxis = options.axis === 'x' | |
, iFirst = 0 | |
; | |
/* ---- Primo check dei bottoni alla init--- */ | |
function firstCheckControls() | |
{ | |
if(options.controls) | |
{ | |
oBtnPrev.fadeIn(); | |
oBtnNext.fadeIn(); | |
} | |
else { | |
oBtnPrev.unbind('click'); | |
oBtnNext.unbind('click'); | |
} | |
} | |
function setButtons() | |
{ | |
if(options.controls) | |
{ | |
oBtnPrev.toggleClass('disable', iCurrent <= 0 ); | |
oBtnNext.toggleClass('disable', !(iCurrent +1 < iSteps)); | |
} | |
if(options.pager) | |
{ | |
var oNumbers = $('.pagenum', oPager); | |
oNumbers.removeClass('active'); | |
$(oNumbers[iCurrent]).addClass('active'); | |
} | |
} | |
function setPager( oEvent ) | |
{ | |
if( $( this ).hasClass( "pagenum" ) ) | |
{ | |
oSelf.move( parseInt( this.rel, 10 ), true ); | |
} | |
return false; | |
} | |
function setTimer() | |
{ | |
if(options.interval && !bPause) | |
{ | |
clearTimeout(oTimer); | |
oTimer = setTimeout(function(){ | |
iCurrent = iCurrent +1 === iSteps ? -1 : iCurrent; | |
bForward = iCurrent +1 === iSteps ? false : iCurrent === 0 ? true : bForward; | |
oSelf.move(bForward ? 1 : -1); | |
}, options.intervaltime); | |
} | |
} | |
function setEvents() | |
{ | |
if(options.controls && oBtnPrev.length > 0 && oBtnNext.length > 0) | |
{ | |
oBtnPrev.click(function(){oSelf.move(-1); return false;}); | |
oBtnNext.click(function(){oSelf.move( 1); return false;}); | |
} | |
if(options.interval) | |
{ | |
root.hover(oSelf.stop,oSelf.start); | |
} | |
if(options.pager && oPager.length > 0) | |
{ | |
$('a',oPager).click(setPager); | |
} | |
} | |
this.stop = function () { clearTimeout(oTimer); bPause = true; }; | |
this.start = function () { bPause = false; setTimer(); }; | |
this.move = function (iDirection, bPublic) | |
{ | |
if ( options.infinite ) { | |
if (iCurrent==-1) { | |
oContent.css({ left : -((iFirst+1)*iPageSize) }); | |
iCurrent = iFirst; | |
this.move(1); | |
} | |
} | |
iCurrent = bPublic ? iDirection : iCurrent += iDirection; | |
if(iCurrent > -1 && iCurrent < iSteps) | |
{ | |
var oPosition = {}; | |
oPosition[bAxis ? 'left' : 'top'] = -(iCurrent * (iPageSize * options.display)); | |
oContent.animate(oPosition,{ | |
queue: false, | |
duration: options.animation ? options.duration : 0, | |
complete: function() | |
{ | |
if(typeof options.callback === 'function') | |
{ | |
options.callback.call(this, oPages[iCurrent], iCurrent); | |
} | |
} | |
}); | |
setButtons(); | |
setTimer(); | |
} | |
}; | |
this.destroy = function() { | |
this.stop(); | |
$(oPages).find('.cloned').remove(); | |
if(options.interval) { | |
root.unbind('mouseenter mouseleave'); | |
} | |
var position = {}; | |
position[bAxis ? 'left' : 'top'] = 0; | |
oContent.animate(position, {queue: false, duration: 0}); | |
}; | |
function initialize () { | |
firstCheckControls(); | |
iPageSize = bAxis ? $(oPages[0]).outerWidth(true) : $(oPages[0]).outerHeight(true); | |
var iLeftover = Math.ceil(((bAxis ? oViewport.outerWidth() : oViewport.outerHeight()) / (iPageSize * options.display)) -1); | |
iSteps = Math.max(1, Math.ceil(oPages.length / options.display) - iLeftover); | |
iCurrent = Math.min(iSteps, Math.max(1, options.start)) -2; | |
oContent.css(bAxis ? 'width' : 'height', (iPageSize * oPages.length)); | |
if ( options.infinite ){ | |
/* ---- Appendo e prependo item di scrolling --- */ | |
$(oPages).eq(0).before( $(oPages).slice(-(iLeftover+1)).clone().addClass('cloned') ); | |
$(oPages).eq(oPages.length - 1).after($(oPages).slice(0, (iLeftover+1)).clone().addClass('cloned')); | |
oPages = oContent.children(); | |
var iLeftover = Math.ceil(((bAxis ? oViewport.outerWidth() : oViewport.outerHeight()) / (iPageSize * options.display)) -1); | |
iSteps = Math.max(1, Math.ceil(oPages.length / options.display) - iLeftover); | |
iCurrent = iFirst = ($(oContent).find('li').not('.cloned').eq(0).index()-1); | |
oContent.css(bAxis ? 'width' : 'height', (iPageSize * oPages.length)); | |
} | |
oSelf.move(1); | |
setEvents(); | |
return oSelf; | |
} | |
return initialize(); | |
} | |
$.fn.tinycarousel = function(params) | |
{ | |
var options = $.extend({}, $.tiny.carousel.options, params); | |
this.each(function () { $(this).data('tcl', new Carousel($(this), options)); }); | |
return this; | |
}; | |
}(jQuery)); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment