基于Web API drap事件的简单拖拽功能

news2024/11/25 10:32:33

基于Web API drap事件的简单拖拽功能

    • 效果示例图
    • 代码示例

效果示例图

在这里插入图片描述

代码示例

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			* {
				padding: 0px;
				margin: 0px;
				box-sizing: border-box;
			}

			ul,
			ol,
			li {
				list-style: none;
			}

			.drag-wrap {
				width: 600px;
				margin: 20px auto;
			}

			.drag-header {
				border: 1px solid #dcdcdc;
				border-radius: 4px;
				width: 100%;
				display: flex;
				flex-wrap: wrap;
			}

			.drag-tab {
				border: 1px solid #00a2ef;
				border-radius: 4px;
				padding: 6px 12px;
				font-size: 16px;
				color: #00a2ef;
				margin: 6px 6px;
				cursor: move;
			}

			.drag-tab:hover {
				border: 1px solid #00a2ef;
				background-color: #00a2ef;
				color: #fff;
			}

			.drag-content {
				border: 1px solid #dcdcdc;
				width: 100%;
				margin-top: 60px;
			}

			.drag-title {
				border-bottom: 1px solid #00a2ef;
				width: 100%;
				display: flex;
				flex-direction: row;
			}

			.drag-th {
				border-right: 1px solid #dcdcdc;
				flex: 1;
				padding: 6px 6px;
			}

			.drag-th:last-child {
				border-right: 0px;
			}

			.drag-tr {
				border-bottom: 1px solid #00a2ef;
				width: 100%;
				display: flex;
				flex-direction: row;
			}

			.drag-tr:hover {
				background-color: #eee;
			}

			.drag-tr:last-child {
				border-bottom: 0px;
			}

			.drag-item-td {
				border-right: 1px solid #dcdcdc;
				flex: 1;
				padding: 12px 6px;
			}

			.drag-tr>.drag-item-td:last-child {
				border-right: 0px;
			}

			.drag-item-td-operate {
				display: flex;
				flex-wrap: wrap;
			}

			.move-enter {
				background-color: #dcdcdc;
			}

			.operate-btn {
				border: 1px solid #00a2ef;
				border-radius: 4px;
				padding: 6px 12px;
				font-size: 16px;
				color: #00a2ef;
				margin: 6px 6px;
				cursor: move;
				text-align: center;
			}
		</style>
	</head>
	<body>
		<div class="drag-wrap">
			<!-- header -->
			<div class="drag-header">
				<div class="drag-tab" draggable="true" data-id="1" data-effect="copy">毛利兰</div>
				<div class="drag-tab" draggable="true" data-id="2" data-effect="copy">毛利小五郎</div>
				<div class="drag-tab" draggable="true" data-id="3" data-effect="copy">英妃理</div>
				<div class="drag-tab" draggable="true" data-id="4" data-effect="copy">工藤新一</div>
				<div class="drag-tab" draggable="true" data-id="5" data-effect="copy">工藤优作</div>
				<div class="drag-tab" draggable="true" data-id="6" data-effect="copy">毛利博士</div>
				<div class="drag-tab" draggable="true" data-id="7" data-effect="copy">小岛元太</div>
				<div class="drag-tab" draggable="true" data-id="8" data-effect="copy">黑羽快斗</div>
				<div class="drag-tab" draggable="true" data-id="9" data-effect="copy">黑羽盗一</div>
				<div class="drag-tab" draggable="true" data-id="10" data-effect="copy">中森青子</div>
			</div>
			<!-- content -->
			<ul class="drag-content">
				<li class="drag-title">
					<div class="drag-th">ID</div>
					<div class="drag-th">状态</div>
					<div class="drag-th">性别</div>
					<div class="drag-th">操作</div>
				</li>
				<li class="drag-tr">
					<div class="drag-item-td">001</div>
					<div class="drag-item-td">上学中</div>
					<div class="drag-item-td">男</div>
					<div class="drag-item-td drag-operate" data-id="001" data-drop="copy"></div>
				</li>
				<li class="drag-tr">
					<div class="drag-item-td">002</div>
					<div class="drag-item-td">上学中</div>
					<div class="drag-item-td">男</div>
					<div class="drag-item-td drag-operate" data-id="002" data-drop="copy"></div>
				</li>
				<li class="drag-tr">
					<div class="drag-item-td">003</div>
					<div class="drag-item-td">上学中</div>
					<div class="drag-item-td">女</div>
					<div class="drag-item-td drag-operate" data-id="003" data-drop="copy"></div>
				</li>
				<li class="drag-tr">
					<div class="drag-item-td">004</div>
					<div class="drag-item-td">研发中</div>
					<div class="drag-item-td">男</div>
					<div class="drag-item-td drag-operate" data-id="004" data-drop="copy"></div>
				</li>
			</ul>
		</div>
	</body>
	<script type="text/javascript">
		const dragContainer = document.querySelector(".drag-wrap");
		//暂存原始节点
		let sourceNode = null;

		//是否离开
		let dragLeave = false;

		dragContainer.addEventListener("dragstart", (e) => {
			console.log("[dragstart]", e.target)
			//DataTransfer.effectAllowed 属性指定拖放操作所允许的一个效果
			e.dataTransfer.effectAllowed = e.target.dataset.effect;
			sourceNode = e.target;
		})


		/**
		 * 拖拽的元素悬浮在元素上,触发事件
		 * **/
		dragContainer.addEventListener("dragover", (e) => {
			e.preventDefault()
		})

		/**
		 * 判断当前节点或者它的父节点是否设置了data-drop="copy"
		 * **/
		function judgeDropNode(node) {
			while (node) {
				// 先判断当前节点是否包含data-drop="copy"
				if (node.dataset && node.dataset.drop === 'copy') {
					return node;
				}
				//在判断它的父节点是否存在data-drop="copy"
				node = node.parentNode
			}
		}

		/**
		 * 拖拽的元素进入某个元素触发事件
		 * **/
		dragContainer.addEventListener("dragenter", (e) => {
			console.log("[dragenter]", e.target)
			clearStyle();
			const dropNode = judgeDropNode(e.target);
			console.log("[node]", dropNode)

			if (dropNode && (dropNode.dataset.drop === e.dataTransfer.effectAllowed)) {
				dropNode.classList.add("move-enter");
			}

		})

		/**
		 * 拖拽的元素放手了之后触发的事件
		 * **/
		dragContainer.addEventListener("drop", (e) => {
			console.log("[drop]", e.target)
			const dropNode = judgeDropNode(e.target);
			console.log("[node]", dropNode)

			if (dropNode && (dropNode.dataset.drop === e.dataTransfer.effectAllowed)) {
				if (dropNode.dataset.drop === 'copy') {
					const btn = document.createElement("div");
					btn.classList.add("operate-btn");
					btn.innerText = sourceNode.innerText;
					btn.dataset.id = sourceNode.dataset.id;
					dropNode.appendChild(btn);
					eventHandle(sourceNode.dataset.id, dropNode.dataset.id);
				}
			}
		})

		/**
		 * 拖拽离开
		 * **/
		dragContainer.addEventListener("dragleave", (e) => {
			console.log("[dragleave]", e.target)
		})

		/**
		 * 拖拽结束
		 * **/
		dragContainer.addEventListener("dragend", (e) => {
			console.log("[dragend]", e.target)
			clearStyle();
		})

		//清除原来添加的样式
		function clearStyle() {
			document.querySelectorAll(".drag-operate").forEach(item => {
				item.classList.remove("move-enter");
			});
		}

		function eventHandle(id, parentID) {
			console.log("[]", id, parentID)
		}
	</script>
