记录-做一个文件拖动到文件夹的效果

news2024/11/27 8:25:14

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

在我的电脑中,回想一下我们想要把一个文件拖动到另一个文件夹是什么样子的呢

1:鼠标抓起文件
2:拖动文件到文件夹上方
3:文件夹高亮,表示到达指定位置
4:松开鼠标将文件夹放入文件

Kapture 2023-03-10 at 08.30.34.gif

下面就来一步步实现它吧👇

一:让我们的元素可拖动

方式一: draggable="true"

`<div draggable="true" class="dragdiv">拖动我</div>`

方式二:-webkit-user-drag: element;

  .dragdiv {

    width: 100px;

    height: 100px;

    background-color: bisque;

    -webkit-user-drag: element;

    }
    

效果

Kapture 2023-03-10 at 08.55.25.gif

二:让文件夹有高亮效果

给文件夹添加伪类?

🙅如果你直接给文件夹设置伪类:hover,会发现当拖动元素时,文件夹的:hover是不会触发的

Kapture 2023-03-10 at 09.08.54.gif

🧘这是因为在拖拽元素时,拖拽操作和悬停操作是不同的事件类型,浏览器在处理拖拽操作时,会优先处理拖拽事件,而不会触发悬停事件。拖拽操作是通过鼠标点击和拖拽来触发的,而悬停事件是在鼠标指针停留在一个元素上时触发的。

所以我们就来对拖拽操作的事件类型做功课吧🫱

  • dragstart:拖拽开始
  • dragend:拖拽结束
  • dragover:拖拽的元素在可放置区域内移动时触发,即鼠标指针在可放置区域内移动时持续触发
  • dragenter:拖拽的元素首次进入可放置区域时触发
  • dragleave:拖拽的元素离开可放置区域时触发
  • drop:当在可放置区域时,松开鼠标放置元素时触发
    什么是可放置元素?
    当你给元素设置事件:dragover、dragenter、dragleave、drop的时候  
    它就变成了可放置元素,特点是移到上面有绿色的➕号

拖动高亮实现

1:我们给files文件夹添加两个响应事件:dragoverdragleave

ps: 这里用dragover事件而不用dragenter事件是为了后续能够成功触发drop事件
2:当拖动元素进入可放置区域时,动态的给files添加类,离开时则移除类
// 显示高亮类
.fileshover {
    background-color: rgba(0, 255, 255, 0.979);
}
// 添加dragover事件处理程序,在可放置区域触发

files.addEventListener('dragover', (event) => {

    event.target.classList.add('fileshover');

});

// 添加dragleave事件处理程序,离开可放置区域触发

files.addEventListener('dragleave', (event) => {

    event.target.classList.remove('fileshover');

});

🥳 恭喜你成功实现了移动到元素高亮的效果了

Kapture 2023-03-14 at 11.54.14.gif

三:文件信息传递

文件拖过去,是为了切换文件夹,在这里你可能会进行一些异步的操作,比如请求后端更换文件在数据库中的路径等。我们的需求多种多样,但是归根到底都是获取到文件的数据,并传递到文件夹中

DataTransfer对象

DragEvent.dataTransfer: 在拖放交互期间传输的数据

我们主要使用它的两个方法:

  • DataTransfer.setData(format, data):就是设置键值对,把我们要传的数据添加到drag object
  • DataTransfer.getData(format):根据键获取保存的数据

知道了这两个方法,相信你一定就有实现思路了 👊

拖拽开始 --> setData添加数据 --> 进入可放置区域 --> 放置时getData获取数据 --> 完成

1:给文件设置dragstart事件

// 开始拖拽事件

draggable.addEventListener('dragstart', (event) => {

    const data = event.target.innerText;
    
    event.dataTransfer.setData('name', data); //添加数据

})
2:在dragover事件中用 event.preventDefault()阻止默认行为,允许拖拽元素放置到该元素上,否则无法触发drop事件
// 添加dragover事件处理程序

files.addEventListener('dragover', (event) => {

    event.target.classList.add('fileshover');

    event.preventDefault(); //新增

});

3:给文件夹设置放置事件drop

// 添加drop事件处理程序

files.addEventListener('drop', (event) => {

    const data = event.dataTransfer.getData('name'); // 获取文件的数据

    const text = document.createTextNode(data);

    files.appendChild(text);
    
    event.target.classList.remove('fileshover'); // 记得放置后也要移除类

});

实现效果:

Kapture 2023-03-14 at 14.46.45.gif

四:完整代码:

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta http-equiv="X-UA-Compatible" content="IE=edge">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Document</title>

