Vue中实现滚轮滑动放大图片并可进行拖动(封装好的组件,可直接使用)

文章详细描述了如何在Vue应用中,通过自定义组件ImageViewr实现图片的拖动、缩放功能,包括使用ref、props以及相关事件处理方法。
摘要由CSDN通过智能技术生成

 效果图

DEMO

组件(子组件改为自己的路径和名称)

<template>
    <div class="box">
      <ImageViewr ref="ImageViewrRef" :imageUrl="url" />
      <button @click="reset">重置</button>
    </div>
</template>
<script>
import ImageViewr from './components/ImageViewr.vue'
export default {
    data() {
        return {
            url:'https://yaoliangliang-oss.oss-cn-beijing.aliyuncs.com/efa6c859-83cd-4749-89e3-667bbcebbd03.jpg'
        }
    },
    methods: {
      reset(){
          this.$refs.ImageViewrRef.resetImage();
      }
    },
    components:{ImageViewr,},
    computed:{},
    watch:{},
    created() {},
}
</script>
<style lang="scss" scoped>
.box{
  width: 500px;
  height: 400px;
  border: 1px solid red;
}
button{
  position: absolute;
  top: 320px;
}
</style>

子组件 

<template>
  <div class="imageView" @mousedown="onMouseDown" @mousemove="onMouseMove" @mouseleave="onMouseUp" @mouseup="onMouseUp">
    <img :src="imageUrl" ref="image" @wheel="onWheel">
  </div>
</template>

<script>
export default {
  props: {
    imageUrl: {
      type: String,
      require: true,
    },
  },
  data() {
    return {
      currentScale: 1,// 当前缩放比例
      isDragging: false,// 是否正在拖拽图片
      startX: 0, // 拖拽起始点x坐标
      startY: 0, // 拖拽起始点y坐标
      translateX: 0, // 图片平移x方向距离
      translateY: 0, // 图片平移y方向距离
      dragSpeed: 0.3,// 拖拽速度
      zoomSpeed: 0.1, //控制缩放速度
      maxScale: 5, //最大缩放值
      minScale: 0.1, //最小缩放值
    };
  },
  methods: {
    // 鼠标按下事件处理函数
    onMouseDown(e) {
      e.preventDefault();
      this.isDragging = true;
      this.startX = e.clientX;
      this.startY = e.clientY;
      this.$refs.image.style.cursor = "grabbing";
    },
    // 鼠标移动事件处理函数
    onMouseMove(e) {
      if (!this.isDragging) return;
      const deltaX = (e.clientX - this.startX) * this.dragSpeed;
      const deltaY = (e.clientY - this.startY) * this.dragSpeed;
      this.translateX += deltaX;
      this.translateY += deltaY;
      this.$refs.image.style.transform = `scale(${this.currentScale}) translate(${this.translateX}px, ${this.translateY}px)`;
      this.startX = e.clientX;
      this.startY = e.clientY;
    },
    // 鼠标松开事件处理函数
    onMouseUp() {
      this.isDragging = false;
      this.$refs.image.style.cursor = "grab";
    },
    // 鼠标滚轮事件处理函数
    onWheel(e) {
      e.preventDefault();
      const delta = e.deltaY > 0 ? -1 : 1;
      this.currentScale = Math.min(this.maxScale, Math.max(this.minScale, this.currentScale + delta * this.zoomSpeed));
      this.$refs.image.style.transform = `scale(${this.currentScale}) translate(${this.translateX}px, ${this.translateY}px)`;
    },
    // 重置图片缩放和移动
    resetImage() {
      this.currentScale = 1;
      this.translateX = 0;
      this.translateY = 0;
      this.$refs.image.style.transform = "scale(1) translate(0, 0)";
    },

  },
};
</script>

<style lang="scss" scoped>
.imageView {
  width: 100%;
  height: 100%;
  overflow: hidden;
}

.imageView .elImageclass {
  width: 100%;
  height: 100%;
  touch-action: none;
  user-drag: none;
  -webkit-user-drag: none;
}

img {
  width: 100%;
  height: 100%;
  cursor: grab;
  object-fit: contain !important;
}
</style>

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好,针对您的问题,我可以回答。 Vue.js 提供了一个指令系统,使开发人员可以在模板声明式地绑定 DOM 属性和事件。使用 Vue.js 自定义指令可以很方便地扩展 Vue.js 应用的功能。在 Vue.js 实现图片拖拽功能可以通过自定义指令来完成。 以下是一个简单的 Vue.js 图片拖拽指令示例: ```javascript Vue.directive('drag', { bind: function(el, binding) { var startX, startY, initialMouseX, initialMouseY; function onMouseDown(event) { startX = el.offsetLeft; startY = el.offsetTop; initialMouseX = event.clientX; initialMouseY = event.clientY; document.addEventListener('mousemove', onMouseMove); document.addEventListener('mouseup', onMouseUp); } function onMouseMove(event) { var deltaX = event.clientX - initialMouseX; var deltaY = event.clientY - initialMouseY; el.style.left = startX + deltaX + 'px'; el.style.top = startY + deltaY + 'px'; } function onMouseUp() { document.removeEventListener('mousemove', onMouseMove); document.removeEventListener('mouseup', onMouseUp); } el.addEventListener('mousedown', onMouseDown); } }); ``` 在这个例子,我们创建了一个名为 `drag` 的自定义指令。当绑定到一个元素上时,这个元素将具备拖拽的功能。当用户按下鼠标左键时,`onMouseDown` 函数会被触发,记录下当前元素的位置和鼠标的位置。接下来,当用户拖拽鼠标时,`onMouseMove` 函数会被触发,计算出鼠标的偏移量,并更新元素的位置。当用户释放鼠标时,`onMouseUp` 函数会被触发,取消鼠标移动事件的监听。 我们可以在模板使用这个指令: ```html <div v-drag style="position: absolute; left: 100px; top: 100px;"> <img src="image.jpg" width="100" height="100"> </div> ``` 在这个例子,我们创建了一个带有 `v-drag` 指令的 `div` 元素,并在其放置了一个图片。当用户在页面拖拽这个 `div` 元素时,图片也会跟随移动。 希望这个例子对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值