Magren

Magren

Idealist & Garbage maker 🛸
twitter
jike

Vue下监听页面滚动以及移动端触摸事件 Vueでスクロールイベントとモバイルタッチイベントを監視する

無聊な知識のブラシング中に、フロントエンドデザインの宝庫ウェブサイトawwwardsを見つけました。そこで、そのサイトを実装したエキスパートたちに感嘆しましたが、同時に自分も試してみたくなりました。もし実装できたらどうなるかな。

そこで、Rally さんが書いたGlobeKitを見つけました。スクロールイベントを監視してスタイルを切り替える方法のようですので、スクロールイベントをどのように監視するかを調べました。

PC デスクトップのマウススクロールの監視#

監視#

異なるブラウザに基づいて、mounted 内でページにスクロールイベントを追加します。scrollFun はスクロール時に実行されるメソッドです。

// ブラウザの互換性
if ((navigator.userAgent.toLowerCase().indexOf("firefox") != -1)) {
    document.addEventListener("DOMMouseScroll", this.scrollFun, false)
} else if (document.addEventListener) {
    document.addEventListener("mousewheel", this.scrollFun, false)
}

スクロールイベントの情報の取得#

渡されたイベントオブジェクトを使用して、スクロールのプロパティを取得します。

// ページめくり
scrollFun(event: any) {
    // mousewheelイベントの "event.wheelDelta" プロパティの値:正の値の場合、マウスホイールが上にスクロールしていることを示す
    // DOMMouseScrollイベントの "event.detail" プロパティの値:負の値の場合、マウスホイールが上にスクロールしていることを示す
    const delta = event.detail || (-event.wheelDelta);
    if (delta > 0 ) {
        // 下にスクロール
        console.log("下にスクロール")
    } else if (delta < 0) {
        // 上にスクロール
        console.log("上にスクロール")
    }
}

モバイルデバイスのタッチイベント#

モバイルデバイスでは、上記の方法では上下スクロールを監視することができません。それはおそらくスマートフォンにはマウスがないためです。
私が望む効果を実現するために、スクロールバーを非表示にし、タッチイベントを監視してユーザーの上下スワイプ操作を判断します。

  • touchstart イベント:指が画面に触れたときに発生します。既に指が画面にある場合でも発生します。
  • touchmove イベント:指が画面上を連続してスライドすると発生します。このイベントが発生している間、preventDefault () を呼び出すことでスクロールを防止できます。
  • touchend イベント:指が画面から離れたときに発生します。

イベントの追加#

ダブルクォーテーション内には呼び出されるメソッドがあります。

<div id="main" @touchstart="touchstart($event)" @touchend="touchend($event)">

情報の取得#

渡された $event オブジェクトを使用して、タッチイベントの情報を取得します。
例:

touchstart(e: any): void{
    this.startY = e.touches[0].pageY // タッチポイントのY座標を取得
}
touchend(e: any): void{
    const moveEndY = e.changedTouches[0].pageY // 手を離したときのY座標を取得
    ......
}

これにより、2 つの座標の差を取ることで、ユーザーの上下スワイプを判断できます。

渡されたオブジェクトには、タッチを追跡するための 3 つのプロパティが含まれています:

  • touches:現在追跡しているタッチ操作の touch オブジェクトの配列です。
  • targetTouches:イベントターゲットに特定の Touch オブジェクトの配列です。
  • changeTouches:前回のタッチ以降に何が変更されたかを示す Touch オブジェクトの配列です。
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。