377 lines
11 KiB
JavaScript
377 lines
11 KiB
JavaScript
/**
|
|
* Carousel wrapper.
|
|
*
|
|
* @author Htmlstream
|
|
* @version 1.0
|
|
* @requires
|
|
*
|
|
*/
|
|
;
|
|
(function($) {
|
|
'use strict';
|
|
|
|
$.HSCore.components.HSCarousel = {
|
|
/**
|
|
*
|
|
*
|
|
* @var Object _baseConfig
|
|
*/
|
|
_baseConfig: {
|
|
autoplay: false,
|
|
infinite: true
|
|
},
|
|
|
|
/**
|
|
*
|
|
*
|
|
* @var jQuery pageCollection
|
|
*/
|
|
pageCollection: $(),
|
|
|
|
/**
|
|
* Initialization of Carousel wrapper.
|
|
*
|
|
* @param String selector (optional)
|
|
* @param Object config (optional)
|
|
*
|
|
* @return jQuery pageCollection - collection of initialized items.
|
|
*/
|
|
init: function(selector, config) {
|
|
this.collection = selector && $(selector).length ? $(selector) : $();
|
|
if (!$(selector).length) return;
|
|
|
|
this.config = config && $.isPlainObject(config) ?
|
|
$.extend({}, this._baseConfig, config) : this._baseConfig;
|
|
|
|
this.config.itemSelector = selector;
|
|
|
|
this.initCarousel();
|
|
|
|
return this.pageCollection;
|
|
},
|
|
|
|
initCarousel: function() {
|
|
//Variables
|
|
var $self = this,
|
|
config = $self.config,
|
|
collection = $self.pageCollection;
|
|
|
|
//Actions
|
|
this.collection.each(function(i, el) {
|
|
//Variables
|
|
var $this = $(el),
|
|
id = $this.attr('id'),
|
|
|
|
//Markup elements
|
|
target = $this.data('nav-for'),
|
|
isThumb = $this.data('is-thumbs'),
|
|
arrowsClasses = $this.data('arrows-classes'),
|
|
arrowLeftClasses = $this.data('arrow-left-classes'),
|
|
arrowRightClasses = $this.data('arrow-right-classes'),
|
|
pagiClasses = $this.data('pagi-classes'),
|
|
pagiHelper = $this.data('pagi-helper'),
|
|
$pagiIcons = $this.data('pagi-icons'),
|
|
$prevMarkup = '<div class="js-prev ' + arrowsClasses + ' ' + arrowLeftClasses + '"></div>',
|
|
$nextMarkup = '<div class="js-next ' + arrowsClasses + ' ' + arrowRightClasses + '"></div>',
|
|
|
|
//Setters
|
|
setSlidesToShow = $this.data('slides-show'),
|
|
setSlidesToScroll = $this.data('slides-scroll'),
|
|
setAutoplay = $this.data('autoplay'),
|
|
setAnimation = $this.data('animation'),
|
|
setEasing = $this.data('easing'),
|
|
setFade = $this.data('fade'),
|
|
setSpeed = $this.data('speed'),
|
|
setSlidesRows = $this.data('rows'),
|
|
setCenterMode = $this.data('center-mode'),
|
|
setCenterPadding = $this.data('center-padding'),
|
|
setPauseOnHover = $this.data('pause-hover'),
|
|
setVariableWidth = $this.data('variable-width'),
|
|
setInitialSlide = $this.data('initial-slide'),
|
|
setVertical = $this.data('vertical'),
|
|
setRtl = $this.data('rtl'),
|
|
setInEffect = $this.data('in-effect'),
|
|
setOutEffect = $this.data('out-effect'),
|
|
setInfinite = $this.data('infinite'),
|
|
setDataTitlePosition = $this.data('title-pos-inside'),
|
|
setFocusOnSelect = $this.data('focus-on-select'),
|
|
setLazyLoad = $this.data('lazy-load'),
|
|
isAdaptiveHeight = $this.data('adaptive-height'),
|
|
numberedPaging = $this.data('numbered-pagination'),
|
|
setResponsive = JSON.parse(el.getAttribute('data-responsive'));
|
|
|
|
if ($this.find('[data-slide-type]').length) {
|
|
$self.videoSupport($this);
|
|
}
|
|
|
|
$this.on('init', function(event, slick) {
|
|
$(slick.$slides).css('height', 'auto');
|
|
});
|
|
|
|
if (setInEffect && setOutEffect) {
|
|
$this.on('init', function(event, slick) {
|
|
$(slick.$slides).addClass('single-slide');
|
|
});
|
|
}
|
|
|
|
if (pagiHelper) {
|
|
$this.on('init', function(event, slick) {
|
|
var $pagination = $this.find('.js-pagination');
|
|
|
|
if (!$pagination.length) return;
|
|
|
|
$pagination.append('<span class="u-dots-helper"></span>');
|
|
});
|
|
}
|
|
|
|
if (isThumb) {
|
|
$('#' + id).on('click', '.slick-slide', function(e) {
|
|
e.stopPropagation();
|
|
|
|
//Variables
|
|
var i = $(this).data('slick-index');
|
|
|
|
if ($('#' + id).slick('slickCurrentSlide') !== i) {
|
|
$('#' + id).slick('slickGoTo', i);
|
|
}
|
|
});
|
|
}
|
|
|
|
$this.on('init', function(event, slider) {
|
|
var $pagination = $this.find('.js-pagination');
|
|
|
|
if (!$pagination.length) return;
|
|
|
|
$($pagination[0].children[0]).addClass('slick-current');
|
|
});
|
|
|
|
$this.on('init', function(event, slick) {
|
|
var slide = $(slick.$slides)[0],
|
|
animatedElements = $(slide).find('[data-scs-animation-in]');
|
|
|
|
$(animatedElements).each(function() {
|
|
var animationIn = $(this).data('scs-animation-in');
|
|
|
|
$(this).addClass('animated ' + animationIn).css('opacity', 1);
|
|
});
|
|
});
|
|
|
|
if (numberedPaging) {
|
|
$this.on('init', function(event, slick) {
|
|
$(numberedPaging).text('1' + '/' + slick.slideCount);
|
|
});
|
|
}
|
|
|
|
$this.slick({
|
|
autoplay: setAutoplay ? true : false,
|
|
autoplaySpeed: setSpeed ? setSpeed : 3000,
|
|
|
|
cssEase: setAnimation ? setAnimation : 'ease',
|
|
easing: setEasing ? setEasing : 'linear',
|
|
fade: setFade ? true : false,
|
|
|
|
infinite: setInfinite ? true : false,
|
|
initialSlide: setInitialSlide ? setInitialSlide - 1 : 0,
|
|
slidesToShow: setSlidesToShow ? setSlidesToShow : 1,
|
|
slidesToScroll: setSlidesToScroll ? setSlidesToScroll : 1,
|
|
centerMode: setCenterMode ? true : false,
|
|
variableWidth: setVariableWidth ? true : false,
|
|
pauseOnHover: setPauseOnHover ? true : false,
|
|
rows: setSlidesRows ? setSlidesRows : 1,
|
|
vertical: setVertical ? true : false,
|
|
verticalSwiping: setVertical ? true : false,
|
|
rtl: setRtl ? true : false,
|
|
centerPadding: setCenterPadding ? setCenterPadding : 0,
|
|
focusOnSelect: setFocusOnSelect ? true : false,
|
|
lazyLoad: setLazyLoad ? setLazyLoad : false,
|
|
|
|
asNavFor: target ? target : false,
|
|
prevArrow: arrowsClasses ? $prevMarkup : false,
|
|
nextArrow: arrowsClasses ? $nextMarkup : false,
|
|
dots: pagiClasses ? true : false,
|
|
dotsClass: 'js-pagination ' + pagiClasses,
|
|
adaptiveHeight: !!isAdaptiveHeight,
|
|
customPaging: function(slider, i) {
|
|
var title = $(slider.$slides[i]).data('title');
|
|
|
|
if (title && $pagiIcons) {
|
|
return '<span>' + title + '</span>' + $pagiIcons;
|
|
} else if ($pagiIcons) {
|
|
return '<span></span>' + $pagiIcons;
|
|
} else if (title && setDataTitlePosition) {
|
|
return '<span>' + title + '</span>';
|
|
} else if (title && !setDataTitlePosition) {
|
|
return '<span></span>' + '<strong class="u-dot-title">' + title + '</strong>';
|
|
} else {
|
|
return '<span></span>';
|
|
}
|
|
},
|
|
responsive: setResponsive
|
|
});
|
|
|
|
$this.on('beforeChange', function(event, slider, currentSlide, nextSlide) {
|
|
var nxtSlide = $(slider.$slides)[nextSlide],
|
|
slide = $(slider.$slides)[currentSlide],
|
|
$pagination = $this.find('.js-pagination'),
|
|
animatedElements = $(nxtSlide).find('[data-scs-animation-in]'),
|
|
otherElements = $(slide).find('[data-scs-animation-in]');
|
|
|
|
$(otherElements).each(function() {
|
|
var animationIn = $(this).data('scs-animation-in');
|
|
|
|
$(this).removeClass('animated ' + animationIn);
|
|
});
|
|
|
|
$(animatedElements).each(function() {
|
|
$(this).css('opacity', 0);
|
|
});
|
|
|
|
if (!$pagination.length) return;
|
|
|
|
if (currentSlide > nextSlide) {
|
|
$($pagination[0].children).removeClass('slick-active-right');
|
|
|
|
$($pagination[0].children[nextSlide]).addClass('slick-active-right');
|
|
} else {
|
|
$($pagination[0].children).removeClass('slick-active-right');
|
|
}
|
|
|
|
$($pagination[0].children).removeClass('slick-current');
|
|
|
|
setTimeout(function() {
|
|
$($pagination[0].children[nextSlide]).addClass('slick-current');
|
|
}, .25);
|
|
});
|
|
|
|
if (numberedPaging) {
|
|
$this.on('beforeChange', function(event, slick, currentSlide, nextSlide) {
|
|
var i = (nextSlide ? nextSlide : 0) + 1;
|
|
|
|
$(numberedPaging).text(i + '/' + slick.slideCount);
|
|
});
|
|
}
|
|
|
|
$this.on('afterChange', function(event, slick, currentSlide, nextSlide) {
|
|
var slide = $(slick.$slides)[currentSlide],
|
|
animatedElements = $(slide).find('[data-scs-animation-in]');
|
|
|
|
$(animatedElements).each(function() {
|
|
var animationIn = $(this).data('scs-animation-in'),
|
|
animationDelay = $(this).data('scs-animation-delay'),
|
|
animationDuration = $(this).data('scs-animation-duration');
|
|
|
|
console.log(animationDuration);
|
|
|
|
$(this).css({
|
|
'animation-delay': animationDelay + 'ms',
|
|
'animation-duration': animationDuration + 'ms'
|
|
});
|
|
|
|
$(this).addClass('animated ' + animationIn).css('opacity', 1);
|
|
});
|
|
});
|
|
|
|
if (setInEffect && setOutEffect) {
|
|
$this.on('afterChange', function(event, slick, currentSlide, nextSlide) {
|
|
$(slick.$slides).removeClass('animated set-position ' + setInEffect + ' ' + setOutEffect);
|
|
});
|
|
|
|
$this.on('beforeChange', function(event, slick, currentSlide) {
|
|
$(slick.$slides[currentSlide]).addClass('animated ' + setOutEffect);
|
|
});
|
|
|
|
$this.on('setPosition', function(event, slick) {
|
|
$(slick.$slides[slick.currentSlide]).addClass('animated set-position ' + setInEffect);
|
|
});
|
|
}
|
|
|
|
//Actions
|
|
collection = collection.add($this);
|
|
});
|
|
},
|
|
|
|
/**
|
|
* Implementation of video support.
|
|
*
|
|
* @param jQuery carousel
|
|
* @param String videoSupport
|
|
*
|
|
* @return undefined
|
|
*/
|
|
videoSupport: function(carousel) {
|
|
if (!carousel.length) return;
|
|
|
|
carousel.on('beforeChange', function(event, slick, currentSlide, nextSlide) {
|
|
var slideType = $(slick.$slides[currentSlide]).data('slide-type'),
|
|
player = $(slick.$slides[currentSlide]).find('iframe').get(0),
|
|
command;
|
|
|
|
if (slideType == 'vimeo') {
|
|
command = {
|
|
"method": "pause",
|
|
"value": "true"
|
|
}
|
|
} else if (slideType == 'youtube') {
|
|
command = {
|
|
"event": "command",
|
|
"func": "pauseVideo"
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
|
|
if (player != undefined) {
|
|
player.contentWindow.postMessage(JSON.stringify(command), '*');
|
|
}
|
|
});
|
|
},
|
|
|
|
/**
|
|
* Implementation of text animation.
|
|
*
|
|
* @param jQuery carousel
|
|
* @param String textAnimationSelector
|
|
*
|
|
* @requires charming.js, anime.js, textfx.js
|
|
*
|
|
* @return undefined
|
|
*/
|
|
initTextAnimation: function(carousel, textAnimationSelector) {
|
|
if (!window.TextFx || !window.anime || !carousel.length) return;
|
|
|
|
var $text = carousel.find(textAnimationSelector);
|
|
|
|
if (!$text.length) return;
|
|
|
|
$text.each(function(i, el) {
|
|
var $this = $(el);
|
|
|
|
if (!$this.data('TextFx')) {
|
|
$this.data('TextFx', new TextFx($this.get(0)));
|
|
}
|
|
});
|
|
|
|
|
|
carousel.on('beforeChange', function(event, slick, currentSlide, nextSlide) {
|
|
var targets = slick.$slider
|
|
.find('.slick-track')
|
|
.children();
|
|
|
|
var currentTarget = targets.eq(currentSlide),
|
|
nextTarget = targets.eq(nextSlide);
|
|
|
|
currentTarget = currentTarget.find(textAnimationSelector);
|
|
nextTarget = nextTarget.find(textAnimationSelector);
|
|
|
|
if (currentTarget.length) {
|
|
currentTarget.data('TextFx').hide(currentTarget.data('effect') ? currentTarget.data('effect') : 'fx1');
|
|
}
|
|
|
|
if (nextTarget.length) {
|
|
nextTarget.data('TextFx').show(nextTarget.data('effect') ? nextTarget.data('effect') : 'fx1');
|
|
}
|
|
});
|
|
}
|
|
}
|
|
})(jQuery);
|