当前位置: 首页 > article >正文

前端页面手机端触摸屏操作

在这里插入图片描述

今天让我们了解一下前端手机端触摸屏的一些操作!

在前端页面实现手机端触摸屏操作通常可以通过以下几种方式:

一、触摸事件

  1. touchstart:当手指触摸屏幕时触发。
  2. touchmove:当手指在屏幕上移动时触发。
  3. touchend:当手指从屏幕上抬起时触发。
  4. touchcancel:当触摸操作被意外中断时触发,例如系统弹窗出现。

例如:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>

<body>
  <div id="touchableDiv">触摸区域</div>

  <script>
    const touchableDiv = document.getElementById('touchableDiv');

    touchableDiv.addEventListener('touchstart', (event) => {
      console.log('触摸开始');
    });

    touchableDiv.addEventListener('touchmove', (event) => {
      console.log('触摸移动');
    });

    touchableDiv.addEventListener('touchend', (event) => {
      console.log('触摸结束');
    });
  </script>
</body>

</html>

二、使用 Hammer.js 库

Hammer.js 是一个强大的触摸手势识别库,可以轻松实现各种触摸手势,如点击、滑动、缩放等。

  1. 首先引入 Hammer.js:

    <script src="https://cdnjs.cloudflare.com/ajax/libs/hammer.js/2.0.8/hammer.min.js"></script>
    
  2. 然后使用它:

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    
    <body>
      <div id="gestureDiv">手势区域</div>
    
      <script src="https://cdnjs.cloudflare.com/ajax/libs/hammer.js/2.0.8/hammer.min.js"></script>
      <script>
        const gestureDiv = document.getElementById('gestureDiv');
        const hammertime = new Hammer(gestureDiv);
    
        hammertime.on('tap', (event) => {
          console.log('点击');
        });
    
        hammertime.on('swipe', (event) => {
          console.log('滑动');
        });
      </script>
    </body>
    
    </html>
    

三、响应式设计

确保你的页面在不同尺寸的手机屏幕上都能良好显示和响应触摸操作。可以使用 CSS 媒体查询和弹性布局来实现响应式设计。

例如:

/* 当屏幕宽度小于等于 768px 时应用这些样式 */
@media screen and (max-width: 768px) {
 .responsive-element {
    font-size: 14px;
    padding: 10px;
  }
}

如何在前端页面中添加触摸事件监听器?

  1. 原生JavaScript方式
    • 添加touchstart监听器(触摸开始事件)
      • 首先,需要获取要添加触摸事件的HTML元素。可以使用document.getElementByIddocument.getElementsByClassName或者document.querySelectorAll等方法来获取元素。例如,要获取一个idmyElement的元素:
        const myElement = document.getElementById('myElement');
        
      • 然后,使用addEventListener方法为该元素添加touchstart事件监听器。当手指触摸到该元素时,事件处理函数将会被调用。
        myElement.addEventListener('touchstart', function (event) {
          // 在这里编写触摸开始时要执行的代码
          console.log('触摸开始');
        });
        
    • 添加touchmove监听器(触摸移动事件)
      • 同样先获取元素,再添加监听器。
        const myElement = document.getElementById('myElement');
        myElement.addEventListener('touchmove', function (event) {
          // 处理触摸移动的逻辑,例如跟踪手指移动的位置
          event.preventDefault();// 阻止默认的滚动行为等
          let touch = event.touches[0];
          console.log('触摸点的X坐标:', touch.clientX);
          console.log('触摸点的Y坐标:', touch.clientY);
        });
        
    • 添加touchend监听器(触摸结束事件)
      • 按照前面的步骤获取元素后添加监听器。
        const myElement = document.getElementById('myElement');
        myElement.addEventListener('touchend', function (event) {
          // 在这里编写触摸结束时要执行的代码
          console.log('触摸结束');
        });
        
  2. 使用jQuery方式(如果项目中使用了jQuery)
    • jQuery提供了更简洁的方法来添加事件监听器。首先确保已经引入了jQuery库。
    • 添加touchstart事件
      $('#myElement').on('touchstart', function (event) {
        console.log('触摸开始');
      });
      
    • 添加touchmove事件
      $('#myElement').on('touchmove', function (event) {
        event.preventDefault();
        let touch = event.originalEvent.touches[0];
        console.log('触摸点的X坐标:', touch.clientX);
        console.log('触摸点的Y坐标:', touch.clientY);
      });
      
    • 添加touchend事件
      $('#myElement').on('touchend', function (event) {
        console.log('触摸结束');
      });
      
  3. 结合框架(以Vue.js为例)
    • 在Vue.js组件中,可以在模板部分绑定触摸事件。
    • 在模板中绑定触摸事件
      <template>
        <div @touchstart="onTouchStart" @touchmove="onTouchMove" @touchend="onTouchEnd">
          触摸区域
        </div>
      </template>
      
    • 在脚本部分定义事件处理方法
      export default {
        methods: {
          onTouchStart (event) {
            console.log('触摸开始');
          },
          onTouchMove (event) {
            event.preventDefault();
            let touch = event.touches[0];
            console.log('触摸点的X坐标:', touch.clientX);
            console.log('触摸点的Y坐标:', touch.clientY);
          },
          onTouchEnd (event) {
            console.log('触摸结束');
          }
        }
      };
      

