geo_info_platform/js/jquery.easy_slides.js

329 lines
16 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
EasySlides - слидер
Autor 2017 Shabanov Ivan (Шабанов Иван)
Usage:
$('.slider').EasySlides({
'autoplay': true,
'timeout': 3000,
'show': 5, //Сколь-ко позывать слайдов (по умолчанию 5: 1-активный, 2-предыдущих и 2-следующих)
'vertical': false, //Если True то слайдер вертикальный, слайды листаются движением вверх/вниз
'reverse': false, //Перевернутый слайдер
'touchevents': true, //Вкючено ли события на прикосновения к сладеру (листания и т.п)
'delayaftershow': 300, //Задержка после смены слайдера, в это время слайдер нельзя листать
'stepbystep': true, //При клике на далекий слайд перейти к нему последовательно, а не сразу
'startslide': 0, //Стартовый слайд
'beforeshow': function () {},
'aftershow': function () {},
});
*/
(function ($) {
$.fn.EasySlides = function (options) {
var settings = $.extend({
'autoplay': false,
'timeout': 3000,
'show': 5,
'vertical': false,
'reverse': false,
'touchevents': true,
'delayaftershow': 300,
'stepbystep': true,
'loop': true,
'startslide': 0,
'distancetochange': 10,
'beforeshow': function () {},
'aftershow': function () {},
}, options);
return this.each(function () {
var this_slider = this;
var EasySlidesTimer;
var EasySlidesCanChange = true;
var count = $(this_slider).children('*:not(.next_button, .prev_button, .nav_indicators)').length;
var cur_slide = 0;
var mousedowned = false;
var need_slide = 0;
var slides;
if (count > 0) {
while (count < settings['show']) {
var html = $(this_slider).html();
$(html).appendTo(this_slider);
$(this_slider).children('.next_button:eq(0), .prev_button:eq(0), .nav_indicators:eq(0)').remove();
slides = $(this_slider).children('*:not(.next_button, .prev_button, .nav_indicators)');
count = $(slides).length;
}
slides = $(this_slider).children('*:not(.next_button, .prev_button, .nav_indicators)');
if ($(this_slider).children('.nav_indicators').length > 0) {
var nav_indicators = '<ul>';
while (need_slide < count) {
need_slide++;
nav_indicators = nav_indicators + '<li>' + need_slide + '</li>';
}
nav_indicators = nav_indicators + '</ul>';
$(this_slider).children('.nav_indicators').html(nav_indicators);
need_slide = 0
}
var EasySlidesLoopToNeeded = function () {
var next;
var left = need_slide - cur_slide;
var right = cur_slide - need_slide
if (settings['loop'] == true) {
if (left < 0) {
left = left + count;
}
if (right < 0) {
right = right + count;
}
}
if (cur_slide != need_slide) {
if (settings['loop'] == true) {
if ((left) < (right)) {
next = cur_slide + 1;
} else {
next = cur_slide - 1;
}
} else {
if (left > 0) {
next = cur_slide + 1;
} else {
next = cur_slide - 1;
}
}
EasySlidesNext(next);
setTimeout(EasySlidesLoopToNeeded, settings['delayaftershow']);
}
}
var EasySlidesNext = function (nextslide) {
if (EasySlidesCanChange) {
EasySlidesCanChange = false;
setTimeout(function () {
EasySlidesCanChange = true;
}, settings['delayaftershow']);
clearTimeout(EasySlidesTimer);
if (typeof settings['beforeshow'] == 'function') {
settings['beforeshow']();
}
var i = 0;
if (count > 0) {
if (typeof nextslide == 'number') {
cur_slide = nextslide;
} else {
cur_slide++;
nextslide = cur_slide;
}
if (settings['loop'] == true) {
while (cur_slide < 0) {
cur_slide = cur_slide + count;
}
while (cur_slide >= count) {
cur_slide = cur_slide - count;
}
while (nextslide < 0) {
nextslide = nextslide + count;
}
while (nextslide >= count) {
nextslide = nextslide - count;
}
} else {
if (cur_slide < 0) {
cur_slide = 0;
}
if (cur_slide >= count) {
cur_slide = count - 1;
}
if (nextslide < 0) {
nextslide = 0;
}
if (nextslide >= count) {
nextslide = count - 1;
}
}
$(this_slider).children('.nav_indicators').find('ul').find('li').removeClass('active');
$(this_slider).find('.nav_indicators ul li:nth-child(' + (nextslide + 1) + ')').addClass('active');
i = 0;
/*
$(this_slider).children('*:not(.next_button, .prev_button, .nav_indicators)').each(function() {
*/
$(slides).each(function () {
var cssclass = '';
var icount = 0;
icount = i - nextslide;
while (icount < 0) {
icount = icount + count;
}
while (icount > count) {
icount = icount - count;
}
if (icount == 0) {
cssclass = 'active';
$(this_slider).find('.' + cssclass + ':not(.nav_indicators ul li)').removeClass(cssclass);
$(this).removeClass('hidden');
$(this).addClass(cssclass);
} else if (icount < settings['show'] / 2) {
cssclass = 'next' + icount;
$(this_slider).find('.' + cssclass).removeClass(cssclass);
$(this).removeClass('hidden');
$(this).addClass(cssclass);
} else if (icount > count - (settings['show'] / 2)) {
cssclass = 'prev' + (count - icount);
$(this_slider).find('.' + cssclass).removeClass(cssclass);
$(this).removeClass('hidden');
$(this).addClass(cssclass);
} else {
$(this).addClass('hidden');
}
if ((Math.abs(i - nextslide) > (settings['show'] / 2)) && (settings['loop'] == false)) {
var icnt = 1;
while (icnt < settings['show'] / 2) {
cssclass = 'next' + icnt;
if ($(this).hasClass(cssclass) ) {
$(this).removeClass(cssclass)
};
cssclass = 'prev' + icnt;
if ($(this).hasClass(cssclass) ) {
$(this).removeClass(cssclass)
};
icnt ++;
};
$(this).addClass('hidden');
}
i++;
});
if (settings['autoplay']) {
clearTimeout(EasySlidesTimer);
EasySlidesTimer = setTimeout(function () {
EasySlidesNext();
}, settings['timeout']);
}
}
if (typeof settings['aftershow'] == 'function') {
settings['aftershow']();
}
}
}
EasySlidesNext(settings['startslide']);
/*
$(this_slider).children(':not(.next_button, .prev_button, .nav_indicators)').click(function () {
*/
$(slides).click(function () {
need_slide = $(this_slider).children().index(this);
if (settings['stepbystep']) {
EasySlidesLoopToNeeded()
} else {
EasySlidesNext(need_slide);
}
});
$(this_slider).children('.nav_indicators').find('ul').find('li').click(function () {
need_slide = $(this_slider).find('.nav_indicators ul li').index(this);
if (settings['stepbystep']) {
EasySlidesLoopToNeeded()
} else {
EasySlidesNext(need_slide);
}
});
$(this_slider).find('.next_button').click(function () {
EasySlidesCanChange = true;
EasySlidesNext();
});
$(this_slider).find('.prev_button').click(function () {
EasySlidesCanChange = true;
cur_slide--;
EasySlidesNext(cur_slide);
});
if (settings['touchevents']) {
var EasySliderMoved = function (xcur, ycur) {
var offset = $(slides).find('.active').offset();
var left = 0;
var top = 0;
if (typeof offset !== 'undefined') {
left = offset.left;
top = offset.top;
}
var p0 = $(this_slider).data('posstart'),
p1 = {
x: xcur,
y: ycur,
l: left,
t: top,
},
d = 0;
if (typeof p0 === 'undefined') {
p0 = p1;
$(this_slider).data('posstart', p1);
}
if (settings['vertical']) {
d = p1.y - p0.y;
top = p0.t + d;
//$(this_slider).find('.active:not(.nav_indicators ul li)').offset({'top': top});
} else {
d = p1.x - p0.x;
left = p0.l + d;
//$(this_slider).find('.active:not(.nav_indicators ul li)').offset({'left': left});
}
if (settings['reverse']) {
d = -d;
}
if ((Math.abs(d) > settings['distancetochange']) && (EasySlidesCanChange)) {
$(this_slider).data('posstart', p1);
if (d > 0) {
cur_slide--;
} else {
cur_slide++;
}
EasySlidesNext(cur_slide);
}
}
/*События*/
$(this_slider).bind('mousemove', function (e) {
e.preventDefault();
if (e.buttons > 0) {
EasySliderMoved(e.pageX, e.pageY);
mousedowned = true;
} else {
if (mousedowned) {
EasySliderMoved(e.pageX, e.pageY);
$(this_slider).removeData('posstart');
mousedowned = false;
}
}
});
$(this_slider).bind('mouseup', function (e) {
e.preventDefault();
if (mousedowned) {
EasySliderMoved(e.pageX, e.pageY);
$(this_slider).removeData('posstart');
mousedowned = false;
}
})
$(this_slider).bind('touchmove', function (e) {
var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0];
EasySliderMoved(touch.pageX, touch.pageY);
});
$(this_slider).bind('touchend', function (e) {
$(this_slider).removeData('posstart');
});
}
}
});
}
})(jQuery);