;(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" : 450, //幻灯片的高度 "posterwidth" : 600, //幻灯片第一帧的宽度 "posterheight" : 450, //幻灯片第一帧的高度 "scale" : 0.9, //记录显示比例关系 "speed" : 500, "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);