电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

移動端JS實現拖拽兩種方法解析

瀏覽:96日期:2024-04-17 11:21:44

移動端的項目經常會引入手勢庫來實現拖拽

不過如果只是一兩個頁面用到拖拽,再引入一個手勢庫就很不劃算

最近的項目中就有這么一個需求:

移動端JS實現拖拽兩種方法解析

因為就這一個地方需要拖拽,所以我就沒有引入第三方庫

移動端的拖拽有兩種主流的實現方案:

1. 將元素設置為固定定位,然后在拖拽的時候修改其定位,實現拖拽的效果;

2. 使用 transform 中的平移translate 屬性實現拖拽。

方案一:固定定位 fixed

這種方案的核心就是給元素添加固定定位position:fixed;

但定位之后,元素會脫離文檔流,會影響原有但布局

因此在開始拖拽 (觸發touchstart事件) 的時候,需要將原本的元素 A 拷貝一份 (cloneNode())

給新元素 A2 添加定位,同時給原本的元素 A 設置visibility:hidden; 使之隱藏并占位

1.1 創建遮罩

首先封裝一個創建遮罩的方法,用于放置拷貝出來的元素,并防止誤觸

createModal (id) { let modal = document.getElementById(id) if (!modal) { // 在沒有遮罩的時候創建遮罩 modal = document.createElement(’div’) modal.id = id modal.style.cssText = `position: fixed; left: 0; top: 0; right: 0; bottom: 0; z-index: 999;` document.body.appendChild(modal) }},

1.2 開始拖拽

在觸發touchstart事件的時候,首先創建遮罩

并通過getBoundingClientRect()方法獲取到元素 A 的坐標,記錄起點信息

為了記錄起點信息,需要 data 中創建一個對象source,用于記錄點擊的位置 client,和初始定位坐標 start

handleTouchstart (e) { // 開始拖拽 // 創建遮罩層 this.createModal(this.modalID) // modalID 遮罩層的id,由外部定義 let element = e.targetTouches[0] let target = e.target.cloneNode(true) // 拷貝目標元素 target.id = this.copyID // copyID 拷貝元素的id,由外部定義 // 記錄初始點擊位置 client,用于計算移動距離 this.source.client = { x: element.clientX, y: element.clientY } // 算出目標元素的固定位置 let disX = this.source.start.left = element.target.getBoundingClientRect().left let disY = this.source.start.top = element.target.getBoundingClientRect().top target.style.cssText = `position: fixed; left: ${disX}px; top: ${disY}px;` // 將拷貝的元素放到遮罩中 document.getElementById(this.modalID).appendChild(target)},

1.3 處理拖拽

拖拽的時候,監聽touchmove事件

用【當前鼠標點位置】減去【初始點擊位置】得到移動的距離

再結合初始坐標信息,更新拖拽元素的坐標

handleTouchmove (e) { // 拖拽中 let element = e.targetTouches[0] let target = document.getElementById(this.copyID) // 根據初始點擊位置 client 計算移動距離 let left = this.source.start.left + element.clientX - this.source.client.x let top = this.source.start.top + element.clientY - this.source.client.y // 移動當前元素 target.style.left = `${left}px` target.style.top = `${top}px`},

1.4 拖拽結束

拖拽結束的時候,記錄終點位置,刪除遮罩

handleTouchend (e) { // 拖拽結束 let end = { x: e.changedTouches[0].clientX, y: e.changedTouches[0].clientY } // 刪除遮罩層 let modal = document.getElementById(this.modalID) document.body.removeChild(modal) // 處理結果 this.doingSth(end)},

不過上面的代碼只實現了拖拽的功能,并沒有對目標元素 A 進行顯示/隱藏的操作

可以根據業務場景自行添加,或者參考方案二

方案二:平移動畫translate

這種方案更為簡單,不需要創建額外的 DOM 元素

只需對原本的元素添加 transform 屬性,甚至不需要 transition 屬性

然后在拖拽過程中,實時更新transform: translate(X, Y)中 x, y 的坐標信息,實現拖拽

2.1 開始拖拽

開始拖拽的時候,只需要記錄起點坐標

handleTouchstart (e) { // 開始拖拽 let element = e.targetTouches[0]// 記錄初始 client 位置,用于計算移動距離 this.source.client = { x: element.clientX, y: element.clientY }},

為了防止拖拽的過程中誤觸,建議使用方案一的createModal()方法創建一個遮罩

2.2 處理拖拽

根據當前坐標和起點坐標,計算出距離,然后更新 translate 的坐標

handleTouchmove (e) { // 拖拽中 let element = e.targetTouches[0] // 根據初始 client 位置計算移動距離 let x = element.clientX - this.source.client.x let y = element.clientY - this.source.client.y // 移動當前元素 element.target.style.cssText = `transform: translate(${x}px, ${y}px);`},

2.3 拖拽結束

拖拽完成后,清除平移動畫

handleTouchend (e) { // 拖拽結束 // 清除拖拽樣式 e.target.style.cssText = `transform: none;`},

小結:

方案一在獲取目標元素的坐標信息的時候使用了 getBoundingClientRect() 方法

但這個方法性能不高,應當少用

而且即時使用了該方法,最后得到的 left 和 top 也不夠精確,touchstart 的時候,元素有明顯的閃動

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 变色龙PPT-国内原创PPT模板交易平台 - PPT贰零 - 西安聚讯网络科技有限公司 | 槽钢冲孔机,槽钢三面冲,带钢冲孔机-山东兴田阳光智能装备股份有限公司 | 北京银联移动POS机办理_收银POS机_智能pos机_刷卡机_收银系统_个人POS机-谷骐科技【官网】 | 硬质合金模具_硬质合金非标定制_硬面加工「生产厂家」-西迪技术股份有限公司 | 密集架|电动密集架|移动密集架|黑龙江档案密集架-大量现货厂家销售 | 胀套-锁紧盘-风电锁紧盘-蛇形联轴器「厂家」-瑞安市宝德隆机械配件有限公司 | 建筑消防设施检测系统检测箱-电梯**检测仪器箱-北京宇成伟业科技有限责任公司 | 注塑机-压铸机-塑料注塑机-卧式注塑机-高速注塑机-单缸注塑机厂家-广东联升精密智能装备科技有限公司 | 山东风淋室_201/304不锈钢风淋室净化设备厂家-盛之源风淋室厂家 翻斗式矿车|固定式矿车|曲轨侧卸式矿车|梭式矿车|矿车配件-山东卓力矿车生产厂家 | 冷轧机|两肋冷轧机|扁钢冷轧机|倒立式拉丝机|钢筋拔丝机|收线机-巩义市华瑞重工机械制造有限公司 | 碳刷_刷握_集电环_恒压簧_电刷厂家-上海丹臻机电科技有限公司 | 锂电叉车,电动叉车_厂家-山东博峻智能科技有限公司 | 铝镁锰板厂家_进口钛锌板_铝镁锰波浪板_铝镁锰墙面板_铝镁锰屋面-杭州军晟金属建筑材料 | 土壤有机碳消解器-石油|表层油类分析采水器-青岛溯源环保设备有限公司 | 碎石机设备-欧版反击破-欧版颚式破碎机(站)厂家_山东奥凯诺机械 高低温试验箱-模拟高低温试验箱订制-北京普桑达仪器科技有限公司【官网】 | 山楂片_雪花_迷你山楂片_山楂条饼厂家-青州市丰源食品厂 | 智慧水务|智慧供排水利信息化|水厂软硬件系统-上海敢创 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库-首页-东莞市傲马网络科技有限公司 | 捆扎机_气动捆扎机_钢带捆扎机-沈阳海鹞气动钢带捆扎机公司 | 消泡剂_水处理消泡剂_切削液消泡剂_涂料消泡剂_有机硅消泡剂_广州中万新材料生产厂家 | 聚氨酯保温钢管_聚氨酯直埋保温管道_聚氨酯发泡保温管厂家-沧州万荣防腐保温管道有限公司 | IHDW_TOSOKU_NEMICON_EHDW系列电子手轮,HC1系列电子手轮-上海莆林电子设备有限公司 | 上海心叶港澳台联考一对一培训_上海心叶港澳台联考,港澳台联考一对一升学指导 | 电镀电源整流器_高频电解电源_单脉双脉冲电源 - 东阳市旭东电子科技 | 免联考国际MBA_在职MBA报考条件/科目/排名-MBA信息网 | 广州展览设计公司_展台设计搭建_展位设计装修公司-众派展览装饰 广州展览制作工厂—[优简]直营展台制作工厂_展会搭建资质齐全 | 米顿罗计量泵(科普)——韬铭机械 | 丝印油墨_水性油墨_环保油墨油漆厂家_37国际化工 | Trimos测长机_测高仪_TESA_mahr,WYLER水平仪,PWB对刀仪-德瑞华测量技术(苏州)有限公司 | 垃圾处理设备_餐厨垃圾处理设备_厨余垃圾处理设备_果蔬垃圾处理设备-深圳市三盛环保科技有限公司 | 不锈钢管件(不锈钢弯头,不锈钢三通,不锈钢大小头),不锈钢法兰「厂家」-浙江志通管阀 | 深圳装修_店面装修设计_餐厅设计_装修全包价格-尚泰装饰设计 | 执业药师报名条件,考试时间,考试真题,报名入口—首页 | 缠膜机|缠绕包装机|无纺布包装机-济南达伦特机械设备有限公司 | 金库门,金库房,金库门厂家,金库门价格-河北特旺柜业有限公司 | 广州二手电缆线回收,旧电缆回收,广州铜线回收-广东益福电缆线回收公司 | 杭州中央空调维修_冷却塔/新风机柜/热水器/锅炉除垢清洗_除垢剂_风机盘管_冷凝器清洗-杭州亿诺能源有限公司 | 硬质合金模具_硬质合金非标定制_硬面加工「生产厂家」-西迪技术股份有限公司 | 釜溪印象网络 - Powered by Discuz!| 福州时代广告制作装饰有限公司-福州广告公司广告牌制作,福州展厅文化墙广告设计, | 防水试验机_防水测试设备_防水试验装置_淋雨试验箱-广州岳信试验设备有限公司 |