Detailed explanation of Javascript mobile touch screen sliding events

The touch screen sliding event on the mobile terminal is actually a touch event, which is mainly divided into the following four types:

  • touchstart: //Triggered when your finger is placed on the screen
  • touchmove: //Trigger by sliding your finger on the screen
  • touchend: //Triggered when the finger leaves the screen
  • touchcancel: //Triggered when the system cancels the touch event. This seems to be less used.

After each touch event is triggered, an event object will be generated. The event object additionally includes the following three touch lists.

touches: //List of all fingers on the current screen

targetTouches: //List of fingers on the current dom element, try to use this instead of touches

changedTouches: //List of fingers involved in the current event, try to use this instead of touches

Each touch in these lists consists of a touch object, which contains touch information. The main properties are as follows:

clientX / clientY: //The position of the touch point relative to the browser window

pageX / pageY: //The position of the touch point relative to the page

screenX / screenY: //The position of the touch point relative to the screen

identifier: //ID of the touch object

target: //Current DOM element

Notice:

As your finger slides across the screen, it affects browser behavior such as scrolling and zooming. Therefore, when calling the touch event, be careful to prohibit zooming and scrolling.

1. Disable zooming

Set via meta tag.

<meta name=”viewport” content=”target-densitydpi=320,width=640,user-scalable=no”>

2. Disable scrolling

preventDefault prevents the default behavior, and the default behavior of touch events is scrolling.

event.preventDefault();

Case:

Below is a case where the effect can only be seen on a mobile device.

1. Define the event handling function of touchstart and bind the event:

