/* * 版权所有 (C) 2015 知启蒙(ZHIQIM) 保留所有权利。 * * 指定登记&发行网站: https://www.zhiqim.com/ 欢迎加盟知启蒙,[编程有你,知启蒙一路随行]。 * * 本文采用《知启蒙登记发行许可证》,除非符合许可证,否则不可使用该文件! * 1、您可以免费使用、修改、合并、出版发行和分发,再授权软件、软件副本及衍生软件; * 2、您用于商业用途时,必须在原作者指定的登记网站,按原作者要求进行登记; * 3、您在使用、修改、合并、出版发行和分发时,必须包含版权声明、许可声明,及保留原作者的著作权、商标和专利等知识产权; * 4、您在互联网、移动互联网等大众网络下发行和分发再授权软件、软件副本及衍生软件时,必须在原作者指定的发行网站进行发行和分发; * 5、您可以在以下链接获取一个完整的许可证副本。 * * 许可证链接:http://zhiqim.org/licenses/zhiqim_register_publish_license.htm * * 除非法律需要或书面同意,软件由原始码方式提供,无任何明示或暗示的保证和条件。详见完整许可证的权限和限制。 */ +(function(Z) { /****************************************/ //“轮播图” /****************************************/ Z.ZmSlider = Z.Class.newInstance(); Z.ZmSlider.prototype = { //start of Z.ZmSlider.prototype defaults: {//定义 elem: '', // 主容器 rectRatio: 2, // 宽度比例 playAuto: true, // 设定自动滚动 playSpeed: 2000, // 播放间隔 transDur: 300, // 动画时长 transFun: "ease", // 动画轨迹 }, init: function() {//初始化 }, execute: function() {//执行 //1:重新组装排版 this.$touch = Z.$elem(this.elem, "Z.ZmSlider").addClass("z-slider-touch"); this.$wrap = Z('
').insertAfter(this.$touch); this.$wrap.append(this.$touch); this.$tab = Z('
').appendTo(this.$wrap); this.$$items = this.$touch.children("li"); //2:基本参数 this.width = this.$wrap.offsetWidth(); this.height = this.width/this.rectRatio; this.length = this.$$items.length; if (this.rectRatio < 0){ this.rectRatio = 2; } if (this.playSpeed < this.transDur){ this.playSpeed = this.transDur; } //3:插入展示按钮html var btnsHtml = ""; for(var i = 0;i < this.length;i++){ btnsHtml += ''; } this.$tab.html(btnsHtml); this.$$tabs = this.$tab.children("span"); //4:初始化样式、位置 this.$wrap.css("height",this.height); if (this.length <= 1) {/*一张图片时*/ return; } if (this.length == 2) {/*两个滚动素材的情况*/ this.$touch.css("transition-timing-function",this.transFun).css("transition-duration",this.transDur+"ms") .css("transform","translate3d(0,0,0)"); Z(this.$$items[0]).css("transform","translate3d(0,0,0)").addClass("z-active"); Z(this.$$items[1]).css("transform","translate3d("+this.width+"px,0,0)"); //要实现无缝滚动,需复制节点 this.$firstClone = Z(this.$$items[0].cloneNode(true)).appendTo(this.$touch); this.$lastClone = Z(this.$$items[1].cloneNode(true)).appendTo(this.$touch); this.$firstClone.css("transform","translate3d("+2*this.width+"px,0,0)"); this.$lastClone.css("transform","translate3d(-"+this.width+"px,0,0)"); //动画结束,位置调整 this.$touch.on(this.transitionFixed(), this.doubleSlideEnd, this); } else {/*两张以上滚动素材的情况*/ this.$$items.css("transition-timing-function",this.transFun).css("transition-duration",this.transDur+"ms"); var that = this; Z.each(this.$$items, function($item,index){ var translateX = index * that.width + "px"; if (index == 0) { Z($item).addClass("z-active"); } if (index == that.length - 1) { translateX = -that.width + "px"; } Z($item).css("transform","translate3d("+translateX+",0,0)"); }); } Z(this.$$tabs[0]).addClass("z-active"); //5:滑动事件绑定 this.touchmoving = false; this.$touch.on("touchstart",this.touchStart,this); this.$touch.on("touchmove",this.touchMove,this); this.$touch.on("touchend",this.touchEnd,this); //6:开始执行动画 this.autoPlay(); }, autoPlay: function() { if(this.playAuto){ var that = this; that.timer = setInterval(function(){ that.sliderNext(that); },that.playSpeed); } }, touchStart:function(ev) {//触摸事件开始 Z.E.forbidden(ev); var touch = ev.touches[0]; this.touchStartX = touch.pageX; //清除自动 clearInterval(this.timer); //两个滚动素材的情况 if (this.length == 2){ var step = +step; var $activeItem = this.$touch.find(".z-active"); var activeIndex = Z.AR.indexOf(this.$$items, $activeItem[0]); this.touchBase = -activeIndex*this.width; this.$touch.css("transition-property","none"); return; } //当前、前一个、后一个 this.$activeItem = this.$touch.find(".z-active"); var activeIndex = Z.AR.indexOf(this.$$items, this.$activeItem[0]); this.$activeNext = Z(this.$$items[activeIndex + 1] || this.$$items[0]); this.$activePrev = Z(this.$$items[activeIndex - 1] || this.$$items[this.length - 1]); //清除transition this.$activeItem.css("transition-duration","0ms"); this.$activeNext.css("transition-duration","0ms"); this.$activePrev.css("transition-duration","0ms"); }, touchMove: function(ev) {//滑动中 if(this.touchmoving == false){ this.touchmoving = true; } Z.E.forbidden(ev); var touch = ev.touches[0]; this.touchMoveX = touch.pageX; //设置translate var metabolicX = this.touchMoveX - this.touchStartX; //两个滚动素材的情况 if (this.length == 2){ this.$touch.css("transform","translate3d("+(metabolicX+this.touchBase)+"px,0,0)"); return; } this.$activeItem.css("transform","translate3d("+metabolicX+"px,0,0)"); this.$activeNext.css("transform","translate3d("+(metabolicX + this.width)+"px,0,0)"); this.$activePrev.css("transform","translate3d("+(metabolicX - this.width)+"px,0,0)"); }, touchEnd: function(ev) {//触摸事件结束 if (this.touchmoving == false){ return; } this.touchmoving = false; Z.E.forbidden(ev); //执行自动 this.autoPlay(); //判断滑动结果 var metabolicX = this.touchMoveX - this.touchStartX; if (metabolicX == 0 || Math.abs(metabolicX) < this.width/2){ this.sliderStay(); return; } if (this.$activeItem) this.$activeItem.css("transition-duration",this.transDur+"ms"); if (metabolicX < 0){ if (this.$activeNext) this.$activeNext.css("transition-duration",this.transDur+"ms"); this.sliderNext(); } else { if (this.$activePrev) this.$activePrev.css("transition-duration",this.transDur+"ms"); this.sliderPrev(); } }, sliderNext: function() {//后一个展示 if (this.length == 2){ this.doubleSlide(1); return; } this.sliderPlay(1); }, sliderStay: function () {//保持展示 if (this.length == 2){ this.doubleSlide(0); return; } this.sliderPlay(0); }, sliderPrev: function() {//前一个展示 if (this.length == 2){ this.doubleSlide(-1); return; } this.sliderPlay(-1); }, sliderPlay: function(step) {//滑动方法 var step = +step; var $activeItem = this.$touch.find(".z-active"); var activeIndex = Z.AR.indexOf(this.$$items, $activeItem[0]); $activeItem.removeClass("z-active"); //即将展示对象的索引值 var shouldIndex = activeIndex + step; if (shouldIndex >= this.length) shouldIndex = 0; if (shouldIndex <= -1) shouldIndex = this.length - 1; //即将新定位的active,以及前后两个 var $shouldActive = Z(this.$$items[shouldIndex]); var $shouldNext = Z(this.$$items[shouldIndex + 1] || this.$$items[0]); var $shouldPrev = Z(this.$$items[shouldIndex - 1] || this.$$items[this.length - 1]); //touch item新定位 $shouldActive.addClass("z-active").css("transform","translate3d(0,0,0)") .css("transition-duration",this.transDur+"ms"); $shouldNext.css("transform","translate3d("+this.width+"px,0,0)"); $shouldPrev.css("transform","translate3d(-"+this.width+"px,0,0)"); //前后两个判断是否动画 var nextDur = prevDur = this.transDur+"ms"; if (step > 0){ nextDur = "0ms";} else if(step < 0){ prevDur = "0ms";} $shouldNext.css("transition-duration",nextDur); $shouldPrev.css("transition-duration",prevDur); //btn 展示 Z(this.$$tabs[shouldIndex]).addClass("z-active") .siblings("span").removeClass("z-active"); }, doubleSlide: function(step) {//两个滚动素材的动画 var step = +step; var $activeItem = this.$touch.find(".z-active"); var activeIndex = Z.AR.indexOf(this.$$items, $activeItem[0]); $activeItem.removeClass("z-active"); var num = shouldIndex = activeIndex + step; if (shouldIndex >= this.length) shouldIndex = 0; if (shouldIndex <= -1) shouldIndex = this.length - 1; Z(this.$$items[shouldIndex]).addClass("z-active"); this.$touch.css("transform", "translate3d("+(-num*this.width)+"px,0,0)") .css("transition-property","transform"); //btn 展示 Z(this.$$tabs[shouldIndex]).addClass("z-active") .siblings("span").removeClass("z-active"); }, doubleSlideEnd: function() {//两图片的滚动结束 var $activeItem = this.$touch.find(".z-active"); var activeIndex = Z.AR.indexOf(this.$$items, $activeItem[0]); this.$touch.css("transition-property","none"); if(activeIndex == 0){ this.$touch.css("transform", "translate3d(0,0,0)"); } if(activeIndex == 1){ this.$touch.css("transform", "translate3d("+(-this.width)+"px,0,0)"); } }, transitionFixed: function() {//兼容写法 var $div = document.createElement('div'); if ($div.style["transition"] !== undefined ){ $div = null; return "transitionend"; } if ($div.style["OTransition"] !== undefined ){ $div = null; return "oTransitionEnd"; } if ($div.style["WebkitTransition"] !== undefined ){ $div = null; return "webkitTransitionEnd"; } }, //end of Z.ZmSlider.prototype } //END })(zhiqim);