今天就跟大家聊聊有关JS移动端实现拖拽的方法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
移动端的项目经常会引入手势库来实现拖拽
不过如果只是一两个页面用到拖拽,再引入一个手势库就很不划算
最近的项目中就有这么一个需求:
因为就这一个地方需要拖拽,所以我就没有引入第三方库
移动端的拖拽有两种主流的实现方案:
1。将元素设置为固定定位,然后在拖拽的时候修改其定位,实现拖拽的效果;
2。中使用变换的平移翻译属性实现拖拽。
<强>方案一:固定定位固定强>
这种方案的核心就是给元素添加固定定位位置:固定;
但定位之后,元素会脱离文档流,会影响原有但布局
因此在开始拖拽(触发touchstart事件)的时候,需要将原本的元素一个拷贝一份(版本())
给新元素A2添加定位,同时给原本的元素一个设置能见度:隐藏;使之隐藏并占位
1.1创建遮罩
首先封装一个创建遮罩的方法,用于放置拷贝出来的元素,并防止误触
createModal (id) { 让模态=. getelementbyid (id) 如果(模态){//在没有遮罩的时候创建遮罩 模态=document.createElement (& # 39; div # 39;) 模态。id=id modal.style。cssText=':固定;左:0;上图:0;右:0;底部:0;z - index: 999; document.body.appendChild(模态) } },
1.2开始拖拽
在触发touchstart事件的时候,首先创建遮罩
并通过getBoundingClientRect()方法获取到元素一个的坐标,记录起点信息
为了记录起点信息,需要数据中创建一个对象源,用于记录点击的位置客户,和初始定位坐标开始
handleTouchstart (e){//开始拖拽//创建遮罩层 this.createModal (this.modalID)//modalID遮罩层的id,由外部定义 让元素=e.targetTouches [0] 让目标=e.target.cloneNode(真正的)//拷贝目标元素 目标。id=opyID//copyID拷贝元素的id,由外部定义//记录初始点击位置客户,用于计算移动距离 this.source。客户={ x: element.clientX, y: element.clientY }//算出目标元素的固定位置 让disX=this.source.start。.left左=element.target.getBoundingClientRect () 让disY=this.source.start。直顶=element.target.getBoundingClientRect()上 target.style。cssText=':固定;左:$ {disX} px;上图:$ {disY} px;”//将拷贝的元素放到遮罩中 . getelementbyid (this.modalID) .appendChild(目标) },
1.3处理拖拽
拖拽的时候,监听touchmove事件
用【当前鼠标点位置】减去【初始点击位置】得到移动的距离
再结合初始坐标信息,更新拖拽元素的坐标
handleTouchmove (e){//拖拽中 让元素=e.targetTouches [0] 让目标=. getelementbyid (this.copyID)//根据初始点击位置客户计算移动距离 让左=this.source.start。左+元素。clientX——this.source.client.x 让=this.source.start。+顶级元素。clientY——this.source.client.y//移动当前元素 target.style。左左=' $ {}px” target.style。顶级=' ${顶级}px” },
1.4拖拽结束
拖拽结束的时候,记录终点位置,删除遮罩
handleTouchend (e){//拖拽结束 让结束={ x: e.changedTouches [0] .clientX, y: e.changedTouches [0] .clientY }//删除遮罩层 让模态=. getelementbyid (this.modalID) document.body.removeChild(模态)//处理结果 this.doingSth(结束) },
不过上面的代码只实现了拖拽的功能,并没有对目标元素一进行显示/隐藏的操作
可以根据业务场景自行添加,或者参考方案二
<强>方案二:平移动画翻译强>
这种方案更为简单,不需要创建额外的DOM元素
只需对原本的元素添加变换属性,甚至不需要过渡属性
然后在拖拽过程中,实时更新变换:翻译(X, Y)中X, Y的坐标信息,实现拖拽
2.1开始拖拽
开始拖拽的时候,只需要记录起点坐标
handleTouchstart (e){//开始拖拽 让元素=e。targetTouches[0]//记录初始端位置,用于计算移动距离 this.source。客户={ x: element.clientX, y: element.clientY } },
为了防止拖拽的过程中误触,建议使用方案一的createModal()方法创建一个遮罩
2.2处理拖拽
根据当前坐标和起点坐标,计算出距离,然后更新翻译的坐标
handleTouchmove (e){//拖拽中 让元素=e.targetTouches [0]//根据初始端位置计算移动距离 让x=元素。clientX——this.source.client.x 让y=元素。clientY——this.source.client.y//移动当前元素 element.target.style。cssText='变换:翻译($ {x} px, $ {y} px);“ },JS移动端实现拖拽的方法