</html>

drap API

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/771736.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS学习简记(更新中~)

CSS定义 层叠样式表&#xff08;Cascading Style Sheets, 缩写为CSS&#xff09;,是一种样式表语言&#xff0c;用来描述HTML文档的呈现&#xff08;美化内容&#xff09; CSS书写规则 选择器 {属性名:属性值; } CSS引入方式 内部样式表 CSS代码直接写在style标签内外部样式…

你真的会用async和await么?

背景 背景就是遇到了一个比较烦人的模块&#xff0c;里面的涉及到了大量的async 和 awiat。发现大多人对这个语法糖一知半解&#xff0c;然后大量的滥用&#xff0c;整理一下 async 前置知识&#xff1a; Promise.resolve(foo) new Promise(resolve > resolve(foo)…

面试题汇总——Java集合(Collection和Map)

1简单介绍一下Java集合类 位置:Java的所有集合类都在java.util包下,从JDK5.0开始为了处理多线程环境下的并发安全问题,又在java.util.concurrent包下提供了一些多线程支持的集合类。 内容:Java的集合类主要有两个接口派生而出:Collection和Map。 1.1Collection Collect…

5年经验之谈 —— 功能测试和性能测试的区别是什么?

刚刚入门软件测试的宝子&#xff0c;可能经常会看到&#xff1a;功能测试、性能测试&#xff0c;这些到底是什么呀&#xff1f;那我就带大家了解一下~ 一、定义 功能测试 功能测试就是对产品的各功能进行验证&#xff0c;根据功能测试用例&#xff0c;逐项测试&#xff0c;检…

