html移动端可拖拽,移动端拖拽全兼容框架

今天花了点时间,写了一份在移动设备上使用的拖拽功能,次拖拽和PC端的拖拽有几个不同的地方需要提一下:

1.所有事件都需要绑定

2.使用移动端的事件来组成拖拽的步骤,touchstart, touchmove,touchend

3.关于元素坐标获取不适用之前的clientX(clientY),采用新的targetTouches[0].pageX(targetTouches[0].pageY)

4.拖拽之后需要执行事件解绑removeEventListener

记住这四点简单的拖拽就是实现了,废话不多说,请看源码:/*

*Author:LiangJingxian

*useage:

*dragM(选择器)

*eg: dragM('#box');

*dragM(选择器,json)

* eg: drarM('#box',{

* 'y','false',//不允许在y轴上拖拽

*                   'limit','false',  //是否限制最小边框

*'moveTop',function(){

* //向上拖的时候触发函数(moveLeft,moveRight,moveBottom)

*  }

*'end',function(){

*//拖拽完成之后触发的函数

*  }

* })

*/

function dragM(obj,json){

var oDiv = document.querySelector(obj);

json = json || {};

json.obj = oDiv;

json.x = json.x || "true" ;

json.y = json.y || "true";

json.limit = json.limit || "true";

json.Tx = json.Tx || 0;

json.Ty = json.Ty || 0;

oDiv.addEventListener("touchstart",function(ev){

var disX = ev.targetTouches[0].pageX-json.Tx;

var disY = ev.targetTouches[0].pageY-json.Ty;

function fnMove(ev){

if(json.x=="true"){

json.Tx = ev.targetTouches[0].pageX-disX;

if(json.limit =="true"){

if(json.Tx

json.Tx = -(oDiv.offsetLeft);

}

if(json.Tx>(document.documentElement.clientWidth-oDiv.offsetLeft-oDiv.offsetWidth)){

json.Tx = document.documentElement.clientWidth-oDiv.offsetLeft-oDiv.offsetWidth;

}

}

if(json.Tx

json.moveLeft&&json.moveLeft();

}else if(json.Tx>10){

json.moveRight&&json.moveRight();

}

}else{

json.Tx = 0;

}

if(json.y=="true"){

json.Ty = ev.targetTouches[0].pageY-disY;

if(json.limit =="true"){

if(json.Ty

json.Ty=-(oDiv.offsetTop);

};

if(json.Ty>(document.documentElement.clientHeight-oDiv.offsetTop-oDiv.offsetHeight)){

json.Ty = document.documentElement.clientHeight-oDiv.offsetTop-oDiv.offsetHeight;

}

}

if(json.Ty

json.moveTop&&json.moveTop();

}else if(json.Ty>10){

json.moveBottom&&json.moveBottom();

}

}else{

json.Ty = 0;

}

json.move&&json.move();

oDiv.style.WebkitTransform = "translate("+json.Tx+"px,"+json.Ty+"px)";

}

document.addEventListener("touchmove",fnMove,false);

function fnEnd(ev){

json.end&&json.end();

document.removeEventListener("touchmove",fnMove,false);

document.removeEventListener("touchend",fnMove,false);

}

document.addEventListener("touchend",fnEnd,false);

ev.preventDefault();

return false;

},false);

}

用法:见注释,因为在做移动端的时候用zepto,当在$(function(){})中执行DOMContentLoaded时候会有问题,所以没有写。

ps:补充说明

DOMContentLoaded这个事件是从HTML中的onLoad的延伸而来的,当一个页面完成加载时,初始化脚本的方法是使用load事件,

但这个类函数的缺点是仅在所有资源都完全加载后才被触发,这有时会导致比较严重的延迟,开发人员随后创建了一种自定义事件,domready,它在DOM加载之后及资源加载之前被触发。

domready事件迅速被众多JavaScript库所采用,它开始在本地浏览器中以DOMContentLoaded的形式被使用;此外,它目前已在HTML5中被标准化,下面的代码显示了DOMContentLoaded是如何在document对象中被触发的;

document.addeventListener('DOMContentLoaded',function(){...},false);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值