如何处理手机端触摸屏操作中的手势识别?

  1. 使用原生JavaScript
    • 单点触控手势(如点击、长按)
      • 点击(Tap)
        • 可以通过touchstarttouchend事件组合来模拟点击手势。在touchstart事件触发后,检查在短时间内(通常小于300毫秒)是否触发了touchend事件,并且触摸点位置没有明显移动。
        • 示例代码如下:
          let startTime;
          let startX, startY;
          const element = document.getElementById('your-element');
          element.addEventListener('touchstart', function (event) {
            startTime = new Date().getTime();
            startX = event.touches[0].clientX;
            startY = event.touches[0].clientY;
          });
          element.addEventListener('touchend', function (event) {
            const endTime = new Date().getTime();
            const duration = endTime - startTime;
            const endX = event.changedTouches[0].clientX;
            const endY = event.changedTouches[0].clientY;
            const movementThreshold = 10; // 定义移动阈值
            if (duration < 300 && Math.abs(endX - startX) < movementThreshold && Math.abs(endY - startY) < movementThreshold) {
              console.log('点击手势');
            }
          });
          
      • 长按(Long - Press)
        • 结合touchstartsetTimeout来实现。当touchstart事件触发后,设置一个定时器,等待一段时间(例如500毫秒)。如果在定时器触发之前没有触发touchend事件,就认为是长按手势。
        • 示例代码如下:
          let longPressTimer;
          const element = document.getElementById('your - element');
          element.addEventListener('touchstart', function (event) {
            longPressTimer = setTimeout(function () {
              console.log('长按手势');
            }, 500);
          });
          element.addEventListener('touchend', function (event) {
            clearTimeout(longPressTimer);
          });
          
    • 多点触控手势(如缩放、旋转、双指点击)
      • 缩放(Pinch)
        • 需要同时处理多个触摸点的变化。通过比较touchstarttouchmove事件中两个触摸点之间的距离变化来判断是否是缩放手势。
        • 示例代码如下:
          let startDistance;
          const element = document.getElementById('your - element');
          element.addEventListener('touchstart', function (event) {
            if (event.touches.length === 2) {
              const touch1 = event.touches[0];
              const touch2 = event.touches[1];
              startDistance = Math.sqrt(Math.pow(touch2.clientX - touch1.clientX, 2) + Math.pow(touch2.clientY - touch1.clientY, 2));
            }
          });
          element.addEventListener('touchmove', function (event) {
            if (event.touches.length === 2) {
              const touch1 = event.touches[0];
              const touch2 = event.touches[1];
              const currentDistance = Math.sqrt(Math.pow(touch2.clientX - touch1.clientX, 2) + Math.pow(touch2.clientY - touch1.clientY, 2));
              const scaleFactor = currentDistance / startDistance;
              console.log('缩放比例:', scaleFactor);
            }
          });
          
      • 旋转(Rotate)
        • 对于旋转手势,除了计算两点之间的距离,还需要考虑两点连线与水平方向的夹角变化。通常会用到三角函数来计算角度变化。
        • 示例代码如下:
          let startAngle;
          const element = document.getElementById('your - element');
          element.addEventListener('touchstart', function (event) {
            if (event.touches.length === 2) {
              const touch1 = event.touches[0];
              const touch2 = event.touches[1];
              const dx = touch2.clientX - touch1.clientX;
              const dy = touch2.clientY - touch1.clientY;
              startAngle = Math.atan2(dy, dx);
            }
          });
          element.addEventListener('touchmove', function (event) {
            if (event.touches.length === 2) {
              const touch1 = event.touches[0];
              const touch2 = event.touches[1];
              const dx = touch2.clientX - touch1.clientX;
              const dy = touch2.clientY - touch1.clientY;
              const currentAngle = Math.atan2(dy, dx);
              const angleDiff = currentAngle - startAngle;
              console.log('旋转角度:', angleDiff);
            }
          });
          
      • 双指点击(Double - Tap)
        • 记录每次点击的时间和位置,当两次点击在短时间内(例如300毫秒)且位置相近发生时,判断为双指点击。
        • 示例代码如下:
          let firstTapTime;
          let firstTapX, firstTapY;
          const element = document.getElementById('your - element');
          element.addEventListener('touchstart', function (event) {
            if (event.touches.length === 1) {
              const currentTime = new Date().getTime();
              const touch = event.touches[0];
              if (firstTapTime && currentTime - firstTapTime < 300 && Math.abs(touch.clientX - firstTapX) < 10 && Math.abs(touch.clientY - firstTapY) < 10) {
                console.log('双指点击');
              } else {
                firstTapTime = currentTime;
                firstTapX = touch.clientX;
                firstTapY = touch.clientY;
              }
            }
          });
          
  2. 使用第三方库(如Hammer.js)
    • 安装与引入
      • 使用包管理器(如npm)安装Hammer.jsnpm install hammerjs。或者通过CDN引入,例如<script src="https://cdnjs.cloudflare.com/ajax/libs/hammerjs/2.0.8/hammer.min.js"></script>
    • 基本使用
      • 创建一个Hammer实例并绑定到目标元素上,然后定义各种手势的处理函数。
      • 示例代码如下:
        const element = document.getElementById('your - element');
        const hammertime = new Hammer(element);
        hammertime.on('tap', function (event) {
          console.log('点击手势');
        });
        hammertime.on('press', function (event) {
          console.log('长按手势');
        });
        hammertime.on('pinch', function (event) {
          console.log('缩放手势,缩放比例:', event.scale);
        });
        hammertime.on('rotate', function (event) {
          console.log('旋转手势,旋转角度:', event.rotation);
        });
        hammertime.on('doubletap', function (event) {
          console.log('双指点击');
        });
        

