| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333 | /** * aui-slide.js 轮播组件 * @author 流浪男 * http://www.auicss.com * @todo more things to abstract, e.g. Loading css etc. * Licensed under the MIT license. * http://www.opensource.org/licenses/mit-license.php */(function(window) {	"use strict";	var translateVal,		firstTouchX,		firstTouchY,		touchXDelta,		handleTranslateVal;	var touchStartTime; //开始触摸事件	var offsetX,		offsetY,		isScrolling;	// CLASS 组装	var	CLASS_SLIDER_NODE = "aui-slide-node",		CLASS_SLIDE_PAGE_WRAP = "aui-slide-page-wrap",		CLASS_SLIDE_PAGE = "aui-slide-page",		CLASS_SLIDE_PAGE_ACTIVE = "aui-slide-page-active",		CLASS_SLIDE_PAGE_DOT = "aui-slide-page-dot",		CLASS_SLIDE_PAGE_LINE = "aui-slide-page-line";	var __SLIDER_NODE = "."+CLASS_SLIDER_NODE,		__SLIDE_PAGE_WRAP = "."+CLASS_SLIDE_PAGE_WRAP,		__SLIDE_PAGE = "."+CLASS_SLIDE_PAGE,		__SLIDE_PAGE_ACTIVE = "."+CLASS_SLIDE_PAGE_ACTIVE;	auiSlide.prototype.options = {		container:'',		width:'auto',		height:'auto',		speed: 300, //滑动速速		autoPlay: 0, //自动播放		pageShow: true, //是否显示分页器		pageStyle: 'dot',		dotPosition: 'center',		friction:1, //阻力		loop:true,		currentPage:false,		PageCount:false	};	auiSlide.prototype._init = function(options) {		extend(this.options, options);		if(!this.options.container){			return;		}		this.index = 0; //索引值		this.continuous = true;//用于判断长度为2时的特殊处理		this.container = this.options.container;		// console.log(this.options.loop);		this.loop = this.options.loop;		this.speed = this.options.speed;		this.container.style.position = "relative";		this.container.style.width = this.options.width+"px";		this.container.style.height = this.options.height+"px";		var element = this.container.children[0];		this.slideWrap = element;		this.slideNodeList = this.slideWrap.querySelectorAll(__SLIDER_NODE);		if(!element || !this.slideNodeList){			return;		}		// this.options.pageCount(this.slideNodeList.length);		this.slideWrapWidth = this.slideWrap.offsetWidth;		this.slideNodeListLength = this.slideNodeList.length;		if (this.slideNodeListLength == 2) { //当长度为2时作特殊处理			element.appendChild(this.slideWrap.children[0].cloneNode(true));			element.appendChild(this.slideWrap.children[1].cloneNode(true));			this.slideWrap = element;			this.slideNodeList = this.slideWrap.querySelectorAll(__SLIDER_NODE);	    	this.slideNodeListLength = this.slideNodeList.length;	    	this.continuous = false;	    }		for (var i = 0; i < this.slideNodeListLength; i++) {			this.slideNodeList[i] && (this.slideNodeList[i].style.webkitTransform = this.slideNodeList[i].style.transform = "translate3d("+(this.slideWrapWidth*i)+"px,0,0)");		}		if(this.slideNodeListLength > 1) {			if(this.options.pageShow){				this.createPagination(0);				this.setPageDotPosition();			}			if(this.options.autoPlay > 500 && this.loop){				this.autoPlay(0);			}			this.slideWrap.addEventListener('touchstart', this.touchStart.bind(this), false);			this.slideWrap.addEventListener('touchmove', this.touchMove.bind(this), false);			this.slideWrap.addEventListener('touchend', this.touchEnd.bind(this), false);		}	};	// 当分页器为圆点时位置设置	auiSlide.prototype.setPageDotPosition = function(){		var self = this;		var pageDotPosition = self.options.dotPosition;		this.container.querySelector(__SLIDE_PAGE_WRAP).style.textAlign = pageDotPosition;	};	// 自动播放	auiSlide.prototype.autoPlay = function (index) {		var self = this;		setInterval(function(){			self.slideTo(self.getCircle(self.index-1), -self.slideWrapWidth, 0);	        self.slideTo(self.getCircle(self.index+2), self.slideWrapWidth, 0);	        self.slideTo(self.index, -self.slideWrapWidth, self.options.speed);	        self.slideTo(self.getCircle(self.index+1), 0, self.options.speed);	        self.index = self.getCircle(self.index+1);	        self.setPaginationActive(self.index);		}, self.options.autoPlay)	};	// 设置当前分页	auiSlide.prototype.setPaginationActive = function(index){		var self = this;		if(self.options.currentPage){			self.options.currentPage(index);		}		if(!this.container.querySelector(__SLIDE_PAGE_WRAP)){			return;		}		var pageList = this.container.querySelectorAll(__SLIDE_PAGE);		if(this.container.querySelector(__SLIDE_PAGE+__SLIDE_PAGE_ACTIVE)){			this.container.querySelector(__SLIDE_PAGE+__SLIDE_PAGE_ACTIVE).classList.remove(CLASS_SLIDE_PAGE_ACTIVE);		}		if(!this.continuous){			if(this.index == 3){				pageList[1].classList.add(CLASS_SLIDE_PAGE_ACTIVE);			}else if(this.index==2){				pageList[0].classList.add(CLASS_SLIDE_PAGE_ACTIVE);			}else{				pageList[this.index].classList.add(CLASS_SLIDE_PAGE_ACTIVE);			}		}else{			pageList[this.index].classList.add(CLASS_SLIDE_PAGE_ACTIVE);		}	};	// 创建分页器	auiSlide.prototype.createPagination = function(index){		var self = this;		var pageWrap = this.container.querySelector(__SLIDE_PAGE_WRAP);		if(!pageWrap){			return;		}		pageWrap.innerHTML = '';		var pageShowHtml = '';		switch (self.options.pageStyle) {			case "dot":// 原点						if (!this.continuous) {							for (var i = 0; i < 2; i++) {								pageShowHtml += '<span class="'+CLASS_SLIDE_PAGE+' '+CLASS_SLIDE_PAGE_DOT+'"></span>';							}						}else{							for (var i = 0; i < this.slideNodeListLength; i++) {								pageShowHtml += '<span class="'+CLASS_SLIDE_PAGE+' '+CLASS_SLIDE_PAGE_DOT+'"></span>';							}						}						pageWrap.innerHTML = pageShowHtml;						self.setPaginationActive(0);				break;			case "line":// 线条						if (!this.continuous) {							for (var i = 0; i < 2; i++) {								pageShowHtml += '<span class="'+CLASS_SLIDE_PAGE+' '+CLASS_SLIDE_PAGE_LINE+'" style="width:50%"></span>';							}						}else{							for (var i = 0; i < this.slideNodeListLength; i++) {								pageShowHtml += '<span class="'+CLASS_SLIDE_PAGE+' '+CLASS_SLIDE_PAGE_LINE+'" style="width:'+(100/this.slideNodeListLength)+'%"></span>';							}						}						pageWrap.innerHTML = pageShowHtml;						self.setPaginationActive(0);				break;		}	};	// 总页数	auiSlide.prototype.pageCount = function() {		var self = this;		return self.slideNodeList.length;	};	auiSlide.prototype.touchStart = function(event) {		touchStartTime = new Date() * 1;		firstTouchX = parseInt(event.changedTouches[0].pageX);		firstTouchY = parseInt(event.changedTouches[0].pageY);		isScrolling = undefined;	};	auiSlide.prototype.touchMove = function(event) {		var touchMoveObj = event.changedTouches[0],				touchX = parseInt(touchMoveObj.pageX);			touchXDelta = touchX - firstTouchX;			handleTranslateVal = touchXDelta/this.options.friction;		//  滑动位移		offsetX = parseInt(touchMoveObj.pageX) - firstTouchX;        offsetY = parseInt(touchMoveObj.pageY) - firstTouchY;        var direction = this.getDirection(offsetX,offsetY);        if ( typeof isScrolling == 'undefined') {			isScrolling = !!( isScrolling || Math.abs(offsetX) < Math.abs(offsetY) );		}		if(!isScrolling){			event.preventDefault();			if(!this.loop){ //不循环				if(!this.continuous && this.index==1 && direction=='left'){					return;				}				if(!this.continuous && this.index==0 && direction=='right'){					return;				}				if(this.index == this.slideNodeList.length-1){					if(handleTranslateVal <= 0){						return;					}					this.setTranslate(this.getCircle(this.index-1), handleTranslateVal - this.slideWrapWidth, 0);				}else if(this.index == 0){					if(handleTranslateVal >= 0){						return;					}					this.setTranslate(this.getCircle(this.index+1), this.slideWrapWidth, 0);				}			}			this.setTranslate(this.getCircle(this.index-1), handleTranslateVal - this.slideWrapWidth, 0);			this.setTranslate(this.index, handleTranslateVal , 0);			this.setTranslate(this.getCircle(this.index+1), handleTranslateVal + this.slideWrapWidth, 0);		}	};	auiSlide.prototype.touchEnd = function(event) {		var touchEndObj = event.changedTouches[0];		var touchEndX = parseInt(touchEndObj.pageX) - firstTouchX;        var touchEndY = parseInt(touchEndObj.pageY) - firstTouchY;		var touchEndxy = {				x: touchEndObj.pageX || 0,				y: touchEndObj.pageY || 0			};		var moveDirection = this.getDirection(touchEndX,touchEndY); //滑动方向		var boundary = this.slideWrapWidth/4;		var duration = (new Date() * 1) - touchStartTime;		var isValid = Number(duration) < 250 && Math.abs(offsetX) > 20 || Math.abs(offsetX) > boundary;		if (isScrolling) {			return;		}        if(isValid){			if(offsetX < 0){				if(!this.loop && this.index == this.slideNodeList.length-1){					return;				}				if(!this.loop && !this.continuous && this.index==1){					return;				}	        	if(offsetX < -boundary && moveDirection == 'left'){	        		// left					this.slideTo(this.getCircle(this.index-1), -this.slideWrapWidth, 0);		            this.slideTo(this.getCircle(this.index+2), this.slideWrapWidth, 0);		            this.slideTo(this.index, -this.slideWrapWidth, this.speed);		            this.slideTo(this.getCircle(this.index+1), 0, this.speed);		            this.index = this.getCircle(this.index+1);				}else{					// this.slideTo(this.getCircle(this.index-1), -this.slideWrapWidth, this.speed);		            this.slideTo(this.index, 0, this.speed);		            this.slideTo(this.getCircle(this.index+1), this.slideWrapWidth, this.speed);				}	        }else if(offsetX > 0){	        	if(!this.loop && this.index == 0){					return;				}				if(!this.loop && !this.continuous && this.index==0){					return;				}	        	if(offsetX > boundary && moveDirection == 'right'){	        		// right		        	this.slideTo(this.getCircle(this.index+1), this.slideWrapWidth, 0);		            this.slideTo(this.getCircle(this.index-2), -this.slideWrapWidth, 0);		            this.slideTo(this.index, this.slideWrapWidth, this.speed);		            this.slideTo(this.getCircle(this.index-1), 0, this.speed);		            this.index = this.getCircle(this.index-1);	        	}else{	        		// this.slideTo(this.getCircle(this.index-1), -this.slideWrapWidth, this.speed);		            this.slideTo(this.index, 0, this.speed);		            this.slideTo(this.getCircle(this.index+1), this.slideWrapWidth, this.speed);	        	}	        }        }else{        	if(offsetX){        		this.slideTo(this.getCircle(this.index-1), -this.slideWrapWidth, this.speed);	            this.slideTo(this.index, 0, this.speed);	            this.slideTo(this.getCircle(this.index+1), this.slideWrapWidth, this.speed);        	}        }        this.setPaginationActive(this.index);	};	auiSlide.prototype.setTranslate = function (index,dist,speed){		if(this.slideNodeList[index]){			this.slideNodeList[index].style.webkitTransitionDuration =	    	this.slideNodeList[index].style.transitionDuration = speed + 'ms';	    	this.slideNodeList[index].style.webkitTransform =	    	this.slideNodeList[index].style.transform = "translate3d("+dist+"px,0,0)";		}	};	auiSlide.prototype.slideTo = function (index, dist, speed) {		this.setTranslate(index, dist, speed);		// index = dist;	};	auiSlide.prototype.getCircle = function (index) {	    return (this.slideNodeListLength + (index % this.slideNodeListLength)) % this.slideNodeListLength;	};	auiSlide.prototype.getDirection = function(x, y) {		if (x === y) { return '';}		if (Math.abs(x) >= Math.abs(y)) {            return x > 0 ? 'right' : 'left';        } else {           	return y > 0 ? 'down' : 'up';        }	}	function extend (a, b) {		for (var key in b) {		  	if (b.hasOwnProperty(key)) {		  		a[key] = b[key];		  	}	  	}	  	return a;	}	function auiSlide (options) {		this._init(options);	}	window.auiSlide = auiSlide;})(window);
 |