二叉树的右视图

给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4] 示例 2: 输入: [1,null,3] 输出: [1,3] 示例 3: 输入: [] 输出: [] 代…

dbever找到对应的密码【dbever找到对应的密码图文java代码版本】

String file “C:\Users\test\AppData\Roaming\DBeaverData\workspace6\mydeaver\.dbeaver\”; 填写自己对应的路径 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version> &l…

Linux 安装oracle_11g保姆级安装教程及安装Oracle常见问题处理

一 安装linux 1 Linux系统 安装前的准备 linux安装建议&#xff1a; 1&#xff09;脑内存1G&#xff0c;交换空间是物理内存的两倍&#xff0c;空闲空间&#xff08;/tmp目录&#xff09;至少1G 2&#xff09;选择服务时&#xff0c;建议全部选中&#xff0c;关闭防火墙&am…

【图像分割 2023 CVPR】CFNet

文章目录 【图像分割 2023 CVPR】CFNet摘要1. 简介2. 相关工作2.1 稠密预测的主干网设计2.2 多尺度特征融合 3. 方法3.1 整体架构3.2 过渡块3.4 结构变体 【图像分割 2023 CVPR】CFNet 论文题目&#xff1a;CFNet: Cascade Fusion Network for Dense Prediction 中文题目&#…

el-table找出当前单元格与对应的上下列的值

当前单元格与对应的上下列的值如果不相同就设置个红色边框 当前单元格与对应的上下列的值如果不相同就设置个红色边框 当前单元格与对应的上下列的值如果不相同就设置个红色边框 以下是示例代码&#xff0c;对tableData数据的name字段进行处理 如果当前name值与上一条数据的na…

如何为HashMap设置初始化大小

如何为HashMap设置初始化大小 1.阿里巴巴代码规范的要求2.使用阿里巴巴插件扫描时3. 源码3.1 当初始化不设置大小时3.2 当初始化设置大小时 4. 测试附录 1.阿里巴巴代码规范的要求 2.使用阿里巴巴插件扫描时 3. 源码 3.1 当初始化不设置大小时 Map<Integer, BigDecimal>…

【计算机视觉】DINOv2(视觉大模型)代码四个不同模型的对比,以 28 * 28 的图像为例(完整的源代码)

