拖拽其实没有那么难

拖拽其实没有那么难

前言

大家是否在个人开发或者公司项目中遇到过拖拽相关的需求呢?之前我从未处理过这块的内容,碰巧上回接到了这么一个拖拽的需求。当时心里一咯噔:"完了!这个我没有处理过,不会啊!😭"。

不过在真正去了解了一下这块的内容,发现其实拖拽也没有我们想象的那么难(对于web端来说)。现在原生对于拖拽的支持已经非常好了。

效果

我们来看这么一个效果:在线预览

第一眼看着是不是觉得还有点复杂,监听鼠标按下事件,监听鼠标移动,监听鼠标放开,想想就害怕,但其实并不是,代码只有这么几行:

html 复制代码
<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
		<title>拖拽demo</title>
		<style>
			body {
				display: flex;
			}
			.box1,
			.box2 {
				width: 300px;
				height: 600px;
				border: 1px solid #ccc;
			}
			.box2 {
				margin-left: 50px;
			}

			.item {
				width: 100px;
				height: 50px;
				display: flex;
				justify-content: center;
				align-items: center;
				background-color: skyblue;
				margin-top: 10px;
				margin-left: 10px;
			}
		</style>
	</head>
	<body>
		<div class="box1">
			<div class="item" draggable="true" ondragstart="dragStart(event,'手机')">
				手机
			</div>
			<div class="item" draggable="true" ondragstart="dragStart(event,'电脑')">
				电脑
			</div>
			<div class="item" draggable="true" ondragstart="dragStart(event,'耳机')">
				耳机
			</div>
		</div>
		<div
			class="box2"
			ondrop="dropEnd(event)"
		></div>
	</body>

	<script>
		const box2 = document.querySelector('.box2')
		function dragStart(e, device) {
			e.dataTransfer.setData('device', device)
		}
		function dropEnd(e) {
			var transferredDevice = e.dataTransfer.getData('device')
			const div = document.createElement('div')
			div.textContent = transferredDevice
			div.classList.add('item')
			box2.appendChild(div)
		}
	</script>
</html>

核心就是这两步:

  • 给需要拖拽的元素加上draggable = true 的属性,同时设置ondragstart的事件处理函数

    可以通过句柄e中以key,value存储我们想要存储的数据

    e.dataTransfer.setData('device', device)

  • 给可放下拖拽的容器设置ondrop放手事件处理函数

    可以通过句柄e获取我们之前存储的数据

基于以上的两步我就可以完成一个拖拽的任务了。

兼容性

caniuse中我们也得知,大部分主流的浏览器其实都是已经支持的了。

总结

拖拽其实没有我们想象的那么难了,之前没有这个api之前可能就相对复杂要处理各种鼠标事件,现在一个api就完成了,在不需要考虑兼容性的情况下还是可以放心大胆的使用的~😄

相关链接

相关推荐
white-persist13 小时前
Python实例方法与Python类的构造方法全解析
开发语言·前端·python·原型模式
新中地GIS开发老师13 小时前
Cesium 军事标绘入门:用 Cesium-Plot-JS 快速实现标绘功能
前端·javascript·arcgis·cesium·gis开发·地理信息科学
Superxpang14 小时前
前端性能优化
前端·javascript·vue.js·性能优化
Rysxt_14 小时前
Element Plus 入门教程:从零开始构建 Vue 3 界面
前端·javascript·vue.js
隐含14 小时前
对于el-table中自定义表头中添加el-popover会弹出两个的解决方案,分别针对固定列和非固定列来隐藏最后一个浮框。
前端·javascript·vue.js
大鱼前端14 小时前
Turbopack vs Webpack vs Vite:前端构建工具三分天下,谁将胜出?
前端·webpack·turbopack
你的人类朋友14 小时前
先用js快速开发,后续引入ts是否是一个好的实践?
前端·javascript·后端
知识分享小能手14 小时前
微信小程序入门学习教程,从入门到精通,微信小程序核心 API 详解与案例(13)
前端·javascript·学习·react.js·微信小程序·小程序·vue
子兮曰15 小时前
npm workspace 深度解析:与 pnpm workspace 和 Lerna 的全面对比
前端·javascript·npm