【vue】用vue实现拖拽/删除效果

这周接了个小外包,要求用vue实现如下图的拖拽效果

在这里插入图片描述

原理

@mousedown监听鼠标按下,按下后开启mousemove + mouseup监听器,并根据clientY + offsetTop计算出元素新的top高度进行赋值,实现元素跟随。具体源码如下

<div title="demo" class="icon" @mousedown="demo">
	<img src="../assets/logo.png" alt="">
	<div class="icon_title" :style="{display: state.isShow ? 'block' : 'none'}">
		拖拽下拉新增书签 <br /> 拖回顶部删除书签
	</div>
</div>
demo(e) {
	//去除默认样式 - 避免拖动元素出现禁止图标
	e.preventDefault && e.preventDefault();
	//获取目标元素
	let odiv = e.target;
	//算出鼠标相对元素的位置
	let disY = e.clientY - odiv.offsetTop;
	let item = {
		top: 0,
		id: 1,
		url: '/src/assets/logo.png'
	}
	//监听鼠标移动事件
	document.onmousemove = (e) => { 
		//用鼠标的位置减去鼠标相对元素的位置,得到元素的位置
		let top = e.clientY - disY;
		//重新赋值
		item.top = top;
	};
	//监听鼠标松开
	document.onmouseup = (e) => {
		document.onmousemove = null;
		document.onmouseup = null;
		//赋值
		this.itemLeft.push(item)

	};
},

参考链接:另一个Vue拖拽的学习参考链接:关于clientY等参数的具体计算

困难

  • 鼠标按下后移动,会进入元素拖动事件并出现鼠标禁止图标。这会打断mousemove的监听效果。搜了半天,都说在html写个 dragglable=“true” 属性就行,然并卵。最终是在js里一行代码实现了。
//去除默认样式 - 避免拖动元素出现禁止图标
e.preventDefault && e.preventDefault();
  • 按下时元素要跟随鼠标,这就需要计算鼠标在按下时相对元素的位置,移动时重赋值时也需要计算上这个相对位置。这并不是一件很好理解的事情,让我绕了好久,还是看上文的参考链接学会的。

本文只是实现拖拽功能,记录一下,希望日后再面对相似需求时可以做到炉火纯青。

### 在 Vue3 中使用 PanZoom 实现 PNG 和 JPG 图片的拖拽与缩放 为了在 Vue3 项目中实现 PNG 或 JPG 图片的拖拽和缩放功能,可以利用 `panzoom` 库来简化操作。以下是具体实现方式: #### 安装依赖包 首先,在项目根目录下通过 npm 或 yarn 安装所需的库。 ```bash npm install @panzoom/panzoom ``` 或者 ```bash yarn add @panzoom/panzoom ``` #### 创建组件并引入 PanZoom 创建一个新的 Vue 组件用于展示图像,并初始化 PanZoom 功能。 ```javascript // ImagePanZoom.vue <template> <div ref="imageContainer" class="image-container"> <img :src="imageUrl" alt="Draggable and Zoomable Image"/> </div> </template> <script setup> import { onMounted, ref } from 'vue'; import panzoom from '@panzoom/panzoom'; const props = defineProps({ imageUrl: String, }); const imageContainer = ref(null); onMounted(() => { const pzInstance = panzoom(imageContainer.value); // 添加事件监听器以支持触摸设备上的手势控制 pzInstance.on('transform', (event) => console.log(event)); }); </script> <style scoped> .image-container img { max-width: 100%; } </style> ``` 此代码片段展示了如何在一个名为 `ImagePanZoom.vue` 的自定义组件内设置图片容器,并调用 `@panzoom/panzoom` 来启用交互特性[^1]。 #### 使用组件 最后一步是在页面或其他父级组件里注册并使用新创建的子组件。 ```html <!-- ParentComponent.vue --> <template> <!-- 其他模板结构... --> <ImagePanZoom :imageUrl="'path/to/image.png'" /> </template> <script setup> import ImagePanZoom from './components/ImagePanZoom.vue'; // 调整路径适配实际文件置 </script> ``` 这样就完成了基于 Vue3 构建的支持 PNG 及 JPG 文件类型的简单拖拽加缩放示范程序[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值