让你的网页动起来 - 轻松实现 JavaScript 拖拽功能

效果展示

动画.gif

实现

要实现该效果需要运用 HTML5 的 dragstart 拖放操作事件

通过去开启dragstart监听拖放操作事件就能实现图片的拖动

<div class="empty">
      <div class="fill" draggable="true"></div>
</div>

本例子中我们对fill盒子开启了draggable事件,fill盒子是用来存照片的

但是这样并不能形成一个反馈,只有单纯的拖动效果,效果如下图所示

动画.gif

如果想要实现在拖动了图片后有一个反馈效果,我们就需要使用JavaScript去监听draggable的开始拖动和结束拖动事件

.hold {
        border: 5px solid #00ff00;
      }
const fill = document.querySelector(".fill");
      // 拖拽开始事件
      fill.addEventListener("dragstart", DragStart);
      function DragStart(e) {
        this.classList.add("hold");
      }
      // 拖拽结束事件
      fill.addEventListener("dragend", DragEnd);
      function DragEnd(e) {
        this.classList.remove("hold");
      }

通过在拖动时给他添加边框,结束时取消以实现一个反馈的效果

动画.gif

最后去监听empty盒子的即可根据不同事件触发时,实现不同的效果

const empty = document.querySelectorAll(".empty");
      empty.forEach((item) => {
        // 经过事件
        item.addEventListener("dragover", DragOver);
        // 进入事件
        item.addEventListener("dragenter", DragEnter);
        // 离开事件
        item.addEventListener("dragleave", DragLeave);
        // 拖拽结束事件
        item.addEventListener("drop", Drop);
      })

首先通过类名获取所有的 .empty 元素

然后对每个获取到的元素分别添加了一系列的事件监听:

  • item.addEventListener("dragover", DragOver);:当元素上发生拖曳经过事件时,执行 DragOver 函数。
  • item.addEventListener("dragenter", DragEnter);:当元素上发生拖曳进入事件时,执行 DragEnter 函数。
  • item.addEventListener("dragleave", DragLeave);:当元素上发生拖曳离开事件时,执行 DragLeave 函数。
  • item.addEventListener("drop", Drop);:当元素上发生拖曳放下事件时,执行 Drop 函数。

具体思路就是在拖曳进入时给一个反馈,当拖曳放下时将元素放入

// 拖拽经过事件
      function DragOver(e) {
        // 阻止默认事件
        e.preventDefault();
        console.log("拖拽经过");
      }
      // 拖拽进入事件
      function DragEnter(e) {
        console.log("拖拽进入");
        this.classList.add("hovered");
      }
      // 拖拽离开事件
      function DragLeave(e) {
        console.log("拖拽离开");
        this.classList.remove("hovered");
      }
      // 拖拽结束事件
      function Drop(e) {
        console.log("拖拽结束");
        this.className = "empty";
        this.append(fill);
      }
  • DragOver 函数:

    • 通过 e.preventDefault() 阻止了默认行为,以确保拖放操作按照预期进行
  • DragEnter 函数:

    • 通过 this.classList.add("hovered") 为当前元素添加了一个名为“hovered”的类,用于进行反馈
  • DragLeave 函数:

    • 通过 this.classList.remove("hovered") 移除了之前添加的“hovered”类。
  • Drop 函数:

    • 通过 this.className = "empty" 将当前元素的类名重置为“empty”,接着通过 this.append(fill)fill 元素添加到当前元素中

最终就能实现效果了
动画.gif

完整代码

<!-- html5特征:<!DOCTYPE html> -->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>拖拽效果</title>

    <style>
      body {
        display: flex;
        justify-content: center;
        align-items: center;
        height: 100vh;
      }
      .empty {
        width: 150px;
        height: 150px;
        border: 3px solid #ffcccc;
        margin-left: 10px;
        background: #dafada;
        position: relative;
      }
      .fill {
        width: 140px;
        height: 140px;
        cursor: pointer;
        background-image: url(./image.png);
        background-size: cover;
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
      }
      .hold {
        border: 5px solid #00ff00;
      }
      .hovered{
        border: 3px solid #ff0000;
      }
    </style>
  </head>
  <body>
    <div class="empty">
      <div class="fill" draggable="true"></div>
    </div>
    <div class="empty"></div>
    <div class="empty"></div>
    <div class="empty"></div>
    <div class="empty"></div>

    <script>
      const fill = document.querySelector(".fill");
      // 拖拽开始事件
      fill.addEventListener("dragstart", DragStart);
      function DragStart(e) {
        this.classList.add("hold");
      }
      // 拖拽结束事件
      fill.addEventListener("dragend", DragEnd);
      function DragEnd(e) {
        this.classList.remove("hold");
      }

      const empty = document.querySelectorAll(".empty");
      empty.forEach((item) => {
        // 经过事件
        item.addEventListener("dragover", DragOver);
        // 进入事件
        item.addEventListener("dragenter", DragEnter);
        // 离开事件
        item.addEventListener("dragleave", DragLeave);
        // 拖拽结束事件
        item.addEventListener("drop", Drop);
      })
      // 拖拽经过事件
      function DragOver(e) {
        // 阻止默认事件
        e.preventDefault();
        console.log("拖拽经过");
      }
      // 拖拽进入事件
      function DragEnter(e) {
        console.log("拖拽进入");
        this.classList.add("hovered");
      }
      // 拖拽离开事件
      function DragLeave(e) {
        console.log("拖拽离开");
        this.classList.remove("hovered");
      }
      // 拖拽结束事件
      function Drop(e) {
        console.log("拖拽结束");
        this.className = "empty";
        this.append(fill);
      }
    </script>
  </body>
