vue中实现 图片的放大缩小和拖拽

html

<template>
  <div v-if="popupVisible" class="image-back" @mousewheel.prevent="gunLun">
    <div :style="imageItemToDisplay.data" class="image-inner" ref="imgWrap">
      <i class="iconfont icon-cha11" @click="closeImage"></i>
      <img 
	      :src="imageItemToDisplay.url" 
	      class="photo-popup-image" 
	      id="oImage" 
	      ref="image" alt="" 
	      @mousedown.prevent="moveImg">
    </div>
  </div>
</template>
<script>
import {defineComponent, onMounted, reactive, ref} from 'vue';
export default defineComponent({
  setup() {
   const imageItemToDisplay = reactive({
      url: '',
      delta: 1,
      data: ''
    })
    const image = ref(null)
    const imgWrap = ref(null)
    // 图片缩放
    const gunLun = (e) => {
      imageItemToDisplay.delta += e.wheelDelta / 1200;
      if (imageItemToDisplay.delta > 0.1 && imageItemToDisplay.delta < 2.0) {
        imageItemToDisplay.data = `transform:scale(${imageItemToDisplay.delta});`
      }
    }
    // 拖拽图片
    const moveImg = (e) => {
      let wrap = imgWrap.value
      let img = image.value
      let x = e.pageX - img.offsetLeft
      let y = e.pageY - img.offsetTop
      // 添加鼠标移动事件
      wrap.addEventListener('mousemove', move)
      function move(e) {
        wrap.style.left = e.pageX - x + 'px'
        wrap.style.top = e.pageY - y + 'px'
      }
      // 添加鼠标抬起事件,鼠标抬起,将事件移除
      img.addEventListener('mouseup', () => {
        wrap.removeEventListener('mousemove', move)
      })
      // 鼠标离开父级元素,把事件移除
      wrap.addEventListener('mouseout', () => {
        wrap.removeEventListener('mousemove', move)
      })
    }
     return {
     	imageItemToDisplay,image,imgWrap,gunLun,moveImg
     }
  }
})

备注:部分借鉴https://cloud.tencent.com/developer/article/1926281

Vue3实现移动端的图片双指控制放大缩小拖动,可以利用Vue官方提供的指令v-touch,结合自定义指令和事件处理进行实现。 首先,在需要实现双指控制的图片元素上,使用v-touch指令绑定一个Touch事件。 ```html <template> <div> <img src="imageSrc" v-touch="handleTouch"> </div> </template> ``` 然后,在Vue的setup函数,定义handleTouch方法来处理触摸事件。可以通过event.touches获取触摸点信息,并根据触摸点的个数来判断是拖动还是放大缩小操作。 ```javascript <script> import { ref } from 'vue'; export default { setup() { const imageSrc = ref('path/to/image'); const handleTouch = (event) => { const touches = event.touches; if (touches.length === 2) { // 双指操作:放大缩小 // 获取两个触摸点的距离 const distance = Math.hypot(touches[0].clientX - touches[1].clientX, touches[0].clientY - touches[1].clientY); // 根据距离放大缩小图片 zoomImage(distance); } else if (touches.length === 1) { // 单指操作:拖动 // 记录当前触摸点的坐标 const touch = touches[0]; const startX = touch.clientX; const startY = touch.clientY; // 监听触摸点的移动 document.addEventListener('touchmove', handleMove); // 监听触摸点的离开 document.addEventListener('touchend', handleEnd); // 处理移动事件 function handleMove(event) { event.preventDefault(); // 计算偏移量 const offsetX = event.touches[0].clientX - startX; const offsetY = event.touches[0].clientY - startY; // 根据偏移量拖动图片 dragImage(offsetX, offsetY); } // 处理离开事件 function handleEnd() { // 移除事件监听 document.removeEventListener('touchmove', handleMove); document.removeEventListener('touchend', handleEnd); } } }; // 放大缩小图片 const zoomImage = (distance) => { // 实现放大缩小操作 }; // 拖动图片 const dragImage = (offsetX, offsetY) => { // 实现拖动操作 }; return { imageSrc, handleTouch, zoomImage, dragImage }; } }; </script> ``` 在zoomImage和dragImage方法,根据传入的参数来实现图片放大缩小拖动操作。具体实现方式可以根据项目需求选择。 需要注意的是,由于涉及到与DOM直接交互,所以在Vue3的Composition API,需要使用document.addEventListener和document.removeEventListener来监听和移除事件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值