Created
December 23, 2014 22:04
-
-
Save Butochnikov/200d4e7b06b0710de725 to your computer and use it in GitHub Desktop.
RoyalSlider thumbnails module
This file contains hidden or 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
(function($) { | |
"use strict"; | |
/** | |
* | |
* RoyalSlider thumbnails module | |
* @version 1.0.6: | |
* | |
* 1.0.1 | |
* - Fixed bug with vertical thumbs caused by latest update | |
* | |
* 1.0.2: | |
* - Dynamic adding/removing tabs. | |
* | |
* 1.0.3 | |
* - Removed first transition at slider initialization | |
* | |
* 1.0.4 | |
* - Added paddingTop & bottom | |
* - firstMargin now accepts number which is min distance of first/last thumbnail | |
* | |
* 1.0.5 | |
* - IE10 touch support | |
* | |
* 1.0.6 | |
* - Fix issue when autoHeight is enabled | |
* | |
*/ | |
$.extend($.rsProto, { | |
_initThumbs: function() { | |
var self = this; | |
if(self.st.controlNavigation === 'thumbnails') { | |
self._thumbsDefaults = { | |
drag: true, | |
touch: true, | |
orientation: 'horizontal', | |
navigation: true, | |
arrows: true, | |
arrowLeft: null, | |
arrowRight: null, | |
spacing: 4, | |
arrowsAutoHide: false, | |
appendSpan: false, | |
transitionSpeed:600, | |
autoCenter: true, | |
fitInViewport: true, | |
firstMargin: true, | |
paddingTop: 0, | |
paddingBottom: 0 | |
}; | |
self.st.thumbs = $.extend({}, self._thumbsDefaults, self.st.thumbs); | |
self._firstThumbMoved = true; | |
if(self.st.thumbs.firstMargin === false) { self.st.thumbs.firstMargin = 0; } | |
else if(self.st.thumbs.firstMargin === true) { self.st.thumbs.firstMargin = self.st.thumbs.spacing; } | |
self.ev.on('rsBeforeParseNode', function(e, content, obj) { | |
content = $(content); | |
obj.thumbnail = content.find('.rsTmb').remove(); | |
if(!obj.thumbnail.length) { | |
obj.thumbnail = content.attr('data-rsTmb'); | |
if(!obj.thumbnail) { | |
obj.thumbnail = content.find('.rsImg').attr('data-rsTmb'); | |
} | |
if(!obj.thumbnail) { | |
obj.thumbnail = ''; | |
} else { | |
obj.thumbnail = '<img src="'+obj.thumbnail+'"/>'; | |
} | |
} else { | |
obj.thumbnail = $(document.createElement('div')).append(obj.thumbnail).html(); | |
} | |
}); | |
self.ev.one('rsAfterPropsSetup', function() { | |
self._createThumbs(); | |
}); | |
self._prevNavItem = null; | |
self.ev.on('rsOnUpdateNav', function() { | |
var currItem = $(self._controlNavItems[self.currSlideId]); | |
if(currItem === self._prevNavItem) { | |
return; | |
} | |
if(self._prevNavItem) { | |
self._prevNavItem.removeClass('rsNavSelected'); | |
self._prevNavItem = null; | |
} | |
if(self._thumbsNavigation) { | |
self._setCurrentThumb(self.currSlideId); | |
} | |
self._prevNavItem = currItem.addClass('rsNavSelected'); | |
}); | |
self.ev.on('rsOnAppendSlide', function(e, parsedSlide, index) { | |
var html = '<div'+self._thumbsMargin+' class="rsNavItem rsThumb">'+self._addThumbHTML+parsedSlide.thumbnail+'</div>'; | |
if(index >= self.numSlides) { | |
self._thumbsContainer.append(html); | |
} else { | |
self._controlNavItems.eq(index).before(html); | |
} | |
self._controlNavItems = self._thumbsContainer.children(); | |
self.updateThumbsSize(); | |
}); | |
self.ev.on('rsOnRemoveSlide', function(e, index) { | |
var itemToRemove = self._controlNavItems.eq(index); | |
if(itemToRemove) { | |
itemToRemove.remove(); | |
self._controlNavItems = self._thumbsContainer.children(); | |
self.updateThumbsSize(); | |
} | |
}); | |
} | |
}, | |
_createThumbs: function() { | |
var self = this, | |
tText = 'rsThumbs', | |
thumbSt = self.st.thumbs, | |
out = '', | |
style, | |
item, | |
spacing = thumbSt.spacing; | |
self._controlNavEnabled = true; | |
self._thumbsHorizontal = (thumbSt.orientation === 'vertical') ? false : true; | |
self._thumbsMargin = style = spacing ? ' style="margin-' + (self._thumbsHorizontal ? 'right' : 'bottom') + ':'+ spacing+'px;"' : ''; | |
self._thumbsPosition = 0; | |
self._isThumbsAnimating = false; | |
self._thumbsDrag = false; | |
self._thumbsNavigation = false; | |
self._thumbsArrows = (thumbSt.arrows && thumbSt.navigation); | |
var pl = (self._thumbsHorizontal ? 'Hor' : 'Ver'); | |
self.slider.addClass('rsWithThumbs' + ' rsWithThumbs'+ pl ); | |
out += '<div class="rsNav rsThumbs rsThumbs'+pl +'"><div class="'+tText+'Container">'; | |
self._addThumbHTML = thumbSt.appendSpan ? '<span class="thumbIco"></span>' : ''; | |
for(var i = 0; i < self.numSlides; i++) { | |
item = self.slides[i]; | |
out += '<div'+style+' class="rsNavItem rsThumb">'+item.thumbnail+self._addThumbHTML+'</div>'; | |
} | |
out = $(out +'</div></div>'); | |
var o = {}; | |
if(thumbSt.paddingTop) { | |
o[self._thumbsHorizontal ? 'paddingTop' : 'paddingLeft'] = thumbSt.paddingTop; | |
} | |
if(thumbSt.paddingBottom) { | |
o[self._thumbsHorizontal ? 'paddingBottom' : 'paddingRight'] = thumbSt.paddingBottom; | |
} | |
out.css(o); | |
self._thumbsContainer = $(out).find('.' + tText + 'Container'); | |
var lol = $(out).find(".rsTmb"); | |
if(self._thumbsArrows) { | |
tText += 'Arrow'; | |
if(thumbSt.arrowLeft) { | |
self._thumbsArrowLeft = thumbSt.arrowLeft; | |
} else { | |
self._thumbsArrowLeft = $('<div class="'+ tText +' ' + tText +'Left"><div class="'+tText+'Icn"></div></div>'); | |
out.append(self._thumbsArrowLeft); | |
} | |
if(thumbSt.arrowRight) { | |
self._thumbsArrowRight = thumbSt.arrowRight; | |
} else { | |
self._thumbsArrowRight = $('<div class="'+ tText +' ' + tText +'Right"><div class="'+tText+'Icn"></div></div>'); | |
out.append(self._thumbsArrowRight); | |
} | |
self._thumbsArrowLeft.click(function() { | |
var viewportSize = Math.floor(self._thumbsViewportSize / self._thumbSize), | |
thumbId = Math.floor(self._thumbsPosition / self._thumbSize), | |
newPos = (thumbId + self._visibleThumbsPerView) * self._thumbSize + self._thumbsSpacing; | |
self._animateThumbsTo( newPos > self._thumbsMinPosition ? self._thumbsMinPosition : newPos ); | |
}); | |
self._thumbsArrowRight.click(function() { | |
var viewportSize = Math.floor(self._thumbsViewportSize / self._thumbSize), | |
thumbId = Math.floor(self._thumbsPosition / self._thumbSize), | |
newPos = (thumbId - self._visibleThumbsPerView) * self._thumbSize + self._thumbsSpacing; | |
self._animateThumbsTo( newPos < self._thumbsMaxPosition ? self._thumbsMaxPosition : newPos ); | |
}); | |
if(thumbSt.arrowsAutoHide && !self.hasTouch) { | |
self._thumbsArrowLeft.css('opacity', 0); | |
self._thumbsArrowRight.css('opacity', 0); | |
out.one("mousemove.rsarrowshover",function() { | |
if(self._thumbsNavigation) { | |
self._thumbsArrowLeft.css('opacity', 1); | |
self._thumbsArrowRight.css('opacity', 1); | |
} | |
}); | |
out.hover( | |
function() { | |
if(self._thumbsNavigation) { | |
self._thumbsArrowLeft.css('opacity', 1); | |
self._thumbsArrowRight.css('opacity', 1); | |
} | |
}, | |
function() { | |
if(self._thumbsNavigation) { | |
self._thumbsArrowLeft.css('opacity', 0); | |
self._thumbsArrowRight.css('opacity', 0); | |
} | |
} | |
); | |
} | |
} | |
self._controlNav = out; | |
self._controlNavItems = self._thumbsContainer.children(); | |
if(self.msEnabled && self.st.thumbs.navigation) { | |
self._thumbsContainer.css('-ms-touch-action', self._thumbsHorizontal ? 'pan-y' : 'pan-x'); | |
} | |
self.slider.append(out); | |
self._thumbsEnabled = true; | |
self._thumbsSpacing = spacing; | |
if(thumbSt.navigation) { | |
if(self._useCSS3Transitions) { | |
self._thumbsContainer.css(self._vendorPref + 'transition-property', self._vendorPref + 'transform'); | |
} | |
} | |
self._controlNav.on('click.rs','.rsNavItem',function(e) { | |
if(!self._thumbsDrag ) { | |
self.goTo( $(this).index() ); | |
} | |
}); | |
self.ev.off('rsBeforeSizeSet.thumbs').on('rsBeforeSizeSet.thumbs', function() { | |
self._realWrapSize = self._thumbsHorizontal ? self._wrapHeight : self._wrapWidth; | |
self.updateThumbsSize(true); | |
}); | |
self.ev.off('rsAutoHeightChange.thumbs').on('rsAutoHeightChange.thumbs', function(e, newHeight) { | |
self.updateThumbsSize(true, newHeight); | |
}); | |
}, | |
updateThumbsSize: function(isResize, newHeight) { | |
var self = this, | |
firstThumb = self._controlNavItems.first(), | |
cssObj = {}; | |
var numItems = self._controlNavItems.length; | |
self._thumbSize = ( self._thumbsHorizontal ? firstThumb.outerWidth() : firstThumb.outerHeight() ) + self._thumbsSpacing; | |
self._thumbsContainerSize = numItems * self._thumbSize - self._thumbsSpacing; | |
cssObj[self._thumbsHorizontal ? 'width' : 'height'] = self._thumbsContainerSize + self._thumbsSpacing; | |
self._thumbsViewportSize = self._thumbsHorizontal ? self._controlNav.width() : (newHeight !== undefined ? newHeight : self._controlNav.height()); | |
if(self._thumbsEnabled && (self.isFullscreen || self.st.thumbs.fitInViewport)) { | |
if(self._thumbsHorizontal) { | |
self._wrapHeight = self._realWrapSize - self._controlNav.outerHeight(); | |
} else { | |
self._wrapWidth = self._realWrapSize - self._controlNav.outerWidth(); | |
} | |
} | |
if(!self._thumbsViewportSize) { | |
return; | |
} | |
self._thumbsMaxPosition = -(self._thumbsContainerSize - self._thumbsViewportSize) - (self.st.thumbs.firstMargin); | |
self._thumbsMinPosition = self.st.thumbs.firstMargin; | |
self._visibleThumbsPerView = Math.floor(self._thumbsViewportSize / self._thumbSize); | |
if(self._thumbsContainerSize < self._thumbsViewportSize) { | |
if(self.st.thumbs.autoCenter) { | |
self._setThumbsPosition((self._thumbsViewportSize - self._thumbsContainerSize) / 2); | |
} | |
if(self.st.thumbs.arrows && self._thumbsArrowLeft) { | |
var arrDisClass = 'rsThumbsArrowDisabled'; | |
self._thumbsArrowLeft.addClass(arrDisClass); | |
self._thumbsArrowRight.addClass(arrDisClass); | |
} | |
self._thumbsNavigation = false; | |
self._thumbsDrag = false; | |
self._controlNav.off(self._downEvent); | |
} else if(self.st.thumbs.navigation && !self._thumbsNavigation) { | |
self._thumbsNavigation = true; | |
if( (!self.hasTouch && self.st.thumbs.drag) || (self.hasTouch && self.st.thumbs.touch)) { | |
self._thumbsDrag = true; | |
self._controlNav.on(self._downEvent, function(e) { self._onDragStart(e, true); }); | |
} | |
} | |
self._thumbsContainer.css(cssObj); | |
if(isResize && newHeight) { | |
self._setCurrentThumb(self.currSlideId); | |
} | |
if(self._useCSS3Transitions) { | |
cssObj[(self._vendorPref + 'transition-duration')] = '0ms'; | |
} | |
}, | |
setThumbsOrientation: function(newPlacement, dontUpdateSize) { | |
var self = this; | |
if(self._thumbsEnabled) { | |
self.st.thumbs.orientation = newPlacement; | |
self._controlNav.remove(); | |
self.slider.removeClass('rsWithThumbsHor rsWithThumbsVer'); | |
self._createThumbs(); | |
self._controlNav.off(self._downEvent); | |
if(!dontUpdateSize) { | |
self.updateSliderSize(true); | |
} | |
} | |
}, | |
_setThumbsPosition: function(pos) { | |
var self = this; | |
self._thumbsPosition = pos; | |
if(self._useCSS3Transitions) { | |
self._thumbsContainer.css(self._xProp, self._tPref1 + ( self._thumbsHorizontal ? (pos + self._tPref2 + 0) : (0 + self._tPref2 + pos) ) + self._tPref3 ); | |
} else { | |
self._thumbsContainer.css(self._thumbsHorizontal ? self._xProp : self._yProp, pos); | |
} | |
}, | |
_animateThumbsTo: function(pos, speed, outEasing, bounceAnimPosition, bounceAnimSpeed) { | |
var self = this; | |
if(!self._thumbsNavigation) { | |
return; | |
} | |
if(!speed) { | |
speed = self.st.thumbs.transitionSpeed; | |
} | |
self._thumbsPosition = pos; | |
if(self._thumbsAnimTimeout) { | |
clearTimeout(self._thumbsAnimTimeout); | |
} | |
if(self._isThumbsAnimating) { | |
if(!self._useCSS3Transitions) { | |
self._thumbsContainer.stop(); | |
} | |
outEasing = true; | |
} | |
var animObj = {}; | |
self._isThumbsAnimating = true; | |
if(!self._useCSS3Transitions) { | |
animObj[self._thumbsHorizontal ? self._xProp : self._yProp] = pos + 'px'; | |
self._thumbsContainer.animate(animObj, speed, outEasing ? 'easeOutCubic' : self.st.easeInOut); | |
} else { | |
animObj[(self._vendorPref + 'transition-duration')] = speed+'ms'; | |
animObj[(self._vendorPref + 'transition-timing-function')] = outEasing ? $.rsCSS3Easing[self.st.easeOut] : $.rsCSS3Easing[self.st.easeInOut]; | |
self._thumbsContainer.css(animObj); | |
self._setThumbsPosition(pos); | |
} | |
if(bounceAnimPosition) { | |
self._thumbsPosition = bounceAnimPosition; | |
} | |
self._updateThumbsArrows(); | |
self._thumbsAnimTimeout = setTimeout(function() { | |
self._isThumbsAnimating = false; | |
if(bounceAnimSpeed) { | |
self._animateThumbsTo(bounceAnimPosition, bounceAnimSpeed, true); | |
bounceAnimSpeed = null; | |
} | |
}, speed); | |
}, | |
_updateThumbsArrows: function() { | |
var self = this; | |
if(self._thumbsArrows) { | |
var arrDisClass = 'rsThumbsArrowDisabled'; | |
if(self._thumbsPosition === self._thumbsMinPosition) { | |
self._thumbsArrowLeft.addClass(arrDisClass); | |
} else { | |
self._thumbsArrowLeft.removeClass(arrDisClass); | |
} | |
if(self._thumbsPosition === self._thumbsMaxPosition) { | |
self._thumbsArrowRight.addClass(arrDisClass); | |
} else { | |
self._thumbsArrowRight.removeClass(arrDisClass); | |
} | |
} | |
}, | |
_setCurrentThumb: function(id, justSet) { | |
var self = this, | |
incr = 0, | |
newPos, | |
nextThumbEndPos = (id * self._thumbSize + self._thumbSize * 2 - self._thumbsSpacing + self._thumbsMinPosition), | |
thumbId = Math.floor(self._thumbsPosition / self._thumbSize); | |
if(!self._thumbsNavigation) { | |
return; | |
} | |
if(self._firstThumbMoved) { | |
justSet = true; | |
self._firstThumbMoved = false; | |
} | |
if(nextThumbEndPos + self._thumbsPosition > self._thumbsViewportSize) { | |
if(id === self.numSlides - 1) { | |
incr = 1; | |
} | |
thumbId = -id + self._visibleThumbsPerView - 2 + incr; | |
newPos = thumbId * self._thumbSize + (self._thumbsViewportSize % self._thumbSize) + self._thumbsSpacing - self._thumbsMinPosition; | |
} else { | |
if(id !== 0) { | |
if( (id-1) * self._thumbSize <= -self._thumbsPosition + self._thumbsMinPosition && (id-1) <= self.numSlides - self._visibleThumbsPerView) { | |
thumbId = -id + 1; | |
newPos = thumbId * self._thumbSize + self._thumbsMinPosition; | |
} | |
} else { | |
thumbId = 0; | |
newPos = self._thumbsMinPosition; | |
} | |
} | |
if(newPos !== self._thumbsPosition) { | |
var checkPos = (newPos === undefined) ? self._thumbsPosition : newPos; | |
if(checkPos > self._thumbsMinPosition) { | |
self._setThumbsPosition(self._thumbsMinPosition); | |
} else if(checkPos < self._thumbsMaxPosition) { | |
self._setThumbsPosition(self._thumbsMaxPosition); | |
} else if(newPos !== undefined) { | |
if(!justSet) { | |
self._animateThumbsTo(newPos); | |
} else { | |
self._setThumbsPosition(newPos); | |
} | |
} | |
} | |
self._updateThumbsArrows(); | |
} | |
}); | |
$.rsModules.thumbnails = $.rsProto._initThumbs; | |
})(jQuery); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment