如何利用原生JS實(shí)現(xiàn)觸摸滑動(dòng)監(jiān)聽事件
前言
今天寫一個(gè)小Demo,有個(gè)地方涉及到了左滑右滑的邏輯,本來想著用插件來著,但是想到自己好久沒用原生JS寫滑動(dòng)的監(jiān)聽了,所以試著用原生JS來實(shí)現(xiàn)了一下,畢竟溫故而知新嘛,同時(shí)做個(gè)記錄。先把實(shí)現(xiàn)的效果貼出來:
構(gòu)思
想要寫出絲滑的觸摸滑動(dòng)事件的監(jiān)聽,要考慮以下3個(gè)方面的邏輯:
- 距離: 滑動(dòng)距離要大于40
- 時(shí)間: 滑動(dòng)時(shí)間小于在0.5秒,即500毫秒內(nèi)完成手指按下,拖動(dòng),離開(避免只是手指在屏幕就觸發(fā))
- 滑動(dòng)方向:
- 左右滑動(dòng)的條件是:X軸移動(dòng)的距離大于Y軸移動(dòng)的距離,為正則向左,為負(fù)則向右
- 上下滑動(dòng)的條件是Y軸移動(dòng)的距離大于X軸移動(dòng)的距離,為正則向上,為負(fù)則向下
有了基礎(chǔ)的構(gòu)思,我們就可以根據(jù)這個(gè)思路來完成代碼了~
監(jiān)聽的事件
說到監(jiān)聽觸摸滑動(dòng),要用到的自然就是下面這三個(gè)觸摸事件了:
1. touchstart 觸摸開始,手指點(diǎn)擊屏幕時(shí)觸發(fā)(可監(jiān)聽多點(diǎn)觸控,后面的手指也同樣會(huì)觸發(fā))
2. touchmove 接觸點(diǎn)改變,滑動(dòng)時(shí)持續(xù)觸發(fā)
3. touchend 觸摸結(jié)束,手指離開屏幕時(shí)觸發(fā)
這三個(gè)觸摸事件每個(gè)都包括了三個(gè)觸摸對象列表(可根據(jù)觸摸點(diǎn)實(shí)現(xiàn)多點(diǎn)觸控):
1. touches:當(dāng)前屏幕上的所有手指觸摸點(diǎn)的列表
2. targetTouches:當(dāng)前DOM元素上手指的列表
3. changedTouches:當(dāng)前事件手指的列表
同時(shí)每個(gè)觸摸對象Touch包含的屬性如下:
- identifier:標(biāo)識(shí)觸摸的唯一ID
- pageX:觸摸點(diǎn)在頁面中的x坐標(biāo)
- pageY:觸摸點(diǎn)在頁面中的y坐標(biāo)
- screenX:觸摸點(diǎn)在屏幕中的x坐標(biāo)
- screenY:觸摸點(diǎn)在屏幕中的y坐標(biāo)
- clientX:觸摸點(diǎn)在視口中的x坐標(biāo)
- clientY:觸摸點(diǎn)在視口中的y坐標(biāo)
- target:觸摸的DOM節(jié)點(diǎn)
代碼實(shí)現(xiàn)
有了上面的構(gòu)思和觸摸事件的基礎(chǔ),我們很容易就能把代碼敲出來啦~
let box = document.querySelector('body') // 監(jiān)聽對象 let startTime = '' // 觸摸開始時(shí)間 let startDistanceX = '' // 觸摸開始X軸位置 let startDistanceY = '' // 觸摸開始Y軸位置 let endTime = '' // 觸摸結(jié)束時(shí)間 let endDistanceX = '' // 觸摸結(jié)束X軸位置 let endDistanceY = '' // 觸摸結(jié)束Y軸位置 let moveTime = '' // 觸摸時(shí)間 let moveDistanceX = '' // 觸摸移動(dòng)X軸距離 let moveDistanceY = '' // 觸摸移動(dòng)Y軸距離 box.addEventListener("touchstart", (e) => { startTime = new Date().getTime() startDistanceX = e.touches[0].screenX startDistanceY = e.touches[0].screenY }) box.addEventListener("touchend", (e) => { endTime = new Date().getTime() endDistanceX = e.changedTouches[0].screenX endDistanceY = e.changedTouches[0].screenY moveTime = endTime - startTime moveDistanceX = startDistanceX - endDistanceX moveDistanceY = startDistanceY - endDistanceY console.log(moveDistanceX, moveDistanceY) // 判斷滑動(dòng)距離超過40 且 時(shí)間小于500毫秒 if ((Math.abs(moveDistanceX) > 40 || Math.abs(moveDistanceY) > 40) && moveTime < 500) { // 判斷X軸移動(dòng)的距離是否大于Y軸移動(dòng)的距離 if (Math.abs(moveDistanceX) > Math.abs(moveDistanceY)) { // 左右 console.log(moveDistanceX > 0 ? '左' : '右') } else { // 上下 console.log(moveDistanceY > 0 ? '上' : '下') } } })
運(yùn)行一下看看吧:
可以看出,觸摸時(shí)間大于500ms不會(huì)觸發(fā),滑動(dòng)距離小于40也不會(huì)觸發(fā),如果是有角度的滑動(dòng),則會(huì)以XY軸移動(dòng)距離最遠(yuǎn)的為準(zhǔn)。完美實(shí)現(xiàn)!
后記
前端框架發(fā)展日益迅猛,很多人直接上手學(xué)習(xí)框架也毫無壓力,對原生JS的學(xué)習(xí)就不那么重視了。但萬變不離其宗,框架的優(yōu)勢在于它的設(shè)計(jì)思想和模式,想要深刻的理解還是要有原生JS做基礎(chǔ),想要走得遠(yuǎn),還是要把基礎(chǔ)夯實(shí),畢竟萬丈高樓平地起不是?
到此這篇關(guān)于如何利用原生JS實(shí)現(xiàn)觸摸滑動(dòng)監(jiān)聽事件的文章就介紹到這了,更多相關(guān)JS觸摸滑動(dòng)監(jiān)聽事件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js實(shí)現(xiàn)定時(shí)進(jìn)度條完成后切換圖片
這篇文章主要介紹了js實(shí)現(xiàn)定時(shí)進(jìn)度條,進(jìn)度100%以后可以切換圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01JS 動(dòng)態(tài)判斷PC和手機(jī)瀏覽器實(shí)現(xiàn)代碼
這篇文章主要介紹了JS 動(dòng)態(tài)判斷PC和手機(jī)瀏覽器實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2016-09-09js日期相關(guān)函數(shù)dateAdd,dateDiff,dateFormat等介紹
這篇文章主要介紹了js日期相關(guān)函數(shù)dateAdd,dateDiff,dateFormat等介紹,需要的朋友可以參考下2016-09-09D3.js實(shí)現(xiàn)散點(diǎn)圖和氣泡圖的方法詳解
這篇文章將會(huì)給大家介紹了另外兩種可視化圖表,利用D3.js實(shí)現(xiàn)散點(diǎn)圖和氣泡圖,文章通過多個(gè)方面介紹的非常詳細(xì),下面來一起看看吧。2016-09-09JavaScript獲得頁面base標(biāo)簽中url的方法
這篇文章主要介紹了JavaScript獲得頁面base標(biāo)簽中url的方法,涉及javascript中元素的獲取及href屬性的使用技巧,需要的朋友可以參考下2015-04-04