<style>

.dragdiv {

width: 100px;

height: 100px;

background-color: bisque;

-webkit-user-drag: element;

}

.files {

width: 200px;

height: 200px;

background-color: rgba(0, 255, 255, 0.376);

margin-top: 100px;

}

.fileshover {

background-color: rgba(0, 255, 255, 0.979);

}

</style>

</head>

<body>

<div draggable="true" class="dragdiv">我是文件1</div>

<div class="files">

<p>文件夹</p>

拖动文件名称:

</div>

<script>

const draggable = document.querySelector('.dragdiv');

const files = document.querySelector('.files');

// 开始拖拽事件

draggable.addEventListener('dragstart', (event) => {

    const data = event.target.innerText;

    event.dataTransfer.setData('name', data);

})

// 添加dragover事件处理程序

files.addEventListener('dragover', (event) => {

    event.target.classList.add('fileshover')

    event.preventDefault()

});

// 添加dragleave事件处理程序

files.addEventListener('dragleave', (event) => {

    event.target.classList.remove('fileshover')

});

// 添加drop事件处理程序

files.addEventListener('drop', (event) => {

    const data = event.dataTransfer.getData('name')

    const text = document.createTextNode(data)

    files.appendChild(text);

    event.target.classList.remove('fileshover')


});

</script>

</body>

</html>

本文转载于:

https://juejin.cn/post/7210256070299549755

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

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

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

相关文章

ChatGPT能让智能客服更上一层楼么?

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 现实生活中&#xff0c;智能客服的身影已随处可见。 随着全球经济从以产品为主向以服务为主转型&#xff0c;体验经济也快速发展。客户服务逐渐成为一个独立的产业&#xff0c;而客服中心也成为所有企业的基本部门。然而&am…

港科夜闻|香港科技大学校董会主席沈向洋院士一行到访香港科大(广州)

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科技大学校董会主席沈向洋院士一行到访香港科大(广州)。沈向洋院士于2023年3月6日起担任香港科大校董会主席&#xff0c;这是他上任以后首次率队到访香港科大(广州)。这也标志着&#xff0c;两校将继续坚定不移地在“…

JavaEE——单例模式

文章目录 一、介绍什么是单例模式二、饿汉模式三、懒汉模式四、讨论两种模式的线程安全问题 一、介绍什么是单例模式 在介绍单例模式之前&#xff0c;我们得先明确一个名词设计模式。 所谓设计模式其实不难理解&#xff0c;就是在计算机这个圈子中&#xff0c;呢些大佬们为了…

驾考系统C#winform驾照考试系统

驾考系统C#winform驾照考试系统 c#&#xff0c;sqlite&#xff0c;winform &#xff0c;.net framwork4.0驾照考试系统 有兴趣的朋友可以修改源代码玩玩!我用的数据库是sqlite &#xff08;随着我国社会的不断进步和发展&#xff0c;越来越多的家庭拥有汽车&#xff0c;人们…

[linux-sd-webui]api之dreambooth训练

https://gitee.com/leeguandong/dreambooth-for-diffusionhttps://gitee.com/leeguandong/dreambooth-for-diffusionhttps://zhuanlan.zhihu.com/p/584736850https://zhuanlan.zhihu.com/p/584736850这个库使用的是diffusers库&#xff0c;现在主要就是kohya-ss/sd-scripts混合…

模拟退火算法与遗传算法求解多目标优化问题的算法实现(数学建模)

一、模拟退火算法 模拟退火算法是一种全局优化算法&#xff0c;解决的问题通常是找到一个最小化&#xff08;或最大化&#xff09;某个函数的全局最优解。它通过模拟物理退火的过程来搜索解空间&#xff0c;在开始时以一定的温度随机生成初始解&#xff0c;然后一步步降低温度…

java 图形化小工具Abstract Window Toolit :画笔Graphics,画布Canvas(),弹球小游戏

画笔Graphics Java中提供了Graphics类&#xff0c;他是一个抽象的画笔&#xff0c;可以在Canvas组件(画布)上绘制丰富多彩的几何图和位图。 Graphics常用的画图方法如下&#xff1a; drawLine(): 绘制直线drawString(): 绘制字符串drawRect(): 绘制矩形drawRoundRect(): 绘制…

YOLOv8——CV界的XGBoost

yolov8是ultralytics公司于2023年1月开源的anchor-free的最新目标检测算法框架。 封装在ultralytics这个库中&#xff1a;https://github.com/ultralytics/ultralytics 它具有以下优点&#xff1a; 1&#xff0c;性能速度领先&#xff1a;借鉴了之前许多YOLO版本的trick&#x…

