zoukankan      html  css  js  c++  java
  • javascript实现手机触摸屏左右(上下)滚动(javascript感知滑屏方向)

    现支持iOS、Android和电脑

    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="target-densitydpi=medium-dpi, width=device-width, height=device-height, initial-scale=1" />
    <title></title>
    <style type="text/css">
    *{ margin:0; padding:0;}
    body{border:1px solid #066}
    .swap_h{ 1000px; height:77px}
    .swap_h div{108px; height:75px; word-wrap:break-word; word-break:break-all; float:left; border:1px solid #096;  overflow:scroll}
    </style>
    </head>
    <body leftmargin="4" rightmargin="4" onswipe="g('dbg1').innerHTML='swipe b'" onswipeleft="g('dbg2').innerHTML='left b'" onswiperight="g('dbg2').innerHTML='right b'">
    swipe swipeleft swiperight
    <div id="div1" style="300px; overflow:hidden; height:77px; margin:0 auto">
    	<div style="word-break:break-all" class="swap_h" id="swap_1">
            <div id="swap_11"> -1<?php echo date('H:i:s'); ?></div>
            <div id="swap_12"> -2</div>
            <div> -3</div>
            <div> -4</div>
            <div> -5</div>
            <div> -6</div>
            <div> -7</div>
            <div> -8</div>
            <div> -9</div>
            <div> -0</div>
            <div> -a</div>
            <div> -b</div>
        </div>
    </div>
    <div id="dbg">dbg</div>
       
    <script language="javascript">
    function l(s){
    	g('dbg').innerHTML = s;
    }
    function printEvent(evt)
    {
    	try
    	{
    		var tmp = '';
    		for(var i in evt)
    		{
    			tmp += i+':'
    			var v = evt[i]+'';
    			if(v=='[object HTMLDivElement]')
    			{
    				tmp+=' <b>div</b> - '+evt[i].id+'<br/>';
    			}
    			else if(''+(evt[i])=='[object TouchList]')
    			{
    				tmp+=' <br/>    <b>touchlist</b>:<div style="border:1px solid red; margin:1px"> ';
    				for(var x in evt[i])
    				{
    					if(''+(evt[i][x])=='[object Touch]')
    					{
    						tmp+='<br>    ----'+x+':'+' <b>Touch</b><br/><div style="border:1px solid blue;margin:1px">';
    						for(var y in evt[i][x])
    						{
    							if(evt[i][x][y]=='[object HTMLDivElement]')
    							{
    								tmp+='    ----'+y+':<b>div</b> - '+evt[i][x][y].id+'<br/>';
    							}else tmp+='<br>    ----'+y+':'+evt[i][x][y]+'<br/>';
    						}
    						tmp+='</div>';
    					}else
    						tmp+='<br>     '+x+':'+evt[i][x]+'<br/>';
    				}
    				tmp+='</div>';
    			}else if(typeof(evt[i])=='number'){				
    				tmp+='<font color="green">'+v+'</font><br/>';
    			}			
    			else tmp+=''+v+'<br/>';
    		}
    		return tmp;
    	}catch(e){
    		alert(e)
    	}
    }
    function getxy(e){
    	var a=new Array()
    	var t=e.offsetTop;
    	var l=e.offsetLeft;
    	var w=e.offsetWidth;
    	var h=e.offsetHeight;
    	while(e=e.offsetParent){
    		t+=e.offsetTop;
    		l+=e.offsetLeft;
    	}
    	a[0]=w;a[1]=h;
    	a[2]=l;a[3]=t;
    	return a;
    }
    function touch(obj,func)
    {
    	try{
    		if(arguments.length>2)
    			this.leftRightOnly = arguments[2];
    		else
    			this.leftRightOnly = false;
    		
    		if(arguments.length>4){//4,5个参数设置后会帮你设定子元素的宽度,帮助滚动效果
    			var fchild = g(arguments[3]);
    			if(fchild){
    				var fchildCTagName = arguments[4];
    				var childs = fchild.getElementsByTagName(fchildCTagName);
    				var w = 0;
    				
    				for(var i=0;i<childs.length;i++){
    					var xy = getxy(childs[i]);
    					w += xy[0];
    				}
    				fchild.style.width = w+"px";
    			}
    		}
    		
    		this.swipe_function[obj.id] = func;
    		this.id = obj.id;
    		if(!this.id){
    			alert("第一个参数必须有一个id");
    			return;
    		}
    		this.isPc = navigator.userAgent.indexOf('Windows')!=-1||navigator.platform.indexOf('Mac')!=-1;
    		this.startFlag = false;
    		obj.data = this;
    		
    		if(this.isPc){
    			this.bind(obj,'mousedown',function(e){this.data.touchstart(e);});
    			this.bind(obj,'mouseup',function(e){this.data.touchend(e);});
    			this.bind(obj,'mouseout',function(e){this.data.touchend(e);});
    			this.bind(obj,'mousemove',function(e){this.data.touchmove(e);});
    		}else{
    			this.bind(obj,'touchstart',function(e){this.data.touchstart(e);});
    			this.bind(obj,'touchend',function(e){this.data.touchend(e);});
    			this.bind(obj,'touchmove',function(e){this.data.touchmove(e);});
    		}
    	}catch(e){
    		alert("touch: "+e);
    	}
    }
    touch.prototype.tch_start = {};
    touch.prototype.tch_mv = {};
    touch.prototype.swipe_function = {};
    touch.prototype.bind = function(obj,evt,fun)
    {
    	if(typeof obj.attachEvent != 'undefined')
    	{
    		obj.attachEvent('on'+evt,fun);
    	}else{
    		obj.addEventListener(evt,fun,true);
    	}
    }
    touch.prototype.touchstart=function(evt)
    {
    	try{
    		if(this.isPc)
    			var tch = evt;
    		else
    			var tch = evt['touches'][0];
    			
    		if(this.isPc)
    			var id = this.id;
    		else
    			var id  = tch.target.id
    		this.tch_start[id] = [tch.clientX,tch.clientY,tch.clientX];
    		l("this.tch_start[id]="+this.tch_start[id]+",id="+id)
    		this.startFlag = true;
    		evt.preventDefault();
    	}catch(e){
    		alert('this.tch_start='+this.tch_start+'<br />'+e);
    	}
    }
    touch.prototype.touchend=function (evt)
    {
    	try{
    		if(!this.startFlag) return;
    		if(!this.isPc && (typeof(evt.changedTouches)=='undefined'||evt.changedTouches.length<1)) return;
    
    		if(this.isPc)
    			var id  = this.id;
    		else
    			var id = evt.changedTouches[0].target.id;
    		
    		var pid = evt.currentTarget.id;
    		var now = this.tch_mv[id];		
    		var start = this.tch_start[id];
    		
    		l('end= '+start+","+now+",id="+id)
    
    		var xdiff = now[0]-start[0];
    		var ydiff = now[1]-start[1];
    		
    		var f = this.swipe_function[pid];
    		evt.preventDefault();
    		this.startFlag = false;
    		if(Math.abs(xdiff)>Math.abs(ydiff))
    		{
    			if(xdiff<0)
    			{
    				this.swipe(pid,'left',xdiff,f);
    				return;
    			}		
    			if(xdiff>0)
    			{
    				this.swipe(pid,'right',xdiff,f);
    				return;
    			}
    		}else{
    			if(ydiff<0)
    			{
    				this.swipe(pid,'up',ydiff,f);
    				return;
    			}			
    			if(ydiff>0)
    			{
    				this.swipe(pid,'down',ydiff,f);
    				return;
    			}
    		}
    	}catch(e){
    		alert('touchend error='+e)
    	}
    }
    touch.prototype.touchmove=function(evt)
    {
    	try{
    		if(!this.startFlag) return;
    		if(this.isPc){
    			var id = this.id;
    			var tch = evt;
    		}else{
    			var tch = evt['touches'][0];
    			var id  = tch.target.id; 
    		}
    		var now = [tch.clientX,tch.clientY];
    		this.tch_mv[id] = now;
    		
    		if(this.leftRightOnly)
    		{
    			var start = this.tch_start[id];
    			l('move='+start+","+now+",id="+id)
    			var xdiff = start[2] - now[0];
    			var obj   = g(this.id);
    			obj.scrollLeft += xdiff;			
    			start[2] = now[0];
    		}
    		evt.preventDefault();
    	}catch(e){
    		console.log('touchmove error='+e);
    		//l(printEvent(evt));
    	}
    }
    touch.prototype.swipe = function(pid,dir,xydiff,func)
    {
    	if(typeof(swiping)=='undefined') swiping = false;
    	if(swiping) return;
    	swiping = true;
    	try{
    		var obj = g(pid);
    		var moveDis = obj.style.width?parseInt(obj.style.width,10):300;
    		if(this.leftRightOnly)
    		{
    			var cur_scrollleft = obj.scrollLeft;
    			var moved = cur_scrollleft%moveDis;
    			if(dir=='right')
    				moveDis = moved;
    			else if(dir=='left')
    				moveDis -= moved;
    			else{
    				if(moved>moveDis/2)
    				{
    					var factor = 1;
    					moveDis = moveDis - moved;
    				}else{
    					var factor = -1;
    					moveDis = moved;
    				}
    			}
    			//g('dbg').innerHTML  = 'dir='+dir+',cur_scrollleft='+cur_scrollleft+',moveDis='+moveDis+'<br/>'+g('dbg').innerHTML;
    		}
    		if(dir=='left')
    			func(pid,moveDis,1);
    		else if(dir=='right')
    			func(pid,moveDis,-1);	
    		else{
    			swiping = false;
    			xydiff = Math.abs(xydiff)*2;
    			if(dir=='up')
    				var scrollMoveValue = xydiff;
    			else
    				var scrollMoveValue = xydiff*-1;
    			
    			document.body.scrollTop = document.body.scrollTop+scrollMoveValue;
    			if(this.leftRightOnly)
    			{
    				func(pid,moveDis,factor);
    			}
    		}		
    	}catch(e){
    		alert(e)
    	}
    }
    
    function g(id)
    {
    	return document.getElementById(id);
    }
    var swiping = false;
    var step = 16;
    function slowmv(pid,v,v1)
    {
    	try{
    		var moved = arguments.length==4?arguments[3]:0;
    		if(moved+step>v)
    			var _step = v-moved;
    		else
    			var _step = step;
    	
    		moved+=_step;
    		var obj = g(pid);
    		var display_width = obj.style.width?parseInt(obj.style.width,10):0;
    		
    		var new_left = obj.scrollLeft+_step*v1;
    		if((v1>0&&new_left+display_width>=obj.scrollWidth)||(v1<0&&new_left<=0)) new_left = new_left<=0?0:(obj.scrollWidth-display_width);
    		obj.scrollLeft = new_left;
    		
    		if(moved<v)
    		{
    			if(new_left>=obj.scrollWidth-display_width||new_left<=0){
    				swiping = false;
    				return;
    			}
    			setTimeout(function(){slowmv(pid,v,v1,moved);},25);
    		}else swiping = false;
    	}catch(e){
    		alert('slowmv error='+e+',pid='+pid+',v='+v+',v1='+v1);
    	}
    }
    //div1是最外的框,决定了可以看到的范围;swap_1是里面很宽的内容,每次滑动显示一部分它的内容;最后一个参数是swap_1里面子元素的标签名,如果swap_1里面是图片,就传img
    var t = new touch(g('div1'),slowmv,true,'swap_1', 'div');
    
    </script>
    </body>
    </html>

    我的QQ群:

    PHPer&Webgame&移动开发,群号:95303036


     

  • 相关阅读:
    【筛法求素数】Codeforces Round #426 (Div. 1) A. The Meaningless Game
    【构造】AtCoder Regular Contest 079 F
    【贪心】AtCoder Regular Contest 079 E
    【构造】AtCoder Regular Contest 079 D
    【树形dp】hdu6035 Colorful Tree
    【计算几何】【bitset】Gym
    【枚举】【高斯消元】Gym
    【矩阵乘法】Gym
    【枚举约数】Gym
    【置换群】【枚举约数】hdu6038 Function
  • 原文地址:https://www.cnblogs.com/lein317/p/5067626.html
Copyright © 2011-2022 走看看