;(function($){
|
|
var Carousel = function(poster){
|
var self = this;
|
//保存单个旋转木马对象
|
this.poster = poster;
|
this.posterItemMain = poster.find("ul.poster-list");
|
this.nextBtn = poster.find("div.poster-next-btn");
|
this.prevBtn = poster.find("div.poster-prev-btn");
|
this.posterItems = poster.find("li.poster-item");
|
if( this.posterItems.size()%2 == 0 ){
|
this.posterItemMain.append( this.posterItems.eq(0).clone() );
|
this.posterItems = this.posterItemMain.children();
|
};
|
this.posterFirstItem = this.posterItems.first();
|
this.posterLastItem = this.posterItems.last();
|
this.rotateFlag = true;
|
//默认配置参数
|
this.setting = {
|
"width" : 1000, //幻灯片的宽度
|
"height" : 315, //幻灯片的高度
|
"posterWidth" : 640, //幻灯片第一帧的宽度
|
"posterHeight" : 270, //幻灯片第一帧的高度
|
"scale" : 0.8, //记录显示比例关系
|
"speed" : 1000,
|
"autoPlay" : false,
|
"delay" : 5000,
|
"verticalAlign" : "middle" //top bottom
|
};
|
$.extend( this.setting,this.getSetting() );
|
|
//设置配置参数值
|
this.setSettingValue();
|
//初始化幻灯片位置
|
this.setPosterPos();
|
//左旋转按钮
|
this.nextBtn.click(function(){
|
if(self.rotateFlag){
|
self.rotateFlag = false;
|
self.carouseRotate("left");
|
};
|
});
|
//右旋转按钮
|
this.prevBtn.click(function(){
|
if(self.rotateFlag){
|
self.rotateFlag = false;
|
self.carouseRotate("right");
|
};
|
});
|
//是否开启自动播放
|
if(this.setting.autoPlay){
|
this.autoPlay();
|
this.poster.hover( function(){
|
//self.timer是setInterval的种子
|
window.clearInterval(self.timer);
|
}, function(){
|
self.autoPlay();
|
});
|
};
|
};
|
Carousel.prototype = {
|
autoPlay:function(){
|
var self = this;
|
this.timer = window.setInterval( function(){
|
self.nextBtn.click();
|
}, this.setting.delay );
|
},
|
|
//旋转
|
carouseRotate:function(dir){
|
var _this_ = this;
|
var zIndexArr = [];
|
//左旋转
|
if(dir === "left"){
|
this.posterItems.each(function(){
|
var self = $(this),
|
prev = self.prev().get(0)?self.prev():_this_.posterLastItem,
|
width = prev.width(),
|
height =prev.height(),
|
opacity = prev.css("opacity"),
|
left = prev.css("left"),
|
top = prev.css("top"),
|
zIndex = prev.css("zIndex");
|
|
zIndexArr.push(zIndex);
|
self.animate({
|
width :width,
|
height :height,
|
//zIndex :zIndex,
|
opacity :opacity,
|
left :left,
|
top :top
|
},_this_.setting.speed,function(){
|
_this_.rotateFlag = true;
|
});
|
});
|
//zIndex需要单独保存再设置,防止循环时候设置再取的时候值永远是最后一个的zindex
|
this.posterItems.each(function(i){
|
$(this).css("zIndex",zIndexArr[i]);
|
});
|
}else if(dir === "right"){//右旋转
|
this.posterItems .each(function(){
|
var self = $(this),
|
next = self.next().get(0)?self.next():_this_.posterFirstItem,
|
width = next.width(),
|
height =next.height(),
|
opacity = next.css("opacity"),
|
left = next.css("left"),
|
top = next.css("top"),
|
zIndex = next.css("zIndex");
|
|
zIndexArr.push(zIndex);
|
self.animate({
|
width :width,
|
height :height,
|
//zIndex :zIndex,
|
opacity :opacity,
|
left :left,
|
top :top
|
},_this_.setting.speed,function(){
|
_this_.rotateFlag = true;
|
});
|
});
|
//zIndex需要单独保存再设置,防止循环时候设置再取的时候值永远是最后一个的zindex
|
this.posterItems.each(function(i){
|
$(this).css("zIndex",zIndexArr[i]);
|
});
|
};
|
},
|
//设置剩余的帧的位置关系
|
setPosterPos:function(){
|
var self = this,
|
sliceItems = this.posterItems.slice(1),
|
sliceSize = sliceItems.size()/2,
|
rightSlice = sliceItems.slice(0,sliceSize),
|
//存在图片奇偶数问题
|
level = Math.floor(this.posterItems.size()/2),
|
leftSlice = sliceItems.slice(sliceSize);
|
|
//设置右边帧的位置关系和宽度高度top
|
var firstLeft = (this.setting.width - this.setting.posterWidth)/2;
|
var rw = this.setting.posterWidth,
|
fixOffsetLeft = firstLeft + rw,
|
rh = this.setting.posterHeight,
|
gap = ((this.setting.width - this.setting.posterWidth)/2)/level;
|
|
//设置右边位置关系
|
rightSlice.each(function(i){
|
level--;
|
rw = rw * self.setting.scale;
|
rh = rh * self.setting.scale;
|
var j = i;
|
$(this).css({
|
zIndex :level,
|
width :rw,
|
height :rh,
|
opacity :1/(++j),
|
left :fixOffsetLeft+(++i)*gap - rw,
|
top :self.setVerticalAlign(rh)
|
});
|
});
|
|
//设置左边的位置关系
|
var lw = rightSlice.last().width(),
|
lh =rightSlice.last().height(),
|
oloop = Math.floor(this.posterItems.size()/2);
|
leftSlice.each(function(i){
|
$(this).css({
|
zIndex:i,
|
width:lw,
|
height:lh,
|
opacity:1/oloop,
|
left:i*gap,
|
top:self.setVerticalAlign(lh)
|
});
|
lw = lw/self.setting.scale;
|
lh = lh/self.setting.scale;
|
oloop--;
|
});
|
},
|
|
//设置垂直排列对齐
|
setVerticalAlign:function(height){
|
var verticalType = this.setting.verticalAlign,
|
top = 0;
|
if(verticalType === "middle"){
|
top = (this.setting.height-height)/2;
|
}else if(verticalType === "top"){
|
top = 0;
|
}else if(verticalType === "bottom"){
|
top = this.setting.height-height;
|
}else{
|
top = (this.setting.height-height)/2;
|
};
|
return top;
|
},
|
|
//设置配置参数值去控制基本的宽度高度。。。
|
setSettingValue:function(){
|
this.poster.css({
|
width:this.setting.width,
|
height:this.setting.height
|
});
|
this.posterItemMain.css({
|
width:this.setting.width,
|
height:this.setting.height
|
});
|
//计算上下切换按钮的宽度
|
var w = (this.setting.width-this.setting.posterWidth)/2;
|
//设置切换按钮的宽高,层级关系
|
this.nextBtn.css({
|
width:w,
|
height:this.setting.height,
|
zIndex:Math.ceil(this.posterItems.size()/2)
|
});
|
this.prevBtn.css({
|
width:w,
|
height:this.setting.height,
|
zIndex:Math.ceil(this.posterItems.size()/2)
|
});
|
this.posterFirstItem.css({
|
width:this.setting.posterWidth,
|
height:this.setting.posterHeight,
|
left:w,
|
top:0,
|
zIndex:Math.floor(this.posterItems.size()/2)
|
});
|
},
|
|
//获取人工配置参数
|
getSetting:function(){
|
var setting = this.poster.attr("data-setting");
|
if(setting && setting != ""){
|
return $.parseJSON(setting);
|
}else{
|
return {};
|
};
|
}
|
};
|
|
Carousel.init = function(posters){
|
var _this_ = this;
|
posters.each(function(){
|
console.log("halo Louis;")
|
new _this_($(this));
|
});
|
};
|
|
//挂载到window下
|
window["Carousel"] = Carousel;
|
|
})(jQuery);
|