http://www.kler.cn/news/367275.html

相关文章:

  • 【我的 PWN 学习手札】setcontext + shellcode
  • JSON.stringify用法
  • 【大数据学习 | kafka】kafuka的基础架构
  • 2024数学分析【南昌大学】
  • logback日志脱敏后异步写入文件
  • OpenCV视觉分析之目标跟踪(1)计算密集光流的类DISOpticalFlow的介绍
  • 【C/C++ explicit关键字】为什么有了explicit关键字的构造函数 就不能再有 其无参构造函数
  • 神经架构搜索:自动化设计神经网络的方法
  • Mysql5.7变为GreatSQL 8.0.32-25过程中,SQL语句报错及解决方案
  • 原生页面引入Webpack打包JS
  • uniApp 加载google地图 并规划路线
  • 仕考网:25年初级会计师备考建议
  • 十分钟了解Android Handler、Looper、Message
  • Java虚拟机:JVM介绍
  • 微服务与多租户详解:架构设计与实现
  • Spring微服务学习笔记之Spring Cloud Alibaba远程服务调用实战
  • 基于SSM的儿童教育网站【附源码】
  • 【华为HCIP实战课程二十三】中间到中间系统协议IS-IS原理与配置详解,网络工程师
  • 霜降时节,网络防护也需“御寒”
  • 【LeetCode:43. 字符串相乘 + 模拟】
  • 408算法题leetcode--第38天
  • Promise、async、await 、异步生成器的错误处理方案
  • 挂耳式耳机品牌排行榜前十名有哪些?平价开放式耳机品牌推荐!
  • 【CSS3】css开篇基础(5)
  • 今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 10月27日,星期日
  • Vuejs设计与实现 — 同构渲染