<!doctype html>
<html lang="en">
<head>
<meta name="viewport" content="width=device-width,user-scalable=no" />
<meta charset="utf-8">
<script type="text/javascript">
(function(){
	setsize();
	window.onresize = setsize;
	function setsize(){
		var html = document.documentelement;
		var htmlw = html.clientwidth;
		html.style.fontsize = htmlw / 16 + px;
	}
})();	
</script>
<title>document</title>
<style type="text/css">
body {
	margin: 0;
	background: #ccc;
}	
ul {
	margin: 0;
	padding: 0;
	list-style: none;
}
.navwrap {
	position: relative;
	border-bottom: 1px solid #000;
	background: #f1f1f1;
	height: 2.4rem;
	overflow: hidden;
}
#navs {
	position: absolute;
	left: 0;
	top: 0;
	white-space: nowrap;
}
#navs li {
	display: inline-block;
	font: .8rem/2.4rem 宋体;
	padding: 0 1rem;
}
#navs li:nth-of-type(1) {
	background: #fff;
}
#navs li:nth-last-of-type(1) {
	background: #fff;
}
#navs a {
	text-decoration: none;
	color: #000;
}
</style>
<script type="text/javascript" src="js/startmove.js?1.1.11"></script>
</head>
<body>
<nav class="navwrap">
	<ul id="navs">
  	    <li class="active"><a href="javascript:;" target="_blank">首页</a></li><li><a href="javascript:;" target="_blank">mv</a></li><li><a href="javascript:;" target="_blank">悦单</a></li><li><a href="javascript:;" target="_blank">v榜</a></li><li><a href="javascript:;" target="_blank">音乐</a></li><li><a href="javascript:;" target="_blank">商城</a></li><li><a href="javascript:;" target="_blank">节目</a></li><li><a href="javascript:;" target="_blank">饭团</a></li><li><a href="javascript:;" target="_blank">咨询</a></li><li><a href="javascript:;" target="_blank">商城</a></li><li><a href="javascript:;" target="_blank">节目</a></li><li><a href="javascript:;" target="_blank">饭团</a></li><li><a href="javascript:;" target="_blank">咨询</a></li><li><a href="javascript:;" target="_blank">我的家</a></li><li><a href="javascript:;" target="_blank">app下载</a></li><li><a href="javascript:;" target="_blank">热门应用</a></li>
    </ul>
