yqb
Version:
Static Package Manager
238 lines (208 loc) • 7.62 kB
JavaScript
/*!
* zepto.fullpage.js v0.3.1 (https://github.com/yanhaijing/zepto.fullpage)
* API https://github.com/yanhaijing/zepto.fullpage/blob/master/doc/api.md
* Copyright 2014 yanhaijing. All Rights Reserved
* Licensed under MIT (https://github.com/yanhaijing/zepto.fullpage/blob/master/LICENSE)
*/
(function(window) {
document.addEventListener('touchmove', function(e) {
e.preventDefault();
});
var d = {
page: '.page',
start: 0,
duration: 500,
loop: false,
drag: false,
dir: 'v',
der: 0.1,
change: function(data) {},
beforeChange: function(data) {},
afterChange: function(data) {},
orientationchange: function(orientation) {}
};
function fix(cur, pagesLength, loop) {
if (cur < 0) {
return !!loop ? pagesLength - 1 : 0;
}
if (cur >= pagesLength) {
return !!loop ? 0 : pagesLength - 1;
}
return cur;
}
function move(ele, dir, dist) {
var xPx = "0px" , yPx = "0px";
if(dir === 'v') yPx = dist+"px";
else xPx = dist + "px";
ele.style.cssText += (';-webkit-transform : translate3d(' + xPx + ', ' + yPx + ', 0px);' +
'transform : translate3d(' + xPx + ', ' + yPx + ', 0px);');
}
function init(option) {
var o = option ? option : {};
for (var key in d) {
if(!o.hasOwnProperty(key)){
o[key] = d[key];
}
}
var that = this;
that.curIndex = -1;
that.o = o;
that.startY = 0;
that.movingFlag = false;
that.ele.classList.add('fullPage-wp');
that.parentEle = that.ele.parentNode;
var query = o.page;
if(query.indexOf(".")==0){
query = query.substring(1, query.length);
}
that.pageEles = that.ele.getElementsByClassName(query);
for (var i = 0; i < that.pageEles.length; i++) {
var pageEle = that.pageEles[i];
pageEle.classList.add('fullPage-page');
pageEle.classList.add('fullPage-dir-' + o.dir);
}
that.pagesLength = that.pageEles.length;
that.update();
that.initEvent();
that.status = 1;
}
function Fullpage(ele, option) {
this.ele = ele;
init.call(this, option);
}
Fullpage.prototype.update = function() {
if (this.o.dir === 'h') {
this.width = this.parentEle.offsetWidth;
for (var i = 0; i < this.pageEles.length; i++) {
var pageEle = this.pageEles[i];
pageEle.style.width = this.width+ "px";
}
this.ele.style.width = (this.width * this.pagesLength)+ "px";
}
this.height = this.parentEle.offsetHeight;
for (var i = 0; i < this.pageEles.length; i++) {
var pageEle = this.pageEles[i];
pageEle.style.height = this.height + "px";
}
this.moveTo(this.curIndex < 0 ? this.o.start : this.curIndex);
};
Fullpage.prototype.initEvent = function() {
var that = this;
var ele = that.ele;
ele.addEventListener('touchstart', function(e) {
if (!that.status) {return 1;}
//e.preventDefault();
if (that.movingFlag) {
return 0;
}
that.startX = e.targetTouches[0].pageX;
that.startY = e.targetTouches[0].pageY;
});
ele.addEventListener('touchend', function(e) {
if (!that.status) {return 1;}
//e.preventDefault();
if (that.movingFlag) {
return 0;
}
var sub = that.o.dir === 'v' ? (e.changedTouches[0].pageY - that.startY)/that.height : (e.changedTouches[0].pageX - that.startX)/that.width;
var der = (sub > that.o.der || sub < -that.o.der) ? sub > 0 ? -1 : 1 : 0;
that.moveTo(that.curIndex + der, true);
});
if (that.o.drag) {
ele.addEventListener('touchmove', function(e) {
if (!that.status) {return 1;}
//e.preventDefault();
if (that.movingFlag) {
that.startX = e.targetTouches[0].pageX;
that.startY = e.targetTouches[0].pageY;
return 0;
}
var y = e.changedTouches[0].pageY - that.startY;
if( (that.curIndex==0 && y>0) || (that.curIndex===that.pagesLength-1 && y<0) ) y/=2;
var x = e.changedTouches[0].pageX - that.startX;
if( (that.curIndex==0 && x>0) || (that.curIndex===that.pagesLength-1 && x<0) ) x/=2;
var dist = (that.o.dir === 'v' ? (-that.curIndex * that.height + y) : (-that.curIndex * that.width + x));
ele.classList.remove('anim');
move(ele, that.o.dir, dist);
});
}
// 翻转屏幕提示
// ==============================
window.addEventListener("orientationchange", function() {
if (window.orientation === 180 || window.orientation === 0) {
that.o.orientationchange('portrait');
}
if (window.orientation === 90 || window.orientation === -90) {
that.o.orientationchange('landscape');
}
}, false);
window.addEventListener("resize", function() {
that.update();
}, false);
};
Fullpage.prototype.start = function() {
this.status = 1;
};
Fullpage.prototype.stop = function() {
this.status = 0;
};
Fullpage.prototype.getCurIndex = function () {
return this.curIndex;
};
Fullpage.prototype.moveTo = function(next, anim) {
var that = this;
var ele = that.ele;
var cur = that.curIndex;
next = fix(next, that.pagesLength, that.o.loop);
if (anim) {
ele.classList.add('anim');
} else {
ele.classList.remove('anim');
}
if (next !== cur) {
var flag = that.o.beforeChange({
next: next,
cur: cur
});
// beforeChange 显示返回false 可阻止滚屏的发生
if (flag === false) {
return 1;
}
}
that.movingFlag = true;
that.curIndex = next;
move(ele, that.o.dir, -next * (that.o.dir === 'v' ? that.height : that.width));
if (next !== cur) {
that.o.change({
prev: cur,
cur: next
});
}
window.setTimeout(function() {
that.movingFlag = false;
if (next !== cur) {
that.o.afterChange({
prev: cur,
cur: next
});
for (var i = 0; i < that.pageEles.length; i++) {
var pageEle = that.pageEles[i];
if(i === next){
pageEle.classList.add("cur");
}else{
pageEle.classList.remove("cur");
}
}
}
}, that.o.duration);
};
Fullpage.prototype.movePrev = function(anim) {
this.moveTo(this.curIndex - 1, anim);
};
Fullpage.prototype.moveNext = function(anim) {
this.moveTo(this.curIndex + 1, anim);
};
Element.prototype.fullpage = function(option) {
return new Fullpage(this, option);
};
}(window));