Vue3实现图片滚轮缩放和拖拽

在这里插入图片描述

<template>
    <div class="wrap" @mousewheel.prevent="rollImg">
        <img :src="url" alt ref="image" @mousedown.prevent="moveImg" />
    </div>
</template>
<script setup>
import { ref } from 'vue'
const url = ref("https://w.wallhaven.cc/full/8o/wallhaven-8oky1j.jpg")

const image = ref(null)
const rollImg = (e) => {
    let transform = image.value.style.transform
    let zoom = transform.indexOf("scale") != -1 ? +transform.split("(")[1].split(")")[0] : 1
    zoom += e.wheelDelta / 1200
    if (zoom > 0.1 && zoom < 2) {
        image.value.style.transform = "scale(" + zoom + ")"
    }
}

const moveImg = (e) => {
    let x = e.clientX
    let y = e.clientY
    let left = x - e.target.offsetLeft
    let top = y - e.target.offsetTop
    document.onmousemove = (ev) => {
        e.target.style.left = ev.clientX - left + 'px'
        e.target.style.top = ev.clientY - top + 'px'
    }
    document.onmouseup = () => {
        document.onmousemove = null
    }
}
</script>

<style lang='less' scoped>
.wrap {
    position: relative;
    width: 100vw;
    height: 100vh;
    overflow: hidden;
    display: flex;
    align-items: center;
    justify-content: center;
}
img {
    position: absolute;
    cursor: move;
}
</style>
  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用Vue编写的一个简单的鼠标滚轮缩放元素和长按拖动元素的代码: ```html <template> <div class="container" @wheel="onWheel" @mousedown="onMouseDown" @mouseup="onMouseUp" @mousemove="onMouseMove"> <div class="box" :style="{transform: 'scale(' + scale + ')', top: top + 'px', left: left + 'px'}"></div> </div> </template> <script> export default { data() { return { isDragging: false, // 是否正在拖动 startMouseX: 0, // 开始拖动时鼠标的X坐标 startMouseY: 0, // 开始拖动时鼠标的Y坐标 startBoxLeft: 0, // 开始拖动时盒子的左侧位置 startBoxTop: 0, // 开始拖动时盒子的顶部位置 scale: 1, // 缩放比例 top: 0, // 盒子的顶部位置 left: 0 // 盒子的左侧位置 } }, methods: { // 鼠标滚轮事件 onWheel(event) { // 滚动一次改变0.1倍缩放比例 this.scale += event.deltaY > 0 ? -0.1 : 0.1; // 缩放比例的最小值为0.1,最大值为3 if (this.scale < 0.1) { this.scale = 0.1; } else if (this.scale > 3) { this.scale = 3; } }, // 鼠标按下事件 onMouseDown(event) { // 如果点击的是盒子 if (event.target.classList.contains('box')) { this.isDragging = true; this.startMouseX = event.clientX; this.startMouseY = event.clientY; this.startBoxLeft = this.left; this.startBoxTop = this.top; } }, // 鼠标抬起事件 onMouseUp(event) { this.isDragging = false; }, // 鼠标移动事件 onMouseMove(event) { if (this.isDragging) { const offsetX = event.clientX - this.startMouseX; const offsetY = event.clientY - this.startMouseY; this.left = this.startBoxLeft + offsetX; this.top = this.startBoxTop + offsetY; } } } } </script> <style scoped> .container { width: 500px; height: 500px; position: relative; border: 1px solid #ccc; overflow: hidden; } .box { width: 100px; height: 100px; position: absolute; top: 0; left: 0; background-color: red; cursor: move; } </style> ``` 在这个示例中,我们创建了一个容器和一个红色的盒子。我们监听了容器的鼠标滚轮事件、鼠标按下事件、鼠标抬起事件和鼠标移动事件,来实现

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值