</html>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于深度学习的鸟类检测识别系统【python源码+Pyqt5界面+数据集+训练代码 MX_003期】

简介&#xff1a; 基于深度学习的鸟类检测识别系统在当今世界中具有广泛的应用前景。系统不仅可以帮助生态学家和保护人员监测和保护鸟类种群&#xff0c;还能在农业管理、城市生态监测以及科学研究领域发挥重要作用。通过自动化的图像识别技术&#xff0c;可以实现对鸟类种类、…

汽车传动系统为汽车动力总成重要组成部分 我国市场参与者数量不断增长

汽车传动系统为汽车动力总成重要组成部分 我国市场参与者数量不断增长 汽车系统主要包括动力系统、制动系统、传动系统、转向系统、行驶系统、燃油供给系统、照明系统以及电器系统。汽车传动系统指能够将发动机产生的动力转化为车辆行驶驱动力的动力传递装置。汽车传动系统为汽…

学生用小台灯什么牌子的好?五大强劲护眼台灯牌子分享

在这个数码时代&#xff0c;人们对屏幕的依赖程度越来越高&#xff0c;尤其是孩子们。他们不仅在学校里需要长时间盯着教科书&#xff0c;还会在学习和娱乐中使用各种数码设备。然而&#xff0c;这也使得眼睛健康问题逐渐凸显&#xff0c;尤其是儿童近视的问题。为了保护视力&a…

Inpaint软件下载附加详细安装教程

​Inpaint是一款由Maxim Gapchenko开发的图像处理软件&#xff0c;它可以帮助用户轻松地去除图像中的水印和其他不需要的元素&#xff0c;这个软件的核心技术是基于图像处理算法的&#xff0c;它可以自动识别图片中的像素&#xff0c;并用周围的颜色进行替换&#xff0c;使得图…

吴恩达深度学习笔记:机器学习(ML)策略(1)(ML strategy(1))1.11-1.12

目录 第三门课 结构化机器学习项目&#xff08;Structuring Machine Learning Projects&#xff09;第一周 机器学习&#xff08;ML&#xff09;策略&#xff08;1&#xff09;&#xff08;ML strategy&#xff08;1&#xff09;&#xff09;1.11 超过人的表现&#xff08;Surp…

Swift Combine — Subject Publishers(PassthroughSubject CurrentValueSubject)

本文主要介绍一下Subject&#xff0c;Subject 本身也是一个 Publisher&#xff0c;其定义如下&#xff1a; public protocol Subject<Output, Failure> : AnyObject, Publisher {func send(_ value: Self.Output)func send(completion: Subscribers.Completion<Self.…

豆浆机水位传感器工作原理

豆浆机水位传感器的工作原理基于光电效应&#xff0c;利用近红外发光二极管和光敏接收器的组合实现液位的精确检测与控制。在豆浆机内部&#xff0c;传感器安装在水箱底部或需要检测液位的位置&#xff0c;起到监测和控制豆浆机水位的重要作用。 传感器包括一个近红外发光二极…

Suno新技能亮相:完美复刻歌手音色,我甚至不敢公开!

之前写过一篇文章 颠覆音乐创作! Suno史诗级更新&#xff0c;随便哼哼就能出一首好听的歌曲&#xff1f; Suno支持上传一段音频或者自己的哼唱进行续创歌曲&#xff0c;这个功能大家有玩出花样嘛&#xff1f; 可能很多人&#xff0c;还不知道这个到底有啥用! 大家先看看这首《满…

