移動端touch拖動和click事件沖突問題解決
通過一個懸浮球交互功能的案例來闡述問題,以及解決辦法。
實現(xiàn)效果
類似微信里的懸浮窗效果,蘋果手機的懸浮球功能效果
- 可以點擊拖動,然后吸附在窗口邊緣
- 點擊懸浮球,可以跳轉(zhuǎn)界面,或者更改懸浮球的形態(tài)
準備
- 移動端使用 touch事件類型:
touchstart當用戶在觸摸平面上放置了一個觸點時觸發(fā) (手指放到屏幕上)
touchmove當用戶在觸摸平面上移動觸點時觸發(fā) (手指在屏幕上滑動)
touchend當一個觸點被用戶從觸摸平面上移除(抬起手指)
touchcancel終止觸摸事件
多點觸控
TouchEvent.targetTouches只讀
一個 TouchList 對象,是包含了如下觸點的 Touch 對象:觸摸起始于當前事件的目標 element 上,并且仍然沒有離開觸摸平面的觸點。
視口處于第四象限,原點在左上角
event.targetTouches.clientX // 觸摸元素橫坐標 event.targetTouches.clientY // 觸摸元素縱坐標
TouchEvent.touches只讀
一個 TouchList 對象,包含了所有當前接觸觸摸平面的觸點的 Touch 對象,無論它們的起始于哪個 element 上,也無論它們狀態(tài)是否發(fā)生了變化。
實現(xiàn)
通過設(shè)置懸浮球定位樣式,拖動的時候計算坐標,然后動態(tài)的修改懸浮球的定位偏移量,結(jié)合transtion過渡效果,實現(xiàn)平滑的過渡
代碼比較簡單,就不貼了。
問題
當給元素添加了touch事件之后,click事件就不會出發(fā)了,那么怎么模擬點擊效果呢?
分析
在不了解觸摸事件響應(yīng)機制的時候,你可能會從計算觸摸目標元素的時長或者計算觸摸起始位置來判定點擊行為,但是這兩種方式都不是最佳的,原因有以下幾點:
- 計算觸摸時長比較麻煩
- 判斷移動距離不嚴謹,有可能拖動了一圈又回到初始位置
- 結(jié)合計算觸摸時長和觸摸元素起始位置兩種方式,邏輯比較復(fù)雜
下面看我是怎么做的:
首先應(yīng)該了解觸摸行為的事件響應(yīng)機制:
- 如果有拖動行為,事件執(zhí)行次序為:
touchstart->touchmove->touchend - 沒有拖動行為,事件執(zhí)行次序為:
touchstart->touchend
從上面的分析來看,我們可以從touchmove 入手,繼續(xù)往下看??
解決
- 在
touchmove事件中增加一個是否移動過的標記isMoved: true - 在
touchend事件中判斷isMoved是否為true,是true則按原有邏輯執(zhí)行,是false則說明沒有移動過,屬于點擊行為 - 在
touchend事件最后,重置isMoved為初始值false,這樣每一個觸摸操作都可以進入同樣的邏輯,不用擔心狀態(tài)混亂
完美解決模擬點擊行為????
以上就是移動端touch拖動和click事件沖突問題解決的詳細內(nèi)容,更多關(guān)于touch click事件沖突解決的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
小程序云開發(fā)如何實現(xiàn)圖片上傳及發(fā)表文字
這篇文章主要為大家詳細介紹了小程序云開發(fā)教程,如何實現(xiàn)圖片上傳及發(fā)表文字,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-05-05
JavaScript預(yù)解析及相關(guān)技巧分析
這篇文章主要介紹了JavaScript預(yù)解析及相關(guān)技巧,結(jié)合實例形式分析了JavaScript與解析的原理,步驟與相關(guān)技巧,需要的朋友可以參考下2016-04-04
基于JavaScript實現(xiàn)簡單抽獎功能代碼實例
這篇文章主要介紹了基于JavaScript實現(xiàn)簡單抽獎功能代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-10-10
原生js實現(xiàn)可兼容PC和移動端的拖動滑塊功能詳解【測試可用】
這篇文章主要介紹了原生js實現(xiàn)可兼容PC和移動端的拖動滑塊功能,結(jié)合實例形式詳細分析了javascript事件響應(yīng)及頁面元素屬性動態(tài)操作實現(xiàn)滑塊拖動功能的相關(guān)操作技巧,需要的朋友可以參考下2019-08-08

