移动端关于拖拽事件

探究一下移动端的拖拽!因为html5出来了一个drag么!然后就兴致勃勃的去试了试,结果发现drag在pc端使用好使,但是在移动端不好用,然后在网上查了一下,有关于各个浏览器对drag的支持状况,在此附上链接一枚(想具体了解可以看看):

http://caniuse.com/#search=Drag

没办法就就开始想别的办法,结果发现好多人用touch事件,所以便试了试,效果还算不错,自己写的就不上代码了,就把参考的一片文章附上供大家参考参考:

----------------------------------------精华就要分享嘛!

在开始描述touch事件之前,需要先描述一下多触式系统中特有的touch对象(android和iOS乃至nokia最新的meego系统都模拟了类 似的对象)。这个对象封装一次屏幕触摸,一般来自于手指。它在touch事件触发的时候产生,可以 通过touch event handler的event对象取到。

移动端触屏滑动的效果其实就是图片轮播,在PC的页面上很好实现,绑定click和mouseover等事件来完成。但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件。处理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>

另外大家注意一点:也可以用zepto.js框架,这个框架比较小,灵巧,扩展性也不错。今天就写到这,研究了半个晚上总算有点收获!希望大家也能从中学到不少东西!明天晚上如果有时间会给大家附上电商有关淘宝天猫突破限制的解决办法!不用任何模板,并且天猫和淘宝突破限制的办法不一样,而且天猫突破限制的办法要麻烦很多,在网上找了很多都没有进展,最后问了一个专业人士才解决这个问题。欢迎大家来看看,谢谢!

时间: 2024-10-09 20:52:36

移动端关于拖拽事件的相关文章

HTML5 02. 多媒体控件、拖拽事件、历史记录、web存储、应用程序缓存、地理定位、网络状态

多媒体 video:是行内块(text-align: center; 对行内块适用) <figure></figure>: 多媒体标签 : <figcaption></figcaption>: 多媒体标题 方法: load() 加载.play()播放.pause()暂停 属性: currentTime 视频播放的当前进度. duration:视频的总时间. paused:视频播放的状态 事件:   oncanplay:事件在用户可以开始播放视频/音频(aud

拖拽事件

<h1>拖拽事件</h1><ul>    <li>onmousedown:鼠标按下</li>    <li>onmousemove:鼠标移动</li>    <li>onmouseup:鼠标放开</li></ul>    <p>拖拽的时候如果有文字选中,会出现问题!: 当鼠标按下的时候,如果页面中有文字被选中,那么会触发浏览器的默认拖拽文字的效果</p>    &

Android Launcher拖拽事件详解【android4.0--Launcher系列二】

AndroidICS4.0版本的launcher拖 拽的流程,基本和2.3的相似.就是比2.3写的封装的接口多了一些,比如删除类的写法就多了个类.等等.4.0的改变有一些,但是不是特别大.这个月一 直在改动Launcher的缩略图的效果,4.0的缩略图的功能没有实现,还得从2.3的Launcher中摘出来.通过做这个缩略图对Launcher 的模块有一点点了解,拿来分享一下Launcher拖拽的工作流程.有图有真相!   (1) 先来看看类之间的继承关系      图(1)  (2)再来看看La

JS Event 鼠标拖拽事件

<!DOCTYPE html><html> <head>        <meta charset="UTF-8">        <title>JS Event鼠标拖拽事件</title>                <style>            #box{width:200px;height:200px;background:#000;position:absolute;}       

Duilib嵌入CEF禁止浏览器响应拖拽事件

在开发中有一个需求,拖拽外部文件到客户端,然后客户端响应WM_DROPFILES消息,在拖拽消息里处理一下业务,最后把处理结果显示到客户区html中,但实际中发现当拖拽文件到客户区,浏览器首先处理了拖拽事件,外层的Win32窗口无法捕捉到拖拽消息,因此要想实现此操作,刚开始我想了一个本办法,在客户区最外层罩了一个透明的Win32原生窗口,这样拖拽文件时,在最外层透明窗口的WM_DROPFILES消息中处理具体业务,最后用C++调用js函数,在页面显示处理结果. 方法一: 透明窗口 Layered

原生js实现 拖拽事件

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> .box { width: 200px; height: 200px; background-color: #000000; position: absolute; left: 0; top: 0;

h5学习--七个h5拖拽事件

<script> // 七个h5拖拽事件 const box = document.getElementById('box') const left = document.getElementById('left') const right = document.getElementById('right') let num = 0 //ondragstart 拖拽开始的时候,进行移动 right.ondragstart= function(){ console.log("lll&q

移动端可拖拽效果

<!doctype html>移动端可拖拽效果 拖拽效果测试,PC浏览器访问,需打开控制台进入移动模式. 拖我 原文地址:https://www.cnblogs.com/webfby/p/11105370.html

H5拖拽事件-- 自定义创建a标签热区

有两个BUG未更正, 1.拖拽后,动态创建的div始终在鼠标的下方,导致拖拽定位不准确 2.当窗口为自适应时,定位left为百分比,窗口改变大小时会存在定位偏差 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="./jquery-1