日本电影一区二区_日本va欧美va精品发布_日本黄h兄妹h动漫一区二区三区_日本欧美黄色

移動(dòng)端h5實(shí)現(xiàn)拖拽的兩種方法(移動(dòng)端h5實(shí)現(xiàn)拖拽的兩種方法是什么)

移動(dòng)端的項(xiàng)目經(jīng)常會(huì)引入手勢庫來實(shí)現(xiàn)拖拽

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

最近的項(xiàng)目中就有這么一個(gè)需求:

移動(dòng)端h5實(shí)現(xiàn)拖拽的兩種方法(移動(dòng)端h5實(shí)現(xiàn)拖拽的兩種方法是什么)

需求

因?yàn)榫瓦@一個(gè)地方需要拖拽,所以我就沒有引入第三方庫

移動(dòng)端的拖拽有兩種主流的實(shí)現(xiàn)方案:

1. 將元素設(shè)置為固定定位,然后在拖拽的時(shí)候修改其定位,實(shí)現(xiàn)拖拽的效果;

2. 使用 transform 中的平移 translate 屬性實(shí)現(xiàn)拖拽。

方案一:固定定位 fixed

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

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

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

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

1.1 創(chuàng)建遮罩

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

移動(dòng)端h5實(shí)現(xiàn)拖拽的兩種方法(移動(dòng)端h5實(shí)現(xiàn)拖拽的兩種方法是什么)

創(chuàng)建遮罩

1.2 開始拖拽

在觸發(fā) touchstart 事件的時(shí)候,首先創(chuàng)建遮罩

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

為了記錄起點(diǎn)信息,需要 data 中創(chuàng)建一個(gè)對(duì)象 source,用于記錄點(diǎn)擊的位置 client,和初始定位坐標(biāo) start

移動(dòng)端h5實(shí)現(xiàn)拖拽的兩種方法(移動(dòng)端h5實(shí)現(xiàn)拖拽的兩種方法是什么)

開始拖拽

1.3 處理拖拽

拖拽的時(shí)候,監(jiān)聽 touchmove 事件

用【當(dāng)前鼠標(biāo)點(diǎn)位置】減去【初始點(diǎn)擊位置】得到移動(dòng)的距離

再結(jié)合初始坐標(biāo)信息,更新拖拽元素的坐標(biāo)

移動(dòng)端h5實(shí)現(xiàn)拖拽的兩種方法(移動(dòng)端h5實(shí)現(xiàn)拖拽的兩種方法是什么)

處理拖拽

1.4 拖拽結(jié)束

拖拽結(jié)束的時(shí)候,記錄終點(diǎn)位置,刪除遮罩

移動(dòng)端h5實(shí)現(xiàn)拖拽的兩種方法(移動(dòng)端h5實(shí)現(xiàn)拖拽的兩種方法是什么)

拖拽結(jié)束

不過上面的代碼只實(shí)現(xiàn)了拖拽的功能,并沒有對(duì)目標(biāo)元素 A 進(jìn)行顯示/隱藏的操作

可以根據(jù)業(yè)務(wù)場景自行添加,或者參考方案二

方案二:平移動(dòng)畫 translate

這種方案更為簡單,不需要?jiǎng)?chuàng)建額外的 DOM 元素

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

然后在拖拽過程中,實(shí)時(shí)更新 transform: translate(X, Y) 中 x, y 的坐標(biāo)信息,實(shí)現(xiàn)拖拽

2.1 開始拖拽

開始拖拽的時(shí)候,只需要記錄起點(diǎn)坐標(biāo)

移動(dòng)端h5實(shí)現(xiàn)拖拽的兩種方法(移動(dòng)端h5實(shí)現(xiàn)拖拽的兩種方法是什么)

開始拖拽

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

2.2 處理拖拽

根據(jù)當(dāng)前坐標(biāo)和起點(diǎn)坐標(biāo),計(jì)算出距離,然后更新 translate 的坐標(biāo)

移動(dòng)端h5實(shí)現(xiàn)拖拽的兩種方法(移動(dòng)端h5實(shí)現(xiàn)拖拽的兩種方法是什么)

處理拖拽

2.3 拖拽結(jié)束

拖拽完成后,清除平移動(dòng)畫

移動(dòng)端h5實(shí)現(xiàn)拖拽的兩種方法(移動(dòng)端h5實(shí)現(xiàn)拖拽的兩種方法是什么)

拖拽結(jié)束

小結(jié):

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

但這個(gè)方法性能不高,應(yīng)當(dāng)少用

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

我的項(xiàng)目使用了 vue.js,但拖拽功能用到 vue 的地方不多,將幾個(gè)用于記錄的對(duì)象提出來,就能復(fù)用于其他框架

相關(guān)新聞

聯(lián)系我們
聯(lián)系我們
公眾號(hào)
公眾號(hào)
在線咨詢
分享本頁
返回頂部
鸡东县| 临武县| 怀集县| 黎川县| 嘉定区| 太谷县| 广东省| 黎平县| 阜阳市| 安庆市| 泰和县| 四会市| 方山县| 哈密市| 宁强县| 凤冈县| 德化县| 黄平县| 衡阳县| 晋城| 南丹县| 东乌珠穆沁旗| 永顺县| 湖南省| 方城县| 内江市| 长垣县| 芜湖市| 胶州市| 增城市| 山阳县| 社会| 盐城市| 电白县| 冀州市| 杭州市| 英吉沙县| 商都县| 安溪县| 兴山县| 新建县|