日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:166日期: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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美国产日韩电影| 国产videos久久| 日韩欧美网址| 五月激情久久| 不卡av一区二区| 日韩精品不卡一区二区| 欧美日一区二区| 丝袜美腿亚洲色图| 日本视频一区二区| 麻豆成人av在线| 欧美少妇精品| 国产精品红桃| 一区二区三区四区日本视频| 亚洲成人一区| 亚洲91网站| 欧美精品不卡| 亚洲五月婷婷| 亚洲深夜福利在线观看| 国产极品模特精品一二| 色婷婷狠狠五月综合天色拍| 中文字幕一区二区三区在线视频| 国产精品主播在线观看| 久久激情一区| 日韩av一区二区三区| 不卡福利视频| 中文字幕日韩欧美精品高清在线| 久久在线91| 亚洲自啪免费| 精品福利久久久| 午夜在线精品偷拍| 麻豆高清免费国产一区| 午夜精品一区二区三区国产| 亚洲制服一区| 免费高潮视频95在线观看网站| 亚洲精品进入| 欧美成人基地| 国产美女视频一区二区| 欧美日韩国产高清| 久久精品国产一区二区| 视频一区二区三区中文字幕| 精品三级av| 日本在线成人| 欧美一区二区性| 麻豆成人在线观看| 亚洲精品一级二级三级| 欧美日韩精品一区二区视频| 国产精品密蕾丝视频下载| 欧美国产91| 久久精品国产999大香线蕉| 视频一区二区三区在线| 丝袜美腿诱惑一区二区三区 | 精品一区二区三区中文字幕在线| 夜夜嗨一区二区三区| 91日韩在线| 国产欧美亚洲一区| 国产中文欧美日韩在线| 国产色噜噜噜91在线精品| 国产在线欧美| 国产一区二区视频在线看| 日本中文字幕一区二区视频 | 热久久国产精品| 久久男人天堂| 欧美国产中文高清| 婷婷成人av| 国产日韩综合| 欧美日韩精品一区二区视频| 国产aⅴ精品一区二区三区久久| 国产亚洲高清一区| 日韩综合一区二区| 蜜桃视频第一区免费观看| 亚洲性视频h| 中文字幕在线视频久| 久久99偷拍| 国产精品日本一区二区不卡视频 | 亚洲va久久| 免费在线观看不卡| 久久久久国产精品一区三寸| 国产一区日韩| 老司机免费视频一区二区三区| 蜜桃视频免费观看一区| 中文日韩在线| 国产精品视区| 久久久久久久久99精品大| 久久久免费人体| 麻豆91小视频| 国产精品久久久久久久免费观看 | 国产精品日本欧美一区二区三区| 国产一区日韩一区| 欧美粗暴jizz性欧美20| 亚洲高清av| 午夜日韩在线| 久久成人一区| 四虎成人精品一区二区免费网站 | 亚洲神马久久| 在线观看一区| 91精品在线免费视频| 国产精品一线天粉嫩av| 日韩欧美精品| 图片区亚洲欧美小说区| 激情久久久久久久| 91久久黄色| 伊人久久大香伊蕉在人线观看热v| 麻豆高清免费国产一区| 精品网站999| 欧美日韩精品免费观看视欧美高清免费大片 | 精品久久不卡| 在线看片国产福利你懂的| 另类中文字幕国产精品| 激情五月色综合国产精品| 久久成人国产| 国产日韩1区| 国产精品蜜芽在线观看| 狠狠干综合网| 91精品尤物| 国产精品国产三级国产在线观看| 久久99蜜桃| 999国产精品| 亚洲精品裸体| 国产91在线播放精品| 日韩av福利| 久久久777| 免费人成精品欧美精品| 国产精品分类| 欧美aa在线观看| 亚洲综合精品| 国产精品久久亚洲不卡| 久久国产欧美| 日本在线不卡视频| 红杏一区二区三区| 午夜欧美精品| 日韩一区精品| 福利一区和二区| 亚洲一区日韩在线| 国产精品99久久免费| 欧美亚洲国产精品久久| 日韩激情视频网站| 伊人久久在线| 亚洲精品无吗| 97精品国产一区二区三区| 亚洲一区欧美激情| 美腿丝袜在线亚洲一区| 99xxxx成人网| 精品久久久久中文字幕小说| 亚洲综合欧美| 久久毛片亚洲| 亚洲精品一级| 日韩精品欧美| 国产日韩欧美一区二区三区| 久久国产日本精品| 日韩国产在线不卡视频| sm久久捆绑调教精品一区| 免费视频最近日韩| www在线观看黄色| 日韩亚洲精品在线观看| 丝袜美腿诱惑一区二区三区| 日韩黄色免费网站| 午夜精品婷婷| 成人av三级| 国产福利资源一区| 蜜桃视频一区二区三区在线观看| 老牛国内精品亚洲成av人片 | 成人台湾亚洲精品一区二区| 婷婷综合国产| 91精品观看| 人在线成免费视频| 国产欧美一区二区三区米奇| 亚洲一区日韩在线| 欧美一级鲁丝片| 国产精品啊啊啊| 日本综合精品一区| 久久国产精品99国产| 欧美日中文字幕| 精品免费视频| 欧美三区不卡| 蜜桃久久精品一区二区| 欧美日韩一二三四| 日韩在线不卡| 中文字幕成在线观看| 国产精品白丝久久av网站 | 欧美日韩一区二区综合| 国产成人免费视频网站视频社区| 日韩av黄色在线| 一区二区精彩视频| 亚洲欧美日韩国产一区二区| 亚洲成人二区| 欧美三区四区| 美女视频黄 久久| 国产精品一线天粉嫩av| 91精品国产自产精品男人的天堂 | 国产精品sss在线观看av| 日韩精品免费一区二区夜夜嗨| 在线国产一区二区| 欧美精品自拍| 亚洲免费黄色| 五月天综合网站| 国产乱人伦精品一区| 欧美专区18| 爽好多水快深点欧美视频| 首页亚洲欧美制服丝腿| 蜜桃视频在线观看一区|