如何利用原生JS實現(xiàn)觸摸滑動監(jiān)聽事件
前言
今天寫一個小Demo,有個地方涉及到了左滑右滑的邏輯,本來想著用插件來著,但是想到自己好久沒用原生JS寫滑動的監(jiān)聽了,所以試著用原生JS來實現(xiàn)了一下,畢竟溫故而知新嘛,同時做個記錄。先把實現(xiàn)的效果貼出來:

構思
想要寫出絲滑的觸摸滑動事件的監(jiān)聽,要考慮以下3個方面的邏輯:
- 距離: 滑動距離要大于40
- 時間: 滑動時間小于在0.5秒,即500毫秒內完成手指按下,拖動,離開(避免只是手指在屏幕就觸發(fā))
- 滑動方向:
- 左右滑動的條件是:X軸移動的距離大于Y軸移動的距離,為正則向左,為負則向右
- 上下滑動的條件是Y軸移動的距離大于X軸移動的距離,為正則向上,為負則向下
有了基礎的構思,我們就可以根據(jù)這個思路來完成代碼了~
監(jiān)聽的事件
說到監(jiān)聽觸摸滑動,要用到的自然就是下面這三個觸摸事件了:
1. touchstart 觸摸開始,手指點擊屏幕時觸發(fā)(可監(jiān)聽多點觸控,后面的手指也同樣會觸發(fā))
2. touchmove 接觸點改變,滑動時持續(xù)觸發(fā)
3. touchend 觸摸結束,手指離開屏幕時觸發(fā)
這三個觸摸事件每個都包括了三個觸摸對象列表(可根據(jù)觸摸點實現(xiàn)多點觸控):
1. touches:當前屏幕上的所有手指觸摸點的列表
2. targetTouches:當前DOM元素上手指的列表
3. changedTouches:當前事件手指的列表
同時每個觸摸對象Touch包含的屬性如下:
- identifier:標識觸摸的唯一ID
- pageX:觸摸點在頁面中的x坐標
- pageY:觸摸點在頁面中的y坐標
- screenX:觸摸點在屏幕中的x坐標
- screenY:觸摸點在屏幕中的y坐標
- clientX:觸摸點在視口中的x坐標
- clientY:觸摸點在視口中的y坐標
- target:觸摸的DOM節(jié)點
代碼實現(xiàn)
有了上面的構思和觸摸事件的基礎,我們很容易就能把代碼敲出來啦~
let box = document.querySelector('body') // 監(jiān)聽對象
let startTime = '' // 觸摸開始時間
let startDistanceX = '' // 觸摸開始X軸位置
let startDistanceY = '' // 觸摸開始Y軸位置
let endTime = '' // 觸摸結束時間
let endDistanceX = '' // 觸摸結束X軸位置
let endDistanceY = '' // 觸摸結束Y軸位置
let moveTime = '' // 觸摸時間
let moveDistanceX = '' // 觸摸移動X軸距離
let moveDistanceY = '' // 觸摸移動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)
// 判斷滑動距離超過40 且 時間小于500毫秒
if ((Math.abs(moveDistanceX) > 40 || Math.abs(moveDistanceY) > 40) && moveTime < 500) {
// 判斷X軸移動的距離是否大于Y軸移動的距離
if (Math.abs(moveDistanceX) > Math.abs(moveDistanceY)) {
// 左右
console.log(moveDistanceX > 0 ? '左' : '右')
} else {
// 上下
console.log(moveDistanceY > 0 ? '上' : '下')
}
}
})
運行一下看看吧:

可以看出,觸摸時間大于500ms不會觸發(fā),滑動距離小于40也不會觸發(fā),如果是有角度的滑動,則會以XY軸移動距離最遠的為準。完美實現(xiàn)!
后記
前端框架發(fā)展日益迅猛,很多人直接上手學習框架也毫無壓力,對原生JS的學習就不那么重視了。但萬變不離其宗,框架的優(yōu)勢在于它的設計思想和模式,想要深刻的理解還是要有原生JS做基礎,想要走得遠,還是要把基礎夯實,畢竟萬丈高樓平地起不是?
到此這篇關于如何利用原生JS實現(xiàn)觸摸滑動監(jiān)聽事件的文章就介紹到這了,更多相關JS觸摸滑動監(jiān)聽事件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
JS 動態(tài)判斷PC和手機瀏覽器實現(xiàn)代碼
這篇文章主要介紹了JS 動態(tài)判斷PC和手機瀏覽器實現(xiàn)代碼的相關資料,需要的朋友可以參考下2016-09-09
js日期相關函數(shù)dateAdd,dateDiff,dateFormat等介紹
這篇文章主要介紹了js日期相關函數(shù)dateAdd,dateDiff,dateFormat等介紹,需要的朋友可以參考下2016-09-09