文章目录 一、ViT-S/14二、ViT-B/14三、ViT-L/14四、ViT-g/14 一、ViT-S/14 import torch import torchvision.transforms as T import matplotlib.pyplot as plt import numpy as np import matplotlib.image as mpimg from PIL import Image from sklearn.decomposition im…

王道考研数据结构第七章知识点总结

7.1 查找的基本概念 注&#xff1a;查找表并不是一种新的数据结构&#xff0c;它只是对于你需要查找的一类数据结构的一类统称而已 7.2.1 顺序查找 注&#xff1a;学会画查找判定树 7.2.2 折半查找(模拟算法流程详见课件) 实现流程&#xff1a;略&#xff0c;见王道课件 mid如…

Java项目查询统计表中各状态数量

框架&#xff1a;SpringBoot&#xff0c;Mybatis&#xff1b;数据库&#xff1a;MySQL 表中设计2个状态字段&#xff0c;每个字段有3种状态&#xff0c;统计这6个状态各自的数量 sql查询语句及结果如图 SQL&#xff1a; SELECT SUM(CASE WHEN A0 THEN 1 ELSE 0 END) AS A0…

普华(Autosar OS开发)第一部分

普华灵智基础软件平台产品手册 一、基本情况 普华基础软件自2009年起深耕AUTOSAR车用基础软件领域,作为AUTOSAR组织高级合作伙伴,拥有强大的AUTOSAR专业技术团队。普华基础软件为国内各大OEM整车厂和主要的零部件供应商提供基于AUTOSAR标准的国产化汽车电子基础软件平台、开…

Linux内核结构与特性简介

系统调用接口&#xff1a;位于最上层&#xff0c;实现了一些基本的功能&#xff0c;如read和write等系统调用。这是用户空间程序与内核交互的接口&#xff0c;提供了对内核功能的访问。 内核代码&#xff1a;位于系统调用接口之下&#xff0c;可以看作是独立于体系结构的通用内…

Excel之VLOOKUP()函数介绍

Excel之VLOOKUP()函数介绍 Excel的VLOOKUP函数语法&#xff1a; VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup]) 参数说明&#xff1a; lookup_value&#xff1a;要查找的值或要比较的值。 table_array&#xff1a;包含要在其中进行查找的数据表的区…

电力载波与485抄表哪个抗干扰能力强

随着物联网技术的不断发展&#xff0c;自动化抄表系统已经逐渐替代了传统的手工抄表方式。其中&#xff0c;电力载波和485抄表是两种常见的自动化抄表方式。本文将从抗干扰能力的角度出发&#xff0c;对比两种抄表方式的优缺点&#xff0c;探讨哪种抄表方式更具优势。 一、电力…

东方通信基于 KubeSphere 的云计算落地经验

作者&#xff1a;周峰 吴昌泰 公司简介 东方通信股份有限公司&#xff08;以下简称“东方通信”&#xff09;创立于 1958 年&#xff0c;是一家集硬件设备、软件、服务为一体的整体解决方案提供商。公司于 1996 年成功改制上市&#xff0c;成为上海证交所同时发行 A 股和 B 股…

听GPT 讲K8s源代码--pkg(六)

pkg/kubelet/cm 目录是 Kubernetes 源代码中的一个目录&#xff0c;包含了 kubelet 组件中的 ConfigMap 相关代码。 在 Kubernetes 中&#xff0c;ConfigMap 是一种用于存储非机密数据的 API 对象类型&#xff0c;它可以用来存储配置信息、环境变量、命令行参数等等。 kubelet …

【人工智能】xAI——“X宇宙”又增添了一位新成员

个人主页&#xff1a;【&#x1f60a;个人主页】 &#x1f31e;热爱编程&#xff0c;热爱生活&#x1f31e; 文章目录 前言xAI团队成员做解开宇宙本质的AI 前言 有人问他&#xff0c;xAI公司是干啥的&#xff1f;马斯克的回答引用了其偶像、科幻作家道格拉斯・亚当斯的话&…