</nav>
<script type="text/javascript">
document.addeventlistener('touchstart', function(e) {
	e.preventdefault();
});
(function(){
	var navwrap = document.queryselector('.navwrap');
	var navs = document.queryselector('#navs');
	var start,startel,lasttime,lastdis,lastspeed;
	var min = 0;
	var max = 0;
	var tc = .25;//拉力系数
	/*
		lasttime 上一次时间
		lastdis 上一次位置
		lastspeed 上一次速度
	*/
	navwrap.addeventlistener('touchstart', function(e) {
		var touch = e.changedtouches[0];
		start = touch.pagex;
		startel = css(navs,left);
		lasttime = date.now();
		lastdis = touch.pagex;
		min = navwrap.clientwidth - navs.offsetwidth;
	});
	navwrap.addeventlistener('touchmove', function(e) {
		var touch = e.changedtouches[0];
		var now = touch.pagex;
		var x = now - start + startel;
		var nowtime = date.now();
		if(x > max){
			x *=  tc;
		} else if(x < min) {
			// 位移的幅度为什么没有减小?
			x = (x - min)*tc + min;
		}
		css(navs,"left",x);
		lastspeed = (touch.pagex - lastdis)/(nowtime - lasttime);
		//得到上一次和这一次的滑动速度
		lastdis = touch.pagex;
		lasttime = nowtime;
	});
	navwrap.addeventlistener('touchend', function(e) {
		//console.log(lastspeed);//最后一次滑动的速度
		/* 速越快,缓冲的距离越大 */
		if(date.now() - lasttime > 100){
			//如果最后一次的move时间和我抬起的时候,相差比较大,说明我在抬起之前,有一定时间没有移动过,那松手之后,也应该保持不动
			lastspeed = 0;
		}
		lastspeed = math.abs(lastspeed) < .1?0:lastspeed;
		var translate = lastspeed * 200;//这是要缓冲出去距离
		translate = math.abs(translate) > 1000?1000*(translate/math.abs(translate)):translate;
		var target = translate + css(navs,left);
		var type = easeoutstrong;
		if(target > max){
			target = 0;
			type = backout;
		} else if(target < min){
			target = min;
			type = "backout";
		}
		var time = math.abs((target -css(navs,"left")) * 1.3);
		time = (time>0&&time<200)?200:time;
		console.log(time);
		startmove({
			el:navs,
			target: {
				left: target
			},
			time: time,
			type: type
		});
	});
})();	
</script>
</body>
</html>
//动画形式公式
var tween = {
	linear: function (t, b, c, d){
		return c*t/d + b;
	},
	easein: function(t, b, c, d){
		return c*(t/=d)*t + b;
	},
	easeout: function(t, b, c, d){
		return -c *(t/=d)*(t-2) + b;
	},
	easeboth: function(t, b, c, d){
		if ((t/=d/2) < 1) {
			return c/2*t*t + b;
		}
		return -c/2 * ((--t)*(t-2) - 1) + b;
	},
	easeinstrong: function(t, b, c, d){
		return c*(t/=d)*t*t*t + b;
	},
	easeoutstrong: function(t, b, c, d){
		return -c * ((t=t/d-1)*t*t*t - 1) + b;
	},
	easebothstrong: function(t, b, c, d){
		if ((t/=d/2) < 1) {
			return c/2*t*t*t*t + b;
		}
		return -c/2 * ((t-=2)*t*t*t - 2) + b;
	},
	elasticin: function(t, b, c, d, a, p){
		if (t === 0) { 
			return b; 
		}
		if ( (t /= d) == 1 ) {
			return b+c; 
		}
		if (!p) {
			p=d*0.3; 
		}
		if (!a || a < math.abs(c)) {
			a = c; 
			var s = p/4;
		} else {
			var s = p/(2*math.pi) * math.asin (c/a);
		}
		return -(a*math.pow(2,10*(t-=1)) * math.sin( (t*d-s)*(2*math.pi)/p )) + b;
	},
	elasticout: function(t, b, c, d, a, p){
		if (t === 0) {
			return b;
		}
		if ( (t /= d) == 1 ) {
			return b+c;
		}
		if (!p) {
			p=d*0.3;
		}
		if (!a || a < math.abs(c)) {
			a = c;
			var s = p / 4;
		} else {
			var s = p/(2*math.pi) * math.asin (c/a);
		}
		return a*math.pow(2,-10*t) * math.sin( (t*d-s)*(2*math.pi)/p ) + c + b;
	},  
	elasticboth: function(t, b, c, d, a, p){
		if (t === 0) {
			return b;
		}
		if ( (t /= d/2) == 2 ) {
			return b+c;
		}
		if (!p) {
			p = d*(0.3*1.5);
		}
		if ( !a || a < math.abs(c) ) {
			a = c; 
			var s = p/4;
		}
		else {
			var s = p/(2*math.pi) * math.asin (c/a);
		}
		if (t < 1) {
			return - 0.5*(a*math.pow(2,10*(t-=1)) * 
					math.sin( (t*d-s)*(2*math.pi)/p )) + b;
		}
		return a*math.pow(2,-10*(t-=1)) * 
				math.sin( (t*d-s)*(2*math.pi)/p )*0.5 + c + b;
	},
	backin: function(t, b, c, d, s){
		if (typeof s == 'undefined') {
		   s = 1.70158;
		}
		return c*(t/=d)*t*((s+1)*t - s) + b;
	},
	backout: function(t, b, c, d, s){
		if (typeof s == 'undefined') {
			s = 2.70158;  //回缩的距离
		}
		return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
	}, 
	backboth: function(t, b, c, d, s){
		if (typeof s == 'undefined') {
			s = 1.70158; 
		}
		if ((t /= d/2 ) < 1) {
			return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
		}
		return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
	},
	bouncein: function(t, b, c, d){
		return c - tween['bounceout'](d-t, 0, c, d) + b;
	},      
	bounceout: function(t, b, c, d){
		if ((t/=d) < (1/2.75)) {
			return c*(7.5625*t*t) + b;
		} else if (t < (2/2.75)) {
			return c*(7.5625*(t-=(1.5/2.75))*t + 0.75) + b;
		} else if (t < (2.5/2.75)) {
			return c*(7.5625*(t-=(2.25/2.75))*t + 0.9375) + b;
		}
		return c*(7.5625*(t-=(2.625/2.75))*t + 0.984375) + b;
	},  
	bounceboth: function(t, b, c, d){
		if (t < d/2) {
			return tween['bouncein'](t*2, 0, c, d) * 0.5 + b;
		}
		return tween['bounceout'](t*2-d, 0, c, d) * 0.5 + c*0.5 + b;
	}
}
// 获取或者设置样式
function css(el,attr,val){
	if(arguments.length == 2){
		if(el.currentstyle){
			val = el.currentstyle[attr];
		} else {
			val = getcomputedstyle(el)[attr];
		}
		return parsefloat(val);
	} else {
		if(attr == "opacity"){
			el.style.opacity = val;
			el.style.filter = "alpha(opacity= "+val*100+")";
		} else if(attr == "zindex"){
			el.style[attr] = math.round(val);
		}else {
			el.style[attr] = val + "px";
		}
	}
}
//执行动画
function startmove(init){
	clearinterval(init.el.timer);
	var t = 0; 
	var b = {};
	var c = {};
	var d = init.time/20;
	for( var s in init.target){ 
		b[s] = css(init.el,s);
		c[s] = init.target[s] - b[s];
	} 
	init.el.timer = setinterval(function(){
		t++;
		if(t > d){
			clearinterval(init.el.timer);
			init.callback&&init.callback();
		} else {
			for(var s in init.target){
				var val = tween[init.type](t,b[s],c[s],d);
				css(init.el,s,val);
			}
		}
	},20);
}
以上就是移动端横向滑屏和“橡皮筋”特效实例代码的详细内容。
   
 
   