热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Vue多点触控手势:移动端多指操作详解

在移动端开发中,多点触控手势是提升用户体验的重要手段。然而,目前只有iOS浏览器原生支持手势事件,其他设备需要通过touchstart、touchmove和touchend等基础事件进行自定义实现。本文将详细介绍如何在Vue项目中实现多点触控手势。

在移动端开发中,多点触控手势是提升用户体验的关键。然而,目前只有iOS浏览器原生支持手势事件,其他设备需要通过touchstart、touchmove和touchend等基础事件进行自定义实现。本文将详细介绍如何在Vue项目中实现多点触控手势。

基础触摸事件

移动端的基础触摸事件包括:

  • touchstart:触摸开始
  • touchmove:触摸移动
  • touchend:触摸结束
  • touchcancel:触摸中断(如弹框打断)

示例代码:

box.addEventListener('touchmove', function(event) {
  console.log('触摸移动');
});

touchEvent 对象

touchEvent 对象包含以下属性:

  • touches:触发事件时屏幕上的触点个数
  • targetTouches:触发事件时事件元素上的触点个数
  • changedTouches:触发事件发生改变的触点个数
  • target:事件元素
  • stopPropagation():阻止事件冒泡
  • preventDefault():阻止默认行为

示例代码:

box.addEventListener('touchstart', function(event) {
  console.log(event.touches); // 一个手指触摸时输出 Touchlist{0: Touch, length: 1}
  var startX = event.touches[0].clientX; // 触点在视口上的位置
});

手势事件

iOS 的手势事件包括:

  • gesturestart:手势开始,屏幕上有两个或两个以上的手指
  • gesturechange:手势变化,屏幕上有两个或两个以上的手指位置在移动
  • gestureend:手势结束,屏幕上只剩下少于两个手指

新增的属性包括:

  • scale:触点的距离与初始距离的比例
  • rotation:触点的角度差与初始角度差的差

示例代码:

box.addEventListener('gesturechange', function(event) {
  box.innerHTML = 'rotation: ' + event.rotation + '
'; box.innerHTML += 'scale: ' + event.scale + '
'; });

自定义多点触控手势

为了在非iOS设备上实现多点触控手势,我们可以封装一个手势插件。以下是gestrue.js的实现:

(function(w) {
  /**
   * 用于给元素监听手势事件
   * @param node 要监听的元素
   * @param callback 对象,对象有三个函数 start、change、end
   */
  function gesture(node, callback) {
    // 手势开始
    node.addEventListener('touchstart', function(event) {
      if (event.touches.length >= 2) {
        node.isGestureStart = true;
        this.startDst = getDst(event.touches[0], event.touches[1]);
        this.startDeg = getDeg(event.touches[0], event.touches[1]);
        if (callback && typeof(callback['start']) === 'function') {
          callback['start']();
        }
      }
    });

    // 手势移动
    node.addEventListener('touchmove', function(event) {
      if (event.touches.length >= 2) {
        var currentDst = getDst(event.touches[0], event.touches[1]);
        var currentDeg = getDeg(event.touches[0], event.touches[1]);
        event.scale = currentDst / this.startDst;
        event.rotation = currentDeg - this.startDeg;
        if (callback && typeof(callback['change']) === 'function') {
          callback['change'](event);
        }
      }
    });

    // 手势结束
    node.addEventListener('touchend', function(event) {
      if (node.isGestureStart && event.touches.length <2) {
        node.isGestureStart = false;
        if (callback && typeof(callback['end']) === 'function') {
          callback['end']();
        }
      }
    });

    function getDst(touch1, touch2) {
      var x = touch2.clientX - touch1.clientX;
      var y = touch2.clientY - touch1.clientY;
      var z = Math.sqrt(x * x + y * y);
      return z;
    }

    function getDeg(touch1, touch2) {
      var x = touch2.clientX - touch1.clientX;
      var y = touch2.clientY - touch1.clientY;
      var angle = Math.atan2(y, x);
      var deg = angle / Math.PI * 180;
      return deg;
    }
  }

  w.gesture = gesture;
})(window);

使用案例:实现元素缩放及旋转

以下是一个简单的示例,展示如何使用上述手势插件实现元素的缩放和旋转。

* {
  margin: 0;
  padding: 0;
}
html, body, #app {
  width: 100%;
  height: 100%;
  overflow: hidden;
}
#box {
  position: absolute;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0;
  margin: auto;
  width: 150px;
  height: 150px;
  background-color: #f90;
}
(function() {
  var app = document.querySelector('#app');
  var box = document.querySelector('#box');

  app.addEventListener('touchstart', function(event) {
    event.preventDefault();
  });

  gesture(box, {
    start: function() {
      box.startScale = transformCss(box, 'scale') || 1;
      box.startRotate = transformCss(box, 'rotate') || 0;
    },
    change: function(event) {
      transformCss(box, 'scale', box.startScale * event.scale);
      transformCss(box, 'rotate', box.startRotate + event.rotation);
    }
  });
})();

注:本文中的transformCss函数用于设置CSS变换属性,具体实现请参考相关文档。

作者:捕猹少年闰土

若有任何问题或建议,请联系我,共同学习进步。


推荐阅读
  • 深入理解 Oracle 存储函数:计算员工年收入
    本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • CSS 布局:液态三栏混合宽度布局
    本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 本文介绍如何通过SQL查询从JDE(JD Edwards)系统中提取所有字典数据,涵盖关键表的关联和字段选择。具体包括F0004和F0005系列表的数据提取方法。 ... [详细]
  • 本文详细介绍了如何通过命令行启动MySQL服务,包括打开命令提示符窗口、进入MySQL的bin目录、输入正确的连接命令以及注意事项。文中还提供了更多相关命令的资源链接。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 高效解决应用崩溃问题!友盟新版错误分析工具全面升级
    友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ... [详细]
author-avatar
月星名店_882
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有