|
|
/*
|
|
|
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);
|
|
|
} |