溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JS如何實(shí)現(xiàn)觸摸滑動(dòng)監(jiān)聽事件

發(fā)布時(shí)間:2021-06-15 14:46:30 來源:億速云 閱讀:614 作者:chen 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“JS如何實(shí)現(xiàn)觸摸滑動(dòng)監(jiān)聽事件”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“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)的效果貼出來:

JS如何實(shí)現(xiàn)觸摸滑動(dòng)監(jiā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)識觸摸的唯一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)行一下看看吧:

JS如何實(shí)現(xiàn)觸摸滑動(dòng)監(jiān)聽事件

可以看出,觸摸時(shí)間大于500ms不會(huì)觸發(fā),滑動(dòng)距離小于40也不會(huì)觸發(fā),如果是有角度的滑動(dòng),則會(huì)以XY軸移動(dòng)距離最遠(yuǎn)的為準(zhǔn)。完美實(shí)現(xiàn)!

到此,相信大家對“JS如何實(shí)現(xiàn)觸摸滑動(dòng)監(jiān)聽事件”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

js
AI