ネイティブ JS を使用してタッチスライド監視イベントを実装する方法

ネイティブ JS を使用してタッチスライド監視イベントを実装する方法

序文

今日はちょっとしたデモを書きました。左右にスワイプするロジックに関わる部分があります。当初はプラグインを使いたかったのですが、長い間ネイティブ JS を使ってスライディング モニタリングを書いていなかったことを思い出し、ネイティブ JS で実装してみました。結局、古いものを復習することで新しいことを学ぶことができ、同時に記録を残すこともできます。まず達成した効果を投稿します:

概念

スムーズなタッチ スライド イベント リスナーを作成するには、次の 3 つのロジックの側面を考慮する必要があります。

  • 距離: スライド距離は40以上である必要があります
  • 時間: スライド時間は 0.5 秒未満、つまり、指を押してドラッグし、500 ミリ秒以内に離します (画面に触れるだけでトリガーされないようにする)
  • スライド方向:
    • 左右にスライドする条件は、X 軸の移動距離が Y 軸の移動距離より大きいことです。正の場合は左に移動し、負の場合は右に移動します。
    • 上下にスライドする条件は、Y軸の移動距離がX軸の移動距離より大きいことです。正であれば上に移動し、負であれば下に移動します。

基本的な考え方があれば、この考え方に従ってコードを完成させることができます〜

リスニングイベント

タッチスライドを監視する場合、次の 3 つのタッチ イベントが自然に使用されます。

1. タッチスタート 指で画面をクリックしたときにトリガーされるタッチスタート(マルチタッチを監視でき、次の指もトリガーされます)

2. タッチムーブ スライドすると接触点が変化し、継続的にトリガーされます

3. touchend 指が画面から離れるとタッチが終了します

これら 3 つのタッチ イベントにはそれぞれ 3 つのタッチ オブジェクト リストが含まれます (タッチ ポイントに基づいてマルチタッチを実装できます)。

1. タッチ: 現在の画面上のすべての指のタッチポイントのリスト

2. targetTouches: 現在のDOM要素上の指のリスト

3. changedTouches: 現在のイベントの指のリスト

同時に、各タッチ オブジェクト Touch には次のプロパティが含まれます。

- 識別子: タッチを識別する一意のID

- pageX: ページ上のタッチポイントのX座標

- pageY: ページ上のタッチポイントのy座標

- screenX: 画面上のタッチポイントのX座標

- screenY: 画面上のタッチポイントのy座標

- clientX: ビューポート内のタッチポイントのX座標

- clientY: ビューポート内のタッチポイントのy座標

- ターゲット: タッチされたDOMノード

コードの実装

上記のアイデアとタッチイベントの基礎があれば、簡単にコードを書くことができます〜

let box = document.querySelector('body') // リスナー オブジェクト 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 = 新しいDate().getTime()
    開始距離X = e.touches[0].screenX
    開始距離Y = e.touches[0].screenY
})
box.addEventListener("touchend", (e) => {
    endTime = 新しいDate().getTime()
    終了距離X = e.changedTouches[0].screenX
    終了距離Y = e.changedTouches[0].screenY
    移動時間 = 終了時間 - 開始時間
    移動距離X = 開始距離X - 終了距離X
    移動距離Y = 開始距離Y - 終了距離Y
    console.log(移動距離X、移動距離Y)
    // スライド距離が 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 ? 'left' : 'right')
        } それ以外 {
        // 上下 console.log(moveDistanceY > 0 ? 'up' : 'down')
        }
    }
})

実行して確認してみましょう:

タッチ時間は 500 ミリ秒を超えるとトリガーされず、スライド距離は 40 未満の場合はトリガーされないことがわかります。角度付きスライドの場合は、XY 軸上の最長移動距離が優先されます。完璧に達成しました!

追記