if(!!self.touch) self.slider.addEventListener('touchstart',self.events,false);
//Define the event of touchstart Processing function
start:function(event){   var touch = event.targetTouches[0]; //The touches array object gets all the touches on the screen, taking the first touch   startPos = {x: touch.pageX,y:touch.pageY,time:+new Date}; //Get the coordinate value of the first touch   isScrolling = 0; //This parameter determines whether scrolling is vertical or horizontal Scroll this.slider.addEventListener('touchmove',this,false); this.slider.addEventListener('touchend& #39;,this,false); },





After the touchstart event is triggered, an event object will be generated. The event object includes a touch list, obtains the first touch on the screen, and records its pageX, pageY coordinates. Define a variable to mark the direction of scrolling. At this time, the touchmove and touchend events are bound.

2. Define the event of the finger moving on the screen and define the touchmove function.

Also first prevent the scrolling behavior of the page. After touchmove is triggered, an event object will be generated. Get the touches list in the event object, get the first touch, and note the coordinates of pageX and pageY, calculate the difference, and get the finger The offset of the slide, making the current DOM element slide.

3. Define the event when the finger is picked up from the screen and define the touchend function.

//滑动释放
end:function(event){
  var duration = +new Date - startPos.time; //滑动的持续时间
if(isScrolling === 0){ //当为水平滚动时
this.icon[this.index].className = '';
if(Number(duration) > 10){
 //判断是左移还是右移,当偏移量大于10时执行
if(endPos.x > 10){
if(this.index !== 0) this.index -= 1;
}else if(endPos.x < -10){
if(this.index !== this.icon.length-1) this.index += 1;
}
}
this.icon[this.index].className = 'curr';
this.slider.className = 'cnt f-anim';
this.slider.style.left = -this.index*600 + 'px';
}
 //解绑事件
this.slider.removeEventListener('touchmove',this,false);
this.slider.removeEventListener('touchend',this,false);
},

The function executed after the finger leaves the screen. Here we first determine how long the finger stays on the screen. If the time is too short, the function will not be executed. Then determine whether the finger slides left or right to perform different operations respectively. The last and most important point is to remove touchmove and touchend binding events.

Boujo Genka

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" Content="text/html; charset=utf-8;">
<title>移动端触摸滑动</title>
<meta name="author" content="rainna" />
<meta name="keywords" content="rainna's js lib" />
<meta name="description" content="移动端触摸滑动" />
<meta name="viewport" content="target-densitydpi=320,width=640,user-scalable=no">
<style>
*{margin:0;padding:0;}
li{list-style:none;}

.m-slider{width:600px;margin:50px 20px;overflow:hidden;}
.m-slider .cnt{position:relative;left:0;width:3000px;}
.m-slider .cnt li{float:left;width:600px;}
.m-slider .cnt img{display:block;width:100{46ef1d7cfbdffc0db57029f974d30095d18ea60dba1d7b2ffaf442b213727085};height:450px;}
.m-slider .cnt p{margin:20px 0;}
.m-slider .icons{text-align:center;color:#000;}
.m-slider .icons span{margin:0 5px;}
.m-slider .icons .curr{color:red;}
.f-anim{-webkit-transition:left .2s linear;}
</style>
</head>

<body>
<div class="m-slider">
<ul class="cnt" id="slider">
<li>
<img src="http://imglf1.ph.126.net/qKodH3sZoVbPalKFtHS9mw==/6608946691259322175.jpg">
<p>20140813镜面的世界,终究只是倒影。看得到你的身影,却触摸不到你的未来</p>
</li>
<li>
<img src="http://imglf1.ph.126.net/40-jqH_j6EoCWnZOixY2pA==/4798022453110310215.jpg">
<p>20140812锡林浩特前往东乌旗S101必经之处,一条极美的铁路。铁路下面是个小型的盐沼,淡淡的有了一丝天空之境的感觉。可惜在此玩了一个小时也没有看见一列火车经过,只好继续赶往东乌旗。</p>
</li>
<li>
<img src="http://imglf0.ph.126.net/Jnmi2y51zVdjKAYlibtpFw==/3068640196117481166.jpg">
<p>20140811水的颜色为什么那么蓝,我也纳闷,反正自然饱和度和对比度拉完就是这个颜色的</p>
</li>
<li>
<img src="http://imglf1.ph.126.net/79GPsjhwiIj8e-0nP5MsEQ==/6619295294699949331.jpg">
<p>海洋星球3重庆天气热得我想卧轨自杀</p>
</li>
<li>
<img src="http://imglf1.ph.126.net/40-jqH_j6EoCWnZOixY2pA==/4798022453110310215.jpg">
<p>以上这些作品分别来自两位设计师作为观者,您能否通过设计风格进行区分</p>
</li>
</ul>
<div class="icons" id="icons">
<span class="curr">1</span>
<span>2</span>
<span>3</span>
<span>4</span>
<span>5</span>
</div>
</div>

<script>
var slider = {
//判断设备是否支持touch事件
touch:('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch,
slider:document.getElementById('slider'),

//事件
events:{
index:0, //显示元素的索引
slider:this.slider, //this为slider对象
icons:document.getElementById('icons'),
icon:this.icons.getElementsByTagName('span'),
handleEvent:function(event){
var self = this; //this指events对象
if(event.type == 'touchstart'){
self.start(event);
}else if(event.type == 'touchmove'){
self.move(event);
}else if(event.type == 'touchend'){
self.end(event);
}
},
//滑动开始
start:function(event){
var touch = event.targetTouches[0]; //touches数组对象获得屏幕上所有的touch,取第一个touch
startPos = {x:touch.pageX,y:touch.pageY,time:+new Date}; //取第一个touch的坐标值
isScrolling = 0; //这个参数判断是垂直滚动还是水平滚动
this.slider.addEventListener('touchmove',this,false);
this.slider.addEventListener('touchend',this,false);
},
//移动
move:function(event){
//当屏幕有多个touch或者页面被缩放过,就不执行move操作
if(event.targetTouches.length > 1 || event.scale && event.scale !== 1) return;
var touch = event.targetTouches[0];
endPos = {x:touch.pageX - startPos.x,y:touch.pageY - startPos.y};
isScrolling = Math.abs(endPos.x) < Math.abs(endPos.y) ? 1:0; //isScrolling为1时,表示纵向滑动,0为横向滑动
if(isScrolling === 0){
event.preventDefault(); //阻止触摸事件的默认行为,即阻止滚屏
this.slider.className = 'cnt';
this.slider.style.left = -this.index*600 + endPos.x + 'px';
}
},
//滑动释放
end:function(event){
var duration = +new Date - startPos.time; //滑动的持续时间
if(isScrolling === 0){ //当为水平滚动时
this.icon[this.index].className = '';
if(Number(duration) > 10){
//判断是左移还是右移,当偏移量大于10时执行
if(endPos.x > 10){
if(this.index !== 0) this.index -= 1;
}else if(endPos.x < -10){
if(this.index !== this.icon.length-1) this.index += 1;
}
}
this.icon[this.index].className = 'curr';
this.slider.className = 'cnt f-anim';
this.slider.style.left = -this.index*600 + 'px';
}
//解绑事件
this.slider.removeEventListener('touchmove',this,false);
this.slider.removeEventListener('touchend',this,false);
}
},

//初始化
init:function(){
var self = this; //this指slider对象
if(!!self.touch) self.slider.addEventListener('touchstart',self.events,false); //addEventListener第二个参数可以传一个对象,会调用该对象的handleEvent属性
}
};

slider.init();
</script>
</body>
</html>

Guess you like

Origin blog.csdn.net/tianxianghuiwei/article/details/134346041