You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

497 lines
20 KiB
JavaScript

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
Demo:
$(".productshow").Xslider({
unitDisplayed: 1,//可视的单位个数
numtoMove: 1,
dir: "H",//水平移动还是垂直移动 默认H为水平移动传入V则表示垂直移动,传入F则表示渐变切换注意是大写字母,F时还有限制;
viewedSize:120,//可视宽度或高度 不传入则查找要移动对象外层的宽或高度;
unitLen:20,//移动的单位宽或高度(像素) 不传入则查找第一个li的尺寸;
speed: 500,//滚动速度(毫秒) 默认为500;
autoScroll:2000,//自动移动间隔时间(毫秒) 不传入则不会自动移动;
loop:"cycle",//循环滚动
scrollObj:"ul",//要移动的对象 不传入则查找productshow下的ul;
scrollObjSize://移动最长宽或高(像素)(要移动对象的宽度或高度) 不传入则由li个数乘以unitLen计算;
scrollunits: "li",//移动单位的对象数组默认的是查找li
curStyle: "current",//当前移动对象的样式,默认是"current"
eventType: "click",//触发出点的事件类型
imgInit: 1,//当前初始化的位置
stepOne: false,//移动到每一个移动点。默认情况下滚动到最后能显示的一屏触点失效
btnNext: "a.aright",//移动到上一屏的触电选择器 默认为"a.aright"
btnPrevious: "a.aleft",//移动到下一屏的触电选择器 默认为"a.aleft"
start:1,//设置开始位置 默认是将第一个当做开始位置。
beforeStart:function(e){//移动之前出发的事件
//before code;
//e:{
goIndex: 当前移动到,
container: slider容器,
current: 当前单位,
next: 移动后单位,
eventTrigger: 出发的触点,
EOF: 是否是结尾,
BOF: 是否是开始
}
},
afterEnd:function(e){//移动之后出发的事件
//end code;
//e 同上
},
disableStyle: { previous: "agrayleft", next: "agrayright" },//触电失效时的样式。
navCurStyle: "current",//当前nav触点的样式 默认是"current"
showNav: null,//是否需要nav触点的选择器 默认为null
navEventType: "mouseenter"//nav触点的事件类型 默认为click
});
事件
go: function (n, eventTrigger, callback);//移动单位方法,{n:移动到的序号,eventTrigger:触点对象,移动动画完成后触发的事件}
prev: function ();//移动到上一个单位
next: function ();//移动到下一个单位
getSet: function ();//获取的配置项对象
init: function (settings);//重新初始化对象 settings配置项对象
getThis: function ();//获取对象内部元素
eq: function (n);//当容器为一个数组的时候选择第n个容器返回值对象本身。
*/
(function($) {
$.extend($.easing, {
easeOutQuint: function(x, t, b, c, d) {
return c * ((t = t / d - 1) * t * t * t * t + 1) + b;
}
});
var init = function(container, settings) {
var self = this;
self.settings = settings;
self.container = container;
self.selector = container.selector;
self.container.each(function() {
var me = $(this);
var scrollObj = me.find(settings.scrollObj),
scrollunits = scrollObj.find(settings.scrollunits),
unitLen = settings.unitLen || (settings.dir == "H" ? scrollunits.eq(0).outerWidth() : scrollunits.eq(0).outerHeight()),
unitDisplayed = settings.unitDisplayed,
numtoMove = settings.numtoMove > unitDisplayed ? unitDisplayed : settings.numtoMove;
scrollObj.parent().css({ position: "relative", overflow: "hidden" });
var runenv = {
scrollObj: scrollObj,
viewedSize: settings.viewedSize || (settings.dir == "H" ? scrollObj.parent().width() : scrollObj.parent().height()), //length of the wrapper visible;
scrollunits: scrollunits, //units to move;
unitLen: unitLen,
unitDisplayed: unitDisplayed, //units num displayed;
numtoMove: settings.numtoMove > unitDisplayed ? unitDisplayed : settings.numtoMove,
scrollObjSize: settings.scrollObjSize || scrollunits.length * unitLen, //length of the scrollObj;
offset: 0, //max width to move;
offsetnow: 0, //scrollObj now offset;
movelength: unitLen * numtoMove,
pos: settings.dir == "H" ? "left" : "top",
moving: false, //moving now?;
start: settings.start,
btnright: me.find(settings.btnNext),
btnleft: me.find(settings.btnPrevious)
}
if ((runenv.viewedSize / runenv.unitLen) > runenv.scrollunits.length) {
settings.loop = "";
}
runenv.scrollObjSize = Math.max(runenv.scrollObjSize, runenv.viewedSize);
if (settings.loop == "cycle") {
runenv.canMoveLength = runenv.scrollunits.length;
} else if (settings.stepOne) {
runenv.canMoveLength = runenv.scrollunits.length;
runenv.canMoveSize = runenv.scrollObjSize - runenv.viewedSize;
} else {
runenv.canMoveSize = runenv.scrollObjSize - runenv.viewedSize;
runenv.canMoveLength = Math.ceil(runenv.canMoveSize / runenv.unitLen) + 1;
}
runenv.scrollunits.each(function(k, i) {
$(this).attr("index", k);
})
//initialization css
if (settings.dir == "F2") {
var len = runenv.scrollunits.length;
runenv.scrollunits.each(function(i, v) {
$(this).css("z-index", len - i);
})
}
settings.dir == "H" ? runenv.scrollObj.css("left", "0px") : runenv.scrollObj.css("top", "0px");
//cycle tyle initialization dom
if (settings.loop == "cycle") {
var frontobj = [], backobj = [];
for (var i = 0; i < runenv.unitDisplayed; i++) {
var beforeobj = runenv.scrollunits.eq(runenv.scrollunits.length - runenv.unitDisplayed + i).clone();
var afterobj = runenv.scrollunits.eq(runenv.unitDisplayed - i - 1).clone();
beforeobj.attr("index", ~ ~beforeobj.attr("index") - runenv.unitDisplayed - 1);
afterobj.attr("index", ~ ~afterobj.attr("index") + runenv.unitDisplayed + 1);
runenv.scrollunits.eq(0).before(beforeobj);
runenv.scrollunits.eq(runenv.scrollunits.length - 1).after(afterobj);
}
var offset_c = 0 - runenv.unitLen * (runenv.unitDisplayed - runenv.start + 1);
settings.dir == "H" ? runenv.scrollObj.css("left", offset_c) : runenv.scrollObj.css("top", offset_c);
}
//save environment variable
var current = scrollunits.eq(0);
me.data("runenv", runenv);
me.data("curobj", current);
me.data("curindex", 1);
self.settings.canMoveSize = runenv.canMoveSize;
self.settings.canMoveLength = runenv.canMoveLength;
//setting current
runenv.scrollunits.removeClass(settings.curStyle);
runenv.scrollunits.eq(settings.imgInit - 1).addClass(settings.curStyle);
//move to starting position
fnmove.call(me, me.current, settings.imgInit, settings, true);
if (settings.showNav) {
if (typeof settings.showNav === 'boolean') {
settings.showNav = ".nav";
}
me.find(settings.showNav).removeClass(settings.navCurStyle);
me.find(settings.showNav).eq(settings.imgInit - 1).addClass(settings.navCurStyle);
me.find(settings.showNav).bind(settings.navEventType, function(e) {
fnmove.call(me, current, $(this).index() + 1, settings);
//return false;
})
}
});
}
var init3D = function(container, settings) {
}
var fnmove = function(cur, goIndex, settings, flg, eventTrigger, callback) {
var self = $(this), offset_0 = 0, gotoIndex = goIndex;
var curindex = self.data("curindex");
var runenv = self.data("runenv");
if (settings.loop == "cycle") {
if (goIndex <= 0) {
offset_0 = (curindex + runenv.scrollunits.length + runenv.unitDisplayed - runenv.start) * runenv.unitLen;
settings.dir == "H" ? runenv.scrollObj.css("left", -offset_0) : runenv.scrollObj.css("top", -offset_0);
goIndex = runenv.scrollunits.length + goIndex;
} else {
if (curindex > runenv.scrollunits.length - runenv.unitDisplayed && goIndex > runenv.scrollunits.length) {
offset_0 = (curindex - runenv.scrollunits.length + runenv.unitDisplayed - runenv.start) * runenv.unitLen;
settings.dir == "H" ? runenv.scrollObj.css("left", -offset_0) : runenv.scrollObj.css("top", -offset_0);
goIndex = ((goIndex - 1) % runenv.scrollunits.length) + 1;
}
}
}
goIndex = goIndex >= runenv.canMoveLength ? runenv.canMoveLength : goIndex;
if (goIndex <= 0) {
goIndex = 1;
}
if (goIndex > 0) {
var offset = runenv.unitLen * (goIndex - runenv.start);
if (offset < 0) offset = 0;
self.data("curindex", goIndex);
var currentobj = self.data("curobj");
var EOF = false;
var BOF = false;
self.data("curobj", runenv.scrollunits.eq(goIndex - 1));
runenv.scrollunits.removeClass(settings.curStyle);
runenv.scrollunits.eq(goIndex - 1).addClass(settings.curStyle);
if (settings.showNav) {
self.find(settings.showNav).removeClass(settings.navCurStyle);
self.find(settings.showNav).eq(goIndex - 1).addClass(settings.navCurStyle);
}
if (settings.loop == "cycle") {
offset = runenv.unitLen * (goIndex - runenv.start + runenv.unitDisplayed);
}
if (curindex > goIndex) {
if (settings.loop == "cycle") {
}
else {
offset = offset <= runenv.scrollObjSize - runenv.viewedSize ? offset : runenv.scrollObjSize - runenv.viewedSize;
}
//console.log("<-", runenv.scrollObjSize - runenv.viewedSize - runenv.unitLen, offset);
if (offset <= runenv.scrollObjSize - runenv.viewedSize || settings.loop == "cycle") {
if (goIndex <= 1 && settings.loop != "cycle") {
BOF = true;
}
settings.beforeStart.call(self, {
goIndex: gotoIndex,
container: self,
current: currentobj,
next: runenv.scrollunits.eq(goIndex - 1),
eventTrigger: eventTrigger,
EOF: EOF,
BOF: BOF
});
$.fn.Xslider.sn.animate.call(self, runenv.scrollObj, -offset, settings.dir, runenv.unitLen, settings.speed, function() {
settings.afterEnd.call(self, {
goIndex: gotoIndex,
container: self,
current: currentobj,
next: runenv.scrollunits.eq(goIndex - 1),
eventTrigger: eventTrigger,
EOF: EOF,
BOF: BOF
});
if (callback) {
callback.call(self);
}
}, flg);
}
} else if (curindex == goIndex) {
//console.log("==");
if (callback) {
callback.call(self);
}
} else {
//console.log("->");
if (settings.loop == "cycle") {
} else {
runenv.scrollObjSize = runenv.scrollObjSize < runenv.viewedSize ? runenv.viewedSize : runenv.scrollObjSize;
offset = runenv.viewedSize > runenv.scrollObjSize - offset ? runenv.scrollObjSize - runenv.viewedSize : offset;
}
if (goIndex >= runenv.canMoveLength && settings.loop != "cycle") {
EOF = true;
}
settings.beforeStart.call(self, {
goIndex: gotoIndex,
container: self,
current: currentobj,
next: runenv.scrollunits.eq(goIndex - 1),
eventTrigger: eventTrigger,
EOF: EOF,
BOF: BOF
});
$.fn.Xslider.sn.animate.call(self, runenv.scrollObj, -offset, settings.dir, runenv.unitLen, settings.speed, function() {
settings.afterEnd.call(self, {
goIndex: gotoIndex,
container: self,
current: currentobj,
next: runenv.scrollunits.eq(goIndex - 1),
eventTrigger: eventTrigger,
EOF: EOF,
BOF: BOF
});
if (callback) {
callback.call(self);
}
}, flg);
}
runenv.btnleft.removeClass(settings.disableStyle.previous);
runenv.btnright.removeClass(settings.disableStyle.next);
if (goIndex <= 1 && settings.loop != "cycle") {
runenv.btnleft.addClass(settings.disableStyle.previous);
}
if (goIndex >= runenv.canMoveLength && settings.loop != "cycle") {
runenv.btnright.addClass(settings.disableStyle.next);
}
} else {
if (settings.loop != "cycle") {
runenv.btnleft.addClass(settings.disableStyle.previous);
}
}
}
var fnmuve3D = function(cur, goIndex, settings, flg, eventTrigger, callback) {
var self = $(this), offset_0 = 0, gotoIndex = goIndex;
var curindex = self.data("curindex");
var runenv = self.data("runenv");
}
var nextEvent = function(settings, eventTrigger) {
var me = this;
fnmove.call(me, me.data("curobj"), me.data("curindex") + settings.numtoMove, settings, false, eventTrigger);
}
var previousEvent = function(settings, eventTrigger) {
var me = this;
fnmove.call(me, me.data("curobj"), me.data("curindex") - settings.numtoMove, settings, false, eventTrigger);
}
var ClassSlider = function(container, settings) {
var self = this;
// factory or constructor
if (!(self instanceof ClassSlider)) {
return new ClassSlider(container, $.extend({}, $.fn.Xslider.sn.defaults, settings));
}
self.settings = settings;
init.call(this, container, self.settings);
self.container.each(function() {
var me = $(this);
var runenv = $(this).data("runenv");
var btnright = $(this).find(settings.btnNext),
btnleft = $(this).find(settings.btnPrevious);
btnleft.unbind(settings.eventType).bind(settings.eventType, function() {
previousEvent.call(me, settings, this);
return false;
});
btnright.unbind(settings.eventType).bind(settings.eventType, function() {
nextEvent.call(me, settings, this);
return false;
});
if (settings.autoScroll && runenv.scrollunits.length > runenv.unitDisplayed) {
//$.fn.Xslider.sn.autoScroll.call(self,me, settings.autoScroll);
var autoScrolling = function() {
if (runenv.scrollunits.length <= ~ ~me.data("curindex") && settings.loop != "cycle") {
fnmove.call(me, me.data("curobj"), 1, settings);
} else {
nextEvent.call(me, settings);
}
};
var scrollTimmer = setInterval(autoScrolling, settings.autoScroll);
me.hover(function() {
clearInterval(scrollTimmer);
}, function() {
clearInterval(scrollTimmer);
scrollTimmer = setInterval(autoScrolling, settings.autoScroll);
});
}
});
}
ClassSlider.prototype = {
go: function(n, eventTrigger, callback) {
var self = this;
//self.container = $(self.selector);
self.container.each(function() {
var me = $(this);
fnmove.call(me, me.data("curobj"), n, self.settings, false, eventTrigger, callback);
});
},
prev: function() {
var self = this;
self.container.each(function() {
var me = $(this);
previousEvent.call(me, self.settings);
});
},
next: function() {
var self = this;
self.container.each(function() {
var me = $(this);
nextEvent.call(me, self.settings);
});
},
getSet: function() {
return this.settings;
},
init: function(settings) {
if (settings) {
this.settings = settings;
}
init.call(this, this.container, this.settings);
},
getThis: function() {
return this;
},
eq: function(n) {
this.container = $(this.selector).eq(n);
return this;
}
}
$.fn.Xslider = function(settings) {
return ClassSlider(this, settings);
}
$.fn.Xslider.sn = {
defaults: {
unitDisplayed: 1,
dir: "H",
showNav: null,
navEventType: "mouseenter",
speed: 500,
scrollObj: "ul",
scrollunits: "li",
curStyle: "current",
eventType: "click",
imgInit: 1,
start: 1,
numtoMove: 1,
stepOne: false,
btnNext: "a.aright",
btnPrevious: "a.aleft",
afterEnd: function(e) { },
beforeStart: function(e) { },
disableStyle: { previous: "agrayleft", next: "agrayright" },
navCurStyle: "current"
},
animate: function(obj, w, dir, unitLen, speed, callback, noAnimate) {
if (dir == "H") {
if (noAnimate) {
obj.css({ left: w });
callback.call(this);
} else {
obj.stop().animate({
left: w
}, speed, "easeOutQuint", callback);
}
} else if (dir == "V") {
if (noAnimate) {
obj.css({ top: w });
callback.call(this);
} else {
obj.stop().animate({
top: w
}, speed, "easeOutQuint", callback);
}
} else if (dir == "F") {
var curindex = $(this).data("curindex");
if (noAnimate) {
obj.children(":visible").hide();
obj.children().eq(curindex - 1).show();
} else {
obj.children(":visible").stop(true, true).fadeOut(120);
obj.children().eq(curindex - 1).stop(true, true).fadeIn(speed, callback);
}
}
else if (dir == "F2") {
var curindex = $(this).data("curindex");
if (noAnimate) {
obj.children(":visible").hide();
obj.children().eq(curindex - 1).show();
} else {
var runenv = $(this).data("runenv");
var curobj = $(this).data("curobj");
runenv.scrollObj.prepend(curobj);
var len = runenv.scrollunits.length;
$(runenv.scrollunits.selector).each(function(i, v) {
$(this).css("z-index", len - i);
})
curobj.hide().fadeIn(speed, callback);
/*obj.children(":visible").css({zIndex:0}).show();
obj.children().eq(-w / unitLen).hide().css({zIndex:1}).fadeIn(speed, callback);*/
}
} else if (dir == "noanim") {
callback();
}
}
}
})(jQuery);
window["UI"] = window["UI"] || {};
UI["Xslider"] = function(s, op) {
return $(s).Xslider(op);
}