移動端事件(touchstart+touchmove+touchend)

来源:https://www.cnblogs.com/chenyingying0/archive/2020/03/15/12499268.html
-Advertisement-
Play Games

移動端事件有哪些: 觸摸事件 手勢事件 感測器事件 (後面兩個相容性不怎麼樣,因此重點就是觸摸事件) 觸摸事件: touch 事件 pointer 事件 (PC端可能會使用jQuery做動畫,移動端一般不會,基本都是使用css3做動畫) ontouchstart (必須在元素內部才能觸發) onto ...


移動端事件有哪些:

觸摸事件

手勢事件

感測器事件

(後面兩個相容性不怎麼樣,因此重點就是觸摸事件)

 

觸摸事件:

touch 事件

pointer 事件

(PC端可能會使用jQuery做動畫,移動端一般不會,基本都是使用css3做動畫)

 

ontouchstart (必須在元素內部才能觸發)

ontouchmove (元素內外都能觸發)

ontouchend (元素內外都能觸發)

ontouchcancel 觸摸中斷,多用於系統級處理,比如在觸摸時突然接了個電話(一般幾乎是用不上的)

 

推薦使用 addEventListener 來綁定事件,除非因為相容性原因使用 on

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>touch</title>
    <style>
        .box{
            width:200px;
            height:200px;
            background:pink;
            margin:20px auto;
        }
    </style>
</head>
<body>
    <div class="box" id="box">
    </div>

    <script>
        var box=document.getElementById("box");

        // box.ontouchstart=handleStart;
        // box.ontouchmove=handleMove;
        // box.ontouchend=handleEnd;

        box.addEventListener("touchstart",handleStart,false);
        box.addEventListener("touchmove",handleMove,false);
        box.addEventListener("touchend",handleEnd,false);

        function handleStart(){
            console.log("touchstart");
        }
        function handleMove(){
            console.log("touchmove");
        }
        function handleEnd(){
            console.log("touchend");
        }
    </script>
</body>
</html>

 

 

touch事件的event對象

比較重要的屬性

type: "touchstart"  觸發的事件

target: div#box.box 觸摸的元素

 

changedTouches: TouchList {0: Touch, length: 1}  發生變化的觸摸點

targetTouches: TouchList  目標元素上的觸摸點

touches: TouchList {0: Touch, length: 1}  所有觸摸點

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>touch</title>
    <style>
        .box{
            width:200px;
            height:200px;
            background:pink;
            margin:20px auto;
        }
    </style>
</head>
<body>
    <div class="box" id="box">
    </div>

    <script>
        var box=document.getElementById("box");

        // box.ontouchstart=handleStart;
        // box.ontouchmove=handleMove;
        // box.ontouchend=handleEnd;

        box.addEventListener("touchstart",handleStart,false);
        box.addEventListener("touchmove",handleMove,false);
        box.addEventListener("touchend",handleEnd,false);

        function handleStart(e){
            console.log("touchstart");
            console.log(e.changedTouches[0]);
        }
        function handleMove(e){
            console.log("touchmove");
            console.log(e);
        }
        function handleEnd(e){
            console.log("touchend");
            console.log(e);
        }
    </script>
</body>
</html>

 

clientX  clientY 指視口到觸摸點的距離(不包括滾動距離)

pageX  pageY 視口到觸摸點的距離(包括滾動距離)

 

單指拖拽案例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>touch</title>
    <style>
        .backtop{
            width:90px;
            height:90px;
            position: fixed;
            bottom:20px;
            right:20px;
            line-height:90px;
            text-align: center;
            background:rgba(0,0,0,.6);
            border-radius:50%;
            color:#fff;
            font-size:60px;
            -webkit-tap-highlight-color:transparent;
            /*transform:translate3d(x,y,0);在移動端使用會開啟GPU加速,會讓動畫性能變高*/
        }
    </style>