フロントエンドフレームワークは急速に発展しており、多くの人はフレームワークを直接学習するプレッシャーがないため、ネイティブ JS の学習にあまり注意を払っていません。しかし、物事がどのように変化しても、本質は変わりません。フレームワークの利点は、その設計アイデアとパターンにあります。深く理解したいのであれば、やはりネイティブ JS を基礎として持つ必要があります。さらに先へ進みたいのであれば、やはりしっかりとした基礎を築く必要があります。結局のところ、高い建物は地面から始まりますよね?

ネイティブ JS を使用してタッチ スライド監視イベントを実装する方法についての記事はこれで終わりです。より関連性の高い JS タッチ スライド監視イベント コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JavaScript WebAPI、DOM、イベント、操作要素例の詳しい説明
  • JavaScript におけるイベント バブリング メカニズムの詳細な分析
  • jsのイベントループ機構の解析
  • JSブラウザイベントモデルの詳細な説明
  • JS と Nodejs におけるイベント駆動型開発についての簡単な説明
  • Vue.js フロントエンドフレームワークにおけるイベント処理の概要
  • 一般的なイベントを処理するための JavaScript の使用に関する詳細な説明
  • JavaScript イベント ループのケース スタディ

<<:  Linux の sudo 脆弱性により不正な特権アクセスが発生する可能性がある

>>:  MySQLの水平および垂直テーブルパーティションの説明

推薦する

Ubuntu 18.04 に Anaconda3 をインストールするための詳細なチュートリアル

Anaconda は、conda、Python、およびそれらの依存関係など、180 を超える科学パッ...

JS ES の新機能、変数分離割り当て

目次1. 配列の分離割り当て1.1 配列分離割り当てとは何ですか? 1.2 配列分離割り当てに失敗し...

tomcat ログ ディレクトリ内のログ ファイルの分析 (概要)

tomcat が起動されるたびに、次のログ ファイルがログ ディレクトリに自動的に生成され、日付順...

js オプション連鎖演算子の使用

序文オプションの連鎖演算子 (?.) を使用すると、チェーン内の各参照が有効であることを明示的に検証...

MySQL Workbenchのダウンロードと使用方法のチュートリアルの詳細な説明

1. MySQL WorkbenchをダウンロードするWorkbench は、MySQL のグラフィ...

MySQL が起動直後にシャットダウンする問題 (ibdata1 ファイルの破損が原因) に対する完璧な解決策

コンピュータ ルームのサーバー上の mysql がしばらく実行されていたのですが、突然、再起動しても...

HTMLはフォームタグを使用して登録ページのサンプルコードを実装します。

ケースの説明: - ページ効果を実現するためにテーブルを使用する- ハイパーリンクを機能させたくない...

JavaScript で最も高速なループはどれですか?

どの for ループまたは反復子がニーズに適しているかを知ることで、アプリケーションのパフォーマンス...

JavaScript初心者がよく犯す間違い

目次序文undefined と null の混同紛らわしい数値の加算と文字列の連結戻り文の改行の問題...

HTML の左右レイアウトのサンプルコード

CS: ...コードをコピーコードは次のとおりです。 html,body{ margin:0px; ...

太陽系の惑星のアニメーション効果を実現するHTML+CSS3コード

太陽系の 8 つの惑星(衛星を除く)のアニメーションを作成します。すべての惑星は太陽の周りを回ってい...

Zabbix 監視 Docker アプリケーション構成

コンテナの応用はますます一般的になっていますが、大量のコンテナをどのように管理すればよいのでしょうか...

トークンの有効期限が切れたときにページを更新するときに繰り返しプロンプトが表示されないようにする Vue について

トークンの有効期限が切れたら、ページを更新します。ページの読み込み時にバックエンドに複数のリクエスト...

Postman に基づく HTTP インターフェース テスト プロセスの分析

偶然、素晴らしい人工知能のチュートリアルを発見したので、みんなと共有せずにはいられませんでした。この...

Docker で Nginx イメージ サーバーを構築する方法

序文一般的な開発では、画像をディレクトリにアップロードし、ディレクトリとファイル名を連結してデータベ...