【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();
  • 按下时元素要跟随鼠标,这就需要计算鼠标在按下时相对元素的位置,移动时重赋值时也需要计算上这个相对位置。这并不是一件很好理解的事情,让我绕了好久,还是看上文的参考链接学会的。

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

相关推荐

  1. vue实现dialog封装

    2024-07-11 18:00:04       21 阅读
  2. vue3 实现一个自定义指令

    2024-07-11 18:00:04       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 18:00:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 18:00:04       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 18:00:04       58 阅读
  4. Python语言-面向对象

    2024-07-11 18:00:04       69 阅读

热门阅读

  1. mysql bit 对gorm使用何种类型?

    2024-07-11 18:00:04       26 阅读
  2. python爬虫学习(三十三天)---多线程上篇

    2024-07-11 18:00:04       23 阅读
  3. 一、Python 日志系统设计之不同级别的系统日志

    2024-07-11 18:00:04       20 阅读
  4. SpringAMQP收发消息demo

    2024-07-11 18:00:04       20 阅读
  5. SpringSecurity中文文档(Servlet OAuth 2.0 Login)

    2024-07-11 18:00:04       19 阅读
  6. ant-design-vue表格设置某列标题部分文字颜色

    2024-07-11 18:00:04       24 阅读
  7. python-redis-lock是如何实现锁自动续期的

    2024-07-11 18:00:04       22 阅读
  8. APK反编译

    2024-07-11 18:00:04       25 阅读