bester-ace

移动端左右滑动事件简单使用

 

移动端屏幕滑动监听

首先是一个左右滑动js的demo

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>html5测试</title>
</head>
<body>
    <div id="box" >
        
    </div>
    <script src="/static/js/jquery.js"></script>
    <script>
       //定义变量,用于记录坐标和角度
    var startx,starty,movex,movey,endx,endy,nx,ny,angle;
    
    //开始触摸函数,event为触摸对象
    function touchs(event){
    
            //阻止浏览器默认滚动事件
        event.preventDefault();
        
        //获取DOM标签
        var box = document.getElementById(\'box\');
        
        //通过if语句判断event.type执行了哪个触摸事件
        if(event.type=="touchstart"){
        
             console.log(\'开始\');
             
             //获取开始的位置数组的第一个触摸位置
            var touch = event.touches[0];
            
             //获取第一个坐标的X轴
            startx = Math.floor(touch.pageX);
            
            //获取第一个坐标的X轴
            starty = Math.floor(touch.pageY);
            
            //触摸中的坐标获取
        }else if(event.type=="touchmove"){
        
             console.log(\'滑动中\');
            var touch = event.touches[0];
            movex = Math.floor(touch.pageX);
            movey = Math.floor(touch.pageY);
            
            //当手指离开屏幕或系统取消触摸事件的时候
        }else if(event.type == "touchend" || event.type == "touchcancel"){
        
                //获取最后的坐标位置
            endx = Math.floor(event.changedTouches[0].pageX);
            endy = Math.floor(event.changedTouches[0].pageY);
             console.log(\'结束\');
             
             //获取开始位置和离开位置的距离
            nx = endx-startx;
            ny = endy-starty;
            
            //通过坐标计算角度公式 Math.atan2(y,x)*180/Math.PI
            angle = Math.atan2(ny, nx) * 180 / Math.PI;
            
            if(Math.abs(nx)<=1 ||Math.abs(ny)<=1){
                return false;
                console.log(\'滑动距离太小\');
            }
            
            //通过滑动的角度判断触摸的方向
            if(angle<45 && angle>=-45){
                alert(\'右滑动\');
                return false;
            }else if(angle<135 && angle>=45){
                alert(\'下滑动\');
                return false;
            }else if((angle<=180 && angle>=135) || (angle>=-180 && angle<-135 )){
                alert(\'左滑动\');
                return false;
            }else if(angle<=-45 && angle >=-135){
                alert(\'上滑动\');
                return false;
            }
        }
    }
    
    //添加触摸事件的监听,并直行自定义触摸函数
    box.addEventListener(\'touchstart\',touchs,false);
    box.addEventListener(\'touchmove\',touchs,false);
    box.addEventListener(\'touchend\',touchs,false);
    </script>
</body>
</html>

然后是一个实际使用的jq的demo

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>html5测试</title>
</head>
<body>
    <div id="box" >
        
    </div>
    <script src="/static/js/jquery.js"></script>
    <script>
      //定义变量,用于记录坐标和角度
		var startx,starty,movex,movey,endx,endy,nx,ny,angle;
    
		//开始触摸函数,event为触摸对象
		function touchs(event){
		
				//阻止浏览器默认滚动事件
			event.preventDefault();
			event.stopPropagation();
			//获取DOM标签
			
			
			//通过if语句判断event.type执行了哪个触摸事件
			if(event.type=="touchstart"){
			
				//  console.log(\'开始\');
				 
				 //获取开始的位置数组的第一个触摸位置
				var touch = event.originalEvent.targetTouches[0];
				
				 //获取第一个坐标的X轴
				startx = Math.floor(touch.pageX);
				
				//获取第一个坐标的X轴
				starty = Math.floor(touch.pageY);
				return false;
				//触摸中的坐标获取
			}else if(event.type=="touchmove"){
			
				//  console.log(\'滑动中\');
				var touch = event.originalEvent.targetTouches[0];
				movex = Math.floor(touch.pageX);
				movey = Math.floor(touch.pageY);
				
				return false;
				//当手指离开屏幕或系统取消触摸事件的时候
			}else if(event.type == "touchend" || event.type == "touchcancel"){
			
					//获取最后的坐标位置
				endx = Math.floor(event.originalEvent.changedTouches[0].pageX);
				endy = Math.floor(event.originalEvent.changedTouches[0].pageY);
				 console.log(\'结束\');
				 
				 //获取开始位置和离开位置的距离
				nx = endx-startx;
				ny = endy-starty;
				
				//通过坐标计算角度公式 Math.atan2(y,x)*180/Math.PI
				angle = Math.atan2(ny, nx) * 180 / Math.PI;
				
				if(Math.abs(nx)<=1 ||Math.abs(ny)<=1){
					return false;
					console.log(\'滑动距离太小\');
				}
				
				
				 //通过滑动的角度判断触摸的方向
            if(angle<45 && angle>=-45){
                alert(\'右滑动\');
                return false;
            }else if(angle<135 && angle>=45){
                alert(\'下滑动\');
                return false;
            }else if((angle<=180 && angle>=135) || (angle>=-180 && angle<-135 )){
                alert(\'左滑动\');
                return false;
            }else if(angle<=-45 && angle >=-135){
                alert(\'上滑动\');
                return false;
            }
			}

			return false;
		}
		function addMoveItem(){
			
			//添加触摸事件的监听,并直行自定义触摸函数
			var calendarid = $("#box");
			calendarid.off("touchstart").on(\'touchstart\',touchs);
			calendarid.off("touchmove").on(\'touchmove\',touchs);
			calendarid.off("touchend").on(\'touchend\',touchs);
		}

		addMoveItem();
    </script>
</body>
</html>

ps:移动端父级touch时间可能会覆盖掉自己的touch事件,子级使用touchend可以一定程度避免重复调用事件;

挖个小坑,谷歌浏览器去掉event.preventDefault();event.stopPropagation();

 

https://blog.csdn.net/pengkai0113/article/details/86743559

发表于 2019-08-04 21:44  bester6  阅读(988)  评论(0编辑  收藏  举报
 

分类:

技术点:

相关文章:

  • 2021-12-23
  • 2021-12-23
  • 2021-11-17
  • 2021-11-09
  • 2021-10-16
  • 2022-01-02
  • 2021-12-23
  • 2021-11-14
猜你喜欢
  • 2021-10-31
  • 2021-08-15
  • 2021-12-23
  • 2021-12-23
  • 2021-06-29
  • 2021-12-23
  • 2021-06-27
相关资源
相似解决方案