当前位置: 首页 > news >正文

js实现touch移动触屏滑动事件

以下是四种touch事件
touchstart: //手指放到屏幕上时触发
touchmove: //手指在屏幕上滑动式触发
touchend: //手指离开屏幕时触发
touchcancel: //系统取消touch事件的时候触发,这个好像比较少用

每个触摸事件被触发后,会生成一个event对象,event对象里额外包括以下三个触摸列表

touches: //当前屏幕上所有手指的列表
targetTouches: //当前dom元素上手指的列表,尽量使用这个代替touches
changedTouches: //涉及当前事件的手指的列表,尽量使用这个代替touches
这些列表里的每次触摸由touch对象组成,touch对象里包含着触摸信息,主要属性如下:
clientX / clientY: //触摸点相对浏览器窗口的位置
pageX / pageY: //触摸点相对于页面的位置
screenX / screenY: //触摸点相对于屏幕的位置
identifier: //touch对象的ID
target: //当前的DOM元素

注意:

手指在滑动整个屏幕时,会影响浏览器的行为,比如滚动和缩放。所以在调用touch事件时,要注意禁止缩放和滚动。

1.禁止缩放
通过meta元标签来设置。

2.禁止滚动
preventDefault是阻止默认行为,touch事件的默认行为就是滚动。
event.preventDefault();

 

<!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%;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>

转载于:https://www.cnblogs.com/qiaorenjie/p/5290123.html

相关文章:

  • 7、JavaScript 知识总结
  • 正则学习笔记
  • 注解
  • 堆和栈的区别(转过无数次的文章)
  • 我的Python成长之路---第七天---Python基础(21)---2016年2月27日(晴)
  • 进度条2
  • [Unity] Unity3D研究院编辑器之独立Inspector属性
  • 递归案例:汉诺塔问题
  • 三大家族轻松管理CentOS 7网络属性配置
  • 顺序表
  • PSD解析工具实现(二)
  • 细谈asp.net如何处理应用程序-----c#菜鸟日记
  • 如何通过热修复,搞定开发中的那些 Bug?
  • redis 的setnx命令
  • HTML5实战与剖析之媒体元素(6、视频实例)
  • “大数据应用场景”之隔壁老王(连载四)
  • Github访问慢解决办法
  • js递归,无限分级树形折叠菜单
  • JS基础之数据类型、对象、原型、原型链、继承
  • Leetcode 27 Remove Element
  • LeetCode29.两数相除 JavaScript
  • Linux Process Manage
  • markdown编辑器简评
  • miaov-React 最佳入门
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • PAT A1050
  • PHP那些事儿
  • ReactNativeweexDeviceOne对比
  • Redis的resp协议
  • tab.js分享及浏览器兼容性问题汇总
  • Vim Clutch | 面向脚踏板编程……
  • 第十八天-企业应用架构模式-基本模式
  • - 概述 - 《设计模式(极简c++版)》
  • 简单基于spring的redis配置(单机和集群模式)
  • 聚类分析——Kmeans
  • 配置 PM2 实现代码自动发布
  • 深入浅出webpack学习(1)--核心概念
  • 我的业余项目总结
  • 我是如何设计 Upload 上传组件的
  • 一天一个设计模式之JS实现——适配器模式
  • 移动端解决方案学习记录
  • 自动记录MySQL慢查询快照脚本
  • Android开发者必备:推荐一款助力开发的开源APP
  • 如何在招聘中考核.NET架构师
  • ​​​​​​​​​​​​​​Γ函数
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​TypeScript都不会用,也敢说会前端?
  • #{}和${}的区别是什么 -- java面试
  • (007)XHTML文档之标题——h1~h6
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (三)c52学习之旅-点亮LED灯
  • (实战篇)如何缓存数据
  • (转)IOS中获取各种文件的目录路径的方法
  • .Net Core webapi RestFul 统一接口数据返回格式