如何用Vue3和p5.js绘制交互式3D饼图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 基于p5.js实现色彩轮和饼状图的动态可视化 应用场景 本代码利用p5.js库&#xff0c;创建了一个交互式的色彩轮和饼状图可视化界面。它适用于需要展示颜色信息或数据分布情况的场景&#xff0c;如设计、数据分…

docker通过容器id查看运行命令;Portainer监控管理docker容器

1、docker通过容器id查看运行命令 参考&#xff1a;https://blog.csdn.net/a772304419/article/details/138732138 docker inspect 运行镜像id“Cmd”: [ “–model”, “/qwen-7b”, “–port”, “10860”, “–max-model-len”, “4096”, “–trust-remote-code”, “–t…

【招联消费金融股份】有限公司2024年5月18日【算法开发岗暑期实习】一面试经验分享

招联消费金融股份有限公司2024年5月18日面试经验分享 面试流程&#xff1a;共30多分钟&#xff0c;先3分钟自我介绍&#xff0c;然后细细介绍简历上面的论文和实习信息。问题1&#xff1a;扩散模型的noise schedule有什么研究。问题2&#xff1a;有哪些常见的数学分布问题3&…

jquery动态效果插件之ScrollMagic

ScrollMagic 是一个强大的 JavaScript 库,可以帮助开发者在页面滚动时触发各种动画效果。它支持复杂的滚动交互,非常适合制作富交互的网页。 这里他使用了ScrollMagic的几种滚动效果: 视差滚动效果:页面上的一些元素在滚动时会产生视差滚动效果,即元素以不同的速度移动,营造出…

MES管理系统中的质量管理活动是什么

在制造业的广阔天地中&#xff0c;质量管理如同航船的指南针&#xff0c;指引着产品品质的航行方向。而随着科技的日新月异&#xff0c;MES管理系统在质量管理领域扮演着越来越重要的角色。MES管理系统不仅连接了企业的管理层与车间生产现场&#xff0c;更在质量管理的各个环节…

洗地机性价比高的是哪一款?行内人告诉你

在浏览前&#xff0c;希望您轻触屏幕上方的“关注”按钮&#xff0c;让我后续为您带来更多实用且精彩的内容&#xff0c;感谢您的支持&#xff01; 洗地机作为现在的流行清洁工具&#xff0c;它的魅力之处在于&#xff1a;性价比极高&#xff0c;大多数家庭无需花费过多就能把…

语义分割和目标检测的关系

目录 1.语义分割的目标 2.目标检测的目标 3.两种任务的异同之处 从大方向的任务特点上来说 &#xff08;1&#xff09;物体的位置 &#xff08;2&#xff09;物体的分类 从数据格式来说 (1&#xff09;语义分割的数据格式 (2&#xff09;目标检测的数据格式 1.语义分…

Java面试题之MySQL事务详解

事务是什么 MySQL中的事务&#xff08;Transaction&#xff09;是数据库管理系统执行的一个逻辑操作单元&#xff0c;它是由一系列数据库操作组成的逻辑工作单元。事务是并发控制的单位&#xff0c;也是用户定义的一个操作序列。事务的主要目的是确保数据的完整性和一致性&…

Trying to access array offset on value of type null

主要原因是版本7.4以后PHP解析器会对null类型的下标访问直接报错 背景&#xff1a; laravel框架 同时使用了扩展A和扩展B 扩展A要求 php>7.4,同时扩展B的对null类型的下标访问不兼容php7.4 修改扩展B不太现实&#xff0c;毕竟扩展B中有太多的对null类型的下标访问。 解决…

SQL Server中CROSS APPLY连接操作

在 SQL Server 中&#xff0c;CROSS APPLY 是一个连接操作&#xff0c;它类似于 INNER JOIN&#xff0c;但有一些关键差异&#xff0c;特别是在处理表值函数&#xff08;TVF&#xff09;、行集函数或子查询时。CROSS APPLY 返回对于外部查询中的每一行&#xff0c;在内部查询或…

osi七层网络模型安全加固

应用层加固 应用层的攻击&#xff1a; 1、针对应用层协议的攻击&#xff1a;HTTP攻击、DNS攻击、电子邮件攻击等&#xff0c;利用应用层协议的漏洞&#xff0c;构造恶意数据包&#xff0c;是目标服务器执行恶意代码或暴露敏感信息 HTTP攻击&#xff1a;XSS、CSRF、HTTP头注入…

如何让AI 帮你生成 git 提交信息

在协同开发的项目中&#xff0c;我们肯定避免不了使用git提交代码&#xff0c;所以经常会看到了一些描述不清的提交信息。当遇到种情况时&#xff0c;我们也不必为此责怪开发人员&#xff0c;因为我们确实很难记住你在 git 提交时刚刚做了什么。 Nutlope / aicommits 一个使用 …