摘要:從長(zhǎng)按開(kāi)始學(xué)習(xí)手勢(shì)在項(xiàng)目開(kāi)發(fā)過(guò)程中遇到有虛擬鍵盤(pán)開(kāi)發(fā)的需求如下圖,其中刪除鍵需要實(shí)現(xiàn)長(zhǎng)按刪除輸入框全部?jī)?nèi)容,由此展開(kāi)今天要討論的手勢(shì)開(kāi)發(fā)內(nèi)容。所以長(zhǎng)按手勢(shì)實(shí)際上是由三者共同模擬的效果。
從 [長(zhǎng)按] 開(kāi)始學(xué)習(xí) web 手勢(shì)
在項(xiàng)目開(kāi)發(fā)過(guò)程中遇到有虛擬鍵盤(pán)開(kāi)發(fā)的需求(如下圖),其中刪除鍵需要實(shí)現(xiàn) 長(zhǎng)按 刪除輸入框全部?jī)?nèi)容,由此展開(kāi)今天要討論的 web 手勢(shì) 開(kāi)發(fā)內(nèi)容。
先放出實(shí)現(xiàn)代碼:
var $input = document.getElementById("input"); var $delBtn = document.getElementById("delBtn"); var delBtnClock = null; $delBtn.ontouchstart = function () { $input.innerHTML = $input.innerHTML.slice(0, -1) delBtnClock = setTimeout(function () { $input.innerHTML = ""; }, 500); } $delBtn.ontouchend = function () { clearTimeout(delBtnClock); delBtnClock = null; }
關(guān)鍵代碼就兩句話(huà):
在 touchstart 事件中開(kāi)啟計(jì)時(shí),這里是計(jì)時(shí) 500 ms 后,刪除輸入框內(nèi)容
在 touchend 事件中清除 setTimeout 計(jì)時(shí)器
如果只是點(diǎn)擊,此時(shí) touchend 距離 touchstart 肯定不到 500 ms,計(jì)時(shí)器在時(shí)間沒(méi)到前已被刪除,實(shí)現(xiàn)的效果就只是退格;如果長(zhǎng)按超過(guò) 500 ms,計(jì)時(shí)器執(zhí)行,實(shí)現(xiàn)輸入框內(nèi)容全部刪除。
所以 長(zhǎng)按 手勢(shì)實(shí)際上是由 touchstart & touchend & setTimeout 三者共同模擬的效果。
實(shí)際上,常規(guī)的 js 事件只支持 click、touchstart、touchend、touchmove、touchcancel 這五種與點(diǎn)擊相關(guān)的事件,如果想實(shí)現(xiàn)更多的諸如旋轉(zhuǎn)、放大縮小之類(lèi)的手勢(shì)的話(huà),就需要結(jié)合上面的五種事件和其他方法來(lái)模擬實(shí)現(xiàn)了。
下面我將來(lái)介紹下傳說(shuō)中的《超級(jí)小的 web 手勢(shì)庫(kù):AlloyFinger》
學(xué)習(xí) AlloyFinger業(yè)內(nèi)知名的強(qiáng)大的 web 手勢(shì)庫(kù) hammer.js,總共有 3240 行代碼,壓縮版的 44.7 kb。與之相比,AlloyFinger 真的稱(chēng)得上超級(jí)小了,326 行代碼,10 倍的差距,在 “kb 必爭(zhēng)” 移動(dòng) web 應(yīng)用里,AlloyFinger 一下就引起了廣大開(kāi)發(fā)者的注意,代碼量小,功能又齊全,你還要什么單車(chē)呢。(我是不是得找人家要下廣告費(fèi))
在 AlloyFinger 里,手勢(shì)一共有 14 種,除了常規(guī)的 4 種 touchstart,touchmove,touchend 和 touchcancel,還有 10 種由以上 4 種衍生出來(lái)的手勢(shì)如下:
multipointStart:多點(diǎn)開(kāi)始
multipointEnd:多點(diǎn)結(jié)束
tap:點(diǎn)擊,效果如 click
doubleTap:雙擊
longTap:長(zhǎng)按
singleTap:?jiǎn)螕羟闆r下 250 ms 內(nèi)沒(méi)有再次點(diǎn)擊(會(huì)同時(shí)觸發(fā) tap,tap 在前)
rotate:旋轉(zhuǎn)(同時(shí)觸發(fā) pressMove)
pinch:放大縮小
pressMove:?jiǎn)吸c(diǎn)移動(dòng)
twoFingerPressMove:多點(diǎn)移動(dòng)
swipe:掃滑,在 touchend 里觸發(fā),與 touchmove 稍有不同
原理multipointStart
touchstart 中,觸點(diǎn)多于 1 個(gè)時(shí)觸發(fā)
multipointEnd
touchend 中,觸點(diǎn)少于 2 個(gè)時(shí)觸發(fā)(一開(kāi)始還在想是不是 bug,實(shí)際的意思是:最后一個(gè)手指離開(kāi)時(shí)觸發(fā))
tap
touchend 中,觸點(diǎn)沒(méi)有移動(dòng)(移動(dòng)橫縱距離小于 30 px),且沒(méi)有觸發(fā) longTap 時(shí)(距離 touchStart 時(shí)間少于 750 ms)觸發(fā)
doubleTap
touchend 中,有上一次的點(diǎn)擊記錄 & 點(diǎn)擊時(shí)間差小于 250 ms & 兩次點(diǎn)擊間沒(méi)有移動(dòng)(移動(dòng)橫縱距離小于 30 px)
longTap
touchstart 中,添加 750 ms 計(jì)時(shí)器,在這個(gè)時(shí)間段內(nèi)沒(méi)有松手(touchEnd)移動(dòng)(touchMove),則觸發(fā)
singleTap
touchend 中,單擊情況下 250 ms 內(nèi)沒(méi)有再次點(diǎn)擊
rotate
touchmove 中,觸點(diǎn)多于 1 個(gè),并存在上一次的多點(diǎn)移動(dòng)記錄時(shí)觸發(fā)
pinch
touchmove 中,觸點(diǎn)多于 1 個(gè) & 存在上一次的移動(dòng)記錄 & 有縮放長(zhǎng)度記錄時(shí)觸發(fā)
pressMove
touchmove 中,觸點(diǎn)等于 1 個(gè)
twoFingerPressMove
touchmove 中,觸點(diǎn)多于 1 個(gè)
swipe
touchend 中,觸點(diǎn)有移動(dòng)(移動(dòng)橫縱距離大于 30 px)
生命周期 重點(diǎn)代碼中多處使用 setTimeout(function () {}, 0);, 一方面實(shí)現(xiàn)同步轉(zhuǎn)異步,釋放線(xiàn)程,另一方面也能確保屏幕滾動(dòng)時(shí)阻止事件的觸發(fā)
滑動(dòng)時(shí),以最大的移動(dòng)方向決定水平和豎直方向
_swipeDirection: function (x1, x2, y1, y2) { return Math.abs(x1 - x2) >= Math.abs(y1 - y2) ? (x1 - x2 > 0 ? "Left" : "Right") : (y1 - y2 > 0 ? "Up" : "Down") }
在閱讀源碼過(guò)程中,對(duì)關(guān)鍵代碼做了注釋?zhuān)c(diǎn)我
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/92927.html
摘要:目前作為騰訊手機(jī)手勢(shì)解決方案,在各大項(xiàng)目中都發(fā)揮著作用。因此也入選了騰訊平臺(tái)的精品組件除了國(guó)內(nèi)外的項(xiàng)目團(tuán)隊(duì)都在使用,國(guó)內(nèi)外的各大網(wǎng)站也進(jìn)行了轉(zhuǎn)載報(bào)道,作為超級(jí)小的手勢(shì)庫(kù),騰訊的項(xiàng)目為什么不選擇而選擇下面從各個(gè)角度架構(gòu)原理上進(jìn)行一下分析。 目前AlloyFinger作為騰訊手機(jī)QQ web手勢(shì)解決方案,在各大項(xiàng)目中都發(fā)揮著作用。感興趣的同學(xué)可以去Github看看: https://git...
摘要:擁有兩個(gè)版本,無(wú)依賴(lài)的獨(dú)立版和版本。除了對(duì)象,也可監(jiān)聽(tīng)內(nèi)元素的手勢(shì)需要引擎內(nèi)置對(duì)象支持綁定相關(guān)事件。據(jù)不完全統(tǒng)計(jì),目前服務(wù)于興趣部落群動(dòng)漫騰訊學(xué)院騰訊等多個(gè)部門(mén)團(tuán)隊(duì)和項(xiàng)目。也可以在事件回調(diào)里根據(jù)攜帶的信息使用去操作。 簡(jiǎn)介 針對(duì)多點(diǎn)觸控設(shè)備編程的Web手勢(shì)組件,快速幫助你的web程序增加手勢(shì)支持,也不用再擔(dān)心click 300ms的延遲了。擁有兩個(gè)版本,無(wú)依賴(lài)的獨(dú)立版和react版本。...
摘要:最近接到一個(gè)小的項(xiàng)目,需要實(shí)現(xiàn)觸屏滑動(dòng),圖片縮放旋轉(zhuǎn)移動(dòng),故而花了三天時(shí)間學(xué)習(xí)并實(shí)現(xiàn)了一下,在此記錄一下學(xué)習(xí)過(guò)程關(guān)鍵就是觸屏手勢(shì)用到的技術(shù)過(guò)渡轉(zhuǎn)換我就不說(shuō)了,與是屬于輕量級(jí)的觸屏手勢(shì)封裝庫(kù),其中水平移動(dòng)用的是別的功能用的是。 最近接到一個(gè)小的項(xiàng)目,需要實(shí)現(xiàn)觸屏滑動(dòng),圖片縮放旋轉(zhuǎn)移動(dòng),故而花了三天時(shí)間學(xué)習(xí)并實(shí)現(xiàn)了一下,在此記錄一下學(xué)習(xí)過(guò)程:關(guān)鍵就是css、 觸屏手勢(shì)用到的技術(shù):css過(guò)...
摘要:最近接到一個(gè)小的項(xiàng)目,需要實(shí)現(xiàn)觸屏滑動(dòng),圖片縮放旋轉(zhuǎn)移動(dòng),故而花了三天時(shí)間學(xué)習(xí)并實(shí)現(xiàn)了一下,在此記錄一下學(xué)習(xí)過(guò)程關(guān)鍵就是觸屏手勢(shì)用到的技術(shù)過(guò)渡轉(zhuǎn)換我就不說(shuō)了,與是屬于輕量級(jí)的觸屏手勢(shì)封裝庫(kù),其中水平移動(dòng)用的是別的功能用的是。 最近接到一個(gè)小的項(xiàng)目,需要實(shí)現(xiàn)觸屏滑動(dòng),圖片縮放旋轉(zhuǎn)移動(dòng),故而花了三天時(shí)間學(xué)習(xí)并實(shí)現(xiàn)了一下,在此記錄一下學(xué)習(xí)過(guò)程:關(guān)鍵就是css、 觸屏手勢(shì)用到的技術(shù):css過(guò)...
閱讀 686·2019-08-30 15:44
閱讀 1409·2019-08-30 11:02
閱讀 3014·2019-08-29 18:42
閱讀 3536·2019-08-29 16:16
閱讀 1744·2019-08-26 13:55
閱讀 1799·2019-08-26 13:45
閱讀 2404·2019-08-26 11:43
閱讀 3276·2019-08-26 10:32