spring常用的事务传播行为

事务传播行为介绍 Spring中的7个事务传播行为: 事务行为 说明 PROPAGATION_REQUIRED 支持当前事务&#xff0c;假设当前没有事务。就新建一个事务 PROPAGATION_SUPPORTS 支持当前事务&#xff0c;假设当前没有事务&#xff0c;就以非事务方式运行 PROPAGATION_MANDATORY…

ChatGPT能胜任高级程序员吗?

与开发人员信任的其他软件开发工具不同&#xff0c;AI工具在训练、构建、托管和使用方式等方面都存在一些独特的风险。 自2022年底ChatGPT发布以来&#xff0c;互联网上便充斥着对其几乎相同比例的支持和怀疑的论调。不管你是否喜欢它&#xff0c;AI正在逐步进入你的开发组织。…

JAVA ssm客户信息管理系统idea开发mysql数据库web结构计算机java编程springMVC

一、源码特点 idea ssm客户信息管理系统是一套完善的web设计系统mysql数据库springMVC框架mybatis&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开 发。 java ssm客户信息管理系统idea开发mysql数据…

【五一创作】 SAAS-HRM系统概述与搭建环境

SAAS-HRM系统概述与搭建环境 学习目标&#xff1a; 理解SaaS的基本概念 了解SAAS-HRM的基本需求和开发方式掌握Power Designer的用例图 完成SAAS-HRM父模块及公共模块的环境搭建完成企业微服务中企业CRUD功能 初识SaaS 云服务的三种模式 IaaS&#xff08;基础设施即服务…

业务维度digest日志的记录与监控方案

需求 ​   为了满足从业务整体的维度 实现监控和链路复原&#xff0c;我们希望对于一个业务接口&#xff0c;记录一行请求日志&#xff0c;并通过某个 Unique Id&#xff08;如UserId、OrderId&#xff09;将多行日志关联起来&#xff0c;最终产出一批和业务强相关的数据&am…

软件维护(Software maintenance)的流程

软件维护(Software maintenance)是一个软件工程名词&#xff0c;是指在软件产品发布后&#xff0c;因修正错误、提升性能或其他属性而进行的软件修改。 软件维护主要根据需求变化或硬件环境的变化对应用程序进行部分或全部的修改&#xff0c;修改时应充分利用源程序。修改后要填…

2023年的深度学习入门指南(10) - 前端同学如何进行chatgpt开发

2023年的深度学习入门指南(10) - 前端同学如何进行chatgpt开发 在第二篇&#xff0c;我们使用openai的python库封装&#xff0c;搞得它有点像之前学习的PyTorch一样的库。这一节我们专门给它正下名&#xff0c;前端就是字面意义上的前端。 给gpt4写前端 下面我们写一个最土的…

【BeautifulSoup】——05全栈开发——如桃花来

目录索引 介绍&#xff1a;解析库&#xff1a; 安装&#xff1a;pip install BeautifulSoup4pip install lxml 标签选择器&#xff1a;1.string属性&#xff1a;.name属性&#xff1a;获取标签中的属性值&#xff1a; 实用——标准选择器&#xff1a;使用find_all()根据标签名查…

百城巡展 | 人大金仓4月“双向奔赴”告一段落

人间最美四月天&#xff0c;人大金仓走过上海、宁波、合肥&#xff0c;联合伙伴发布医疗、金融、信息安全、电子档案等多个关键领域的信创联合解决方案&#xff0c;共同为数字基础设施的安全和可持续发展贡献力量&#xff0c;吸引了线上线下近7000人参与。 左右滑动&#xff0c…

大数据架构(一)背景和概念

-系列目录- 大数据架构(一)背景和概念 大数据架构(二)大数据发展史 一、背景 1.岗位现状 大数据在一线互联网已经爆发了好多年&#xff0c;2015年-2020年(国内互联网爆发期)那时候的大数据开发&#xff0c;刚毕业能写Hive SQL配置个离线任务、整个帆软报表都20K起步。如果做到架…

Midjourney 创建私人画图机器人,共享账号如何设置独立绘画服务器(保姆级教程)

你是不是遇到以下问题&#xff1a; 1.Midjourney会员怎么自建绘图服务器&#xff0c;不受其他人的打扰&#xff1f; 2.Midjourney会员共享账号如何自建服务器&#xff0c;供其他人使用&#xff1f; 3.在官方服务器作图&#xff0c;频道里面的人太多了&#xff0c;自己的指令…