</head>
<body>
    <a href="#" id="backtop" class="backtop">&uarr;</a>

    <script>
        function drag(el,options){
            options.x=typeof options.x!=="undefined"?options.x:true;
            options.y=typeof options.y!=="undefined"?options.y:true;

            if(!options.x&&!options.y) return;

            var curPoint={
                x:0,
                y:0
            };
            var startPoint={};
            var isTouchMove=false;

            el.addEventListener("touchstart",handleStart,false);
            el.addEventListener("touchmove",handleMove,false);
            el.addEventListener("touchend",handleEnd,false);

            function handleStart(e){
                var touch=e.changedTouches[0];
                startPoint.x=touch.pageX;
                startPoint.y=touch.pageY;
            }
            function handleMove(e){
                e.preventDefault();//阻止預設行為(滾動條滾動)
                isTouchMove=true;

                var touch=e.changedTouches[0];
                var diffPoint={};//要移動的距離
                var movePoint={//移動之後的距離
                    x:0,
                    y:0
                };

                diffPoint.x=touch.pageX-startPoint.x;
                diffPoint.y=touch.pageY-startPoint.y;

                if(options.x){
                    movePoint.x=diffPoint.x+curPoint.x;//移動之後的距離=要移動的距離+當前距離
                }
                if(options.y){
                    movePoint.y=diffPoint.y+curPoint.y;
                }

                move(el,movePoint.x,movePoint.y);
            }
            function handleEnd(e){
                if(!isTouchMove) return;

                var touch=e.changedTouches[0];
                curPoint.x+=touch.pageX-startPoint.x;//更新當前位置
                curPoint.y+=touch.pageY-startPoint.y;

                isTouchMove=false;
            }
            function move(el,x,y){
                x=x||0;
                y=y||0;
                el.style.transform="translate3d("+x+"px,"+y+"px,0)";
            }
        }

        var backtop=document.getElementById("backtop");
        drag(backtop,{
            x:true,
            y:true
        });

    </script>
</body>
</html>

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 構建編譯項目 不需要安裝CMake,MinGW等額外工具。只需要Android NDK和OpenCV源碼 。 在WIN10上使用cmd視窗命令編譯OpenCV步驟,操作版本為4.0.1: 1. 在OpenCV根目錄下麵新建一個文件夾,比如叫做build_cmd。因為OpenCV要求 不和 是同一個文 ...
  • 常用的使用方式就不說了 說說VIEW的隱藏與顯示 1. 多狀態使用,判斷數字狀態 <data> <variable name="wrokItemBinding" type="XXXX" /></data> android:visibility="@{(wrokItemBinding.itemType ...
  • 一、正方體 核心要點就是:使用3D轉換模塊,以及平移、旋轉的在X、Y、Z軸上的應用 <style> *{ margin:0; padding:0; } ul{ width: 200px; height: 200px; border: 1px solid black; box-sizing:borde ...
  • 效果圖 index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1,maximu ...
  • BOM解讀 BOM概念 - browser object model:瀏覽器對象模型 bom相當於提供了一套操作瀏覽器的方法。(windw是頂級對象) BOM的操作方法:(這裡只列舉比較常用) navigator: (包含有瀏覽器的信息) //以前用來相容,目前沒多大用處,瞭解即可 appName ...
  • DOM解讀 DOM概念 - document object model:文檔對象模型 操作文檔的一套方法,document是一個對象,是dom的頂級對象,屬於window的一個對象,並且可以說是最出色的一個兒子。 DOM元素的獲取: document.getElementById("id名字") / ...
  • 通過對touch的基礎事件的封裝,可以完成高級事件 hammer.js http://hammerjs.github.io/ 方便使用移動端高級事件 (而且相容性很好) 中文文檔 https://www.cnblogs.com/qianduanjingying/p/5812139.html swip ...
  • export 與 import的複合寫法 模塊的繼承 跨模塊常量 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...