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

Vue3+Cropper.js扩展h5移动端双指旋转

新建useCropperTouch.js

// 导出一个函数,用于处理触摸事件,配合cropper.js
export function useCropperTouch(cropperRef) {// 定义是否正在触摸的变量let isTouching = false// 定义初始角度let startAngle = 0// 定义初始距离let startDistance = 0// 定义当前旋转角度let currentRotate = 0// 定义当前缩放比例let currentScale = 1// 处理触摸开始事件const handleTouchStart = (e) => {// 如果触摸点数为2且Cropper存在if (e.touches.length === 2 && cropperRef.value) {// 设置正在触摸isTouching = true// 获取两个触摸点const [touch1, touch2] = e.touches// 计算初始角度startAngle = Math.atan2(touch2.clientY - touch1.clientY, touch2.clientX - touch1.clientX)// 计算初始距离startDistance = Math.hypot(touch2.clientX - touch1.clientX, touch2.clientY - touch1.clientY)// 获取当前状态const data = cropperRef.value.getData()currentRotate = data.rotate || 0currentScale = data.scaleX || 1}}// 处理触摸移动事件const handleTouchMove = (e) => {// 如果正在触摸且触摸点数为2且Cropper存在if (isTouching && e.touches.length === 2 && cropperRef.value) {// 阻止默认事件e.preventDefault()// 获取两个触摸点const [touch1, touch2] = e.touches// 计算当前角度const currentAngle = Math.atan2(touch2.clientY - touch1.clientY,touch2.clientX - touch1.clientX)// 计算当前距离const currentDistance = Math.hypot(touch2.clientX - touch1.clientX,touch2.clientY - touch1.clientY)// 计算旋转角度变化const rotateDelta = (currentAngle - startAngle) * (180 / Math.PI)// 计算缩放比例变化const scaleDelta = currentDistance / startDistance// 直接应用到 CroppercropperRef.value.rotateTo(currentRotate + rotateDelta)cropperRef.value.scale(currentScale * scaleDelta)// 更新初始值startAngle = currentAnglestartDistance = currentDistancecurrentRotate += rotateDeltacurrentScale *= scaleDelta}}// 处理触摸结束事件const handleTouchEnd = () => {// 设置不再触摸isTouching = false}// 设置事件监听const setup = (element) => {if (!element) returnelement.addEventListener('touchstart', handleTouchStart)element.addEventListener('touchmove', handleTouchMove, { passive: false })element.addEventListener('touchend', handleTouchEnd)}// 移除事件监听const cleanup = (element) => {if (!element) returnelement.removeEventListener('touchstart', handleTouchStart)element.removeEventListener('touchmove', handleTouchMove)element.removeEventListener('touchend', handleTouchEnd)}// 在组件卸载前移除事件监听onBeforeUnmount(() => {if (cropperRef) {cleanup(cropperRef)}})// 返回设置和清理函数return { setup, cleanup }
}

使用:

import { useCropperTouch } from '@/components/useCropperTouch'const cropper = ref(null)
const { setup } = useCropperTouch(cropper)// 设置触摸事件,viewImgRef为触摸图片的ref
setup(viewImgRef.value.parentElement)

相关文章:

  • 25.6.17学习总结
  • java上传base64数据流的本地存储并返回给前端URL接口实现
  • Vue的路由配置我们平时需要去手动配置吗?还是说默认配置就可以了
  • Kafka 向 TDengine 写入数据
  • CSS3 渐变效果
  • Android及Harmonyos实现图片进度显示效果
  • 百度垂搜数据管理系统弹性调度优化实践
  • AI办公提效,Deepseek + wps生成ppt
  • 基于Java的Excel列数据提取工具实现
  • FastGPT、百度智能体、Coze与MaxKB四大智能体平台在政务场景下的深度对比
  • 【人工智能下的智算网络】广域网优化
  • 双token三验证(Refresh Token 机制​)
  • 冒泡排序C语言版
  • 极大补充ggplot2的统计分析能力
  • 使用WinUSB读写USB设备
  • 使用s3cmd 2.x 与 Cyberduck 管理在 DigitalOcean Spaces 对象存储中的数据
  • 跨语言RPC:使用Java客户端调用Go服务端的JSON-RPC服务
  • 性能测试|数据说话!在SimForge平台上用OpenRadioss进行汽车碰撞仿真,究竟多省时?
  • Leetcode-​713. 乘积小于 K 的子数组​
  • 45-Oracle 索引的新建与重建
  • 餐饮加盟培训网站建设/十种营销方式
  • 许昌做网站公司/营销技巧五步推销法
  • 莆田企业免费建站/广告公司名称
  • 网站设计与开发怎么做/花钱推广的网络平台
  • 网站模板能自己做吗/兰州模板网站seo价格
  • 网站开发合同的缺陷/济南网站制作平台