前端开发攻略---拖动归类,将元素拖拽到相应位置

news2024/12/23 11:54:02

1、演示

2、代码

<!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>
      body {
        height: 95vh;
        display: flex;
        align-items: center;
        justify-content: center;
      }
      .main {
        display: flex;
      }
      .drag_ {
        width: 100px;
        height: 100px;
        display: flex;
        color: #fff;
        font-size: 20px;
        font-weight: bold;
        margin-right: 20px;
        border-radius: 7px;
        align-items: center;
        justify-content: center;
        background-color: bisque;
        -webkit-user-drag: element;
      }

      #drag1,
      .drag1 {
        background-color: red !important;
      }

      #drag2,
      .drag2 {
        background-color: pink !important;
      }

      #drag3,
      .drag3 {
        background-color: #409eff !important;
      }

      .files {
        width: 400px;
        min-height: 300px;
        border-radius: 5px;
        background-color: rgba(62, 196, 253, 0.376);
        margin-top: 100px;
        transition: all 0.8s;
      }

      .fileshover {
        transition: all 0.8s;
        background-color: black;
      }

      .folder {
        display: flex;
        flex-wrap: wrap;
        min-height: 300px;
        padding: 10px;
        gap: 10px;
      }

      .item_box {
        width: 50px;
        height: 50px;
        color: #fff;
        display: flex;
        font-size: 20px;
        font-weight: bold;
        border-radius: 5px;
        align-items: center;
        background: #ffe4c4;
        justify-content: center;
      }
    </style>
  </head>

  <body>
    <div>
      <div class="main">
        <div draggable="true" class="drag_">1</div>
        <div draggable="true" id="drag1" class="drag_">2</div>
        <div draggable="true" id="drag2" class="drag_">3</div>
        <div draggable="true" id="drag3" class="drag_">4</div>
      </div>
      <div class="files">
        <div class="folder"></div>
      </div>
    </div>

    <script>
      let data;
      let className;
      let index = null;
      const draggable = document.querySelectorAll(".drag_");
      const files = document.querySelector(".files");
      const folder = document.querySelector(".folder");
      // 开始拖拽事件
      for (let i = 0; i < draggable.length; i++) {
        draggable[i].addEventListener("dragstart", (event) => {
          index = i;
          data = event.target.innerText;
          className = event.target.id;
          event.dataTransfer.setData("name", data);
        });
      }

      // 拖拽元素,进入目标区域,事件处理程序
      files.addEventListener("dragover", (event) => {
        if (index == null) return;
        event.target.classList.add("fileshover");
        event.preventDefault();
      });

      // 拖拽离开事件处理程序
      files.addEventListener("dragleave", (event) => {
        event.target.classList.remove("fileshover");
      });

      // 拖拽释放的事件处理程序
      files.addEventListener("drop", (event) => {
        if (index == null) return;
        let div = document.createElement("div");
        div.innerText = data;
        div.className = `item_box ${className}`;
        event.target.classList.remove("fileshover");
        folder.appendChild(div);
        let parent = document.querySelector(".main");
        parent.removeChild(draggable[index]);
        index = null;
      });
    </script>
  </body>
</html>

3、JS代码解析

  1. dataclassNameindex:这些是全局变量声明。data 用来存储拖动的文本内容,className 存储拖动元素的类名,index 用来记录拖动元素的索引,初始值为 null

  2. draggablefilesfolder:这些是从文档中获取的元素引用。draggable 是所有带有 class 为 .drag_ 的元素集合,files 是具有 .files 类的元素,folder 是具有 .folder 类的元素。

  3. 第一个事件监听器:通过循环遍历所有 .drag_ 元素,为每个元素添加 dragstart 事件监听器。当元素开始拖拽时,会执行回调函数,其中记录了当前拖拽元素的文本内容到 data,类名到 className,并设置了 event.dataTransfer.setData("name", data),这是为了在拖放操作中传递数据。

  4. 第二个事件监听器:监听 .files 区域的 dragover 事件。这里阻止了默认的拖放行为,并且为 .files 区域添加了 .fileshover 类,用于指示拖放的目标区域。

  5. 第三个事件监听器:监听 .files 区域的 dragleave 事件。当拖拽元素离开目标区域时,移除 .fileshover 类。

  6. 第四个事件监听器:监听 .files 区域的 drop 事件。当拖拽元素放置到目标区域时,创建一个新的 <div> 元素,将拖拽元素的文本内容显示在该 <div> 中,并设置对应的类名。然后将这个新的 <div> 添加到 .folder 区域,并从父元素中移除被拖拽的元素。最后,重置 index 为 null,表示当前没有正在拖拽的元素。

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

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

相关文章

001-谷粒商城-微服务剖析

1、架构图 还是很强的&#xff0c;该有的都有 2、微服务模块 SpringCloudAlibaba组件包括 SentinelNacosRocketMQSeata 搭配SpringCloudAlibaba组件 OpenFeignGateWayRibbn gateway使用了SpringWebFlux&#xff0c;前几天研究到&#xff0c;为什么springboot不直接使用Spri…

私人密码管理储存库!Bitwarden 部署安装教程

日常生活中我们每个人都会拥有大量网站或社交平台帐号&#xff0c;时间久远了密码很容易忘记。因此&#xff0c;像 1Password 等密码管理 同步 一键登录的工具成为了很多人的首选。 然而 1Password 毕竟要付费&#xff0c;也有人会担心这类工具有隐私泄露的风险。其实&#…

【昇腾产品应用】英码科技EA500I基于昇腾Mind SDK实现实时人体关键点检测

在教育、体育、安防、交通、医疗等领域中&#xff0c;实时人体关键点检测应用发挥着至关重要的作用&#xff0c;比如在体育训练时&#xff0c;实时人体关键点检测可以精确、实时地捕捉运动员的动作&#xff0c;从而进行动作分析和优化&#xff1b;在安防应用场景中&#xff0c;…

AI边缘计算盒子+ThingSense管理平台,推动明厨亮灶智慧监管新篇章

背景随着“互联网”时代的浪潮汹涌而至&#xff0c;国家及各地政府纷纷在“十四五”规划中明确指出&#xff0c;强化食品安全管理&#xff0c;利用技术手段实现智慧监管是刻不容缓的任务。为此&#xff0c;各地正加速推进“互联网明厨亮灶”的建设步伐&#xff0c;实现系统对接…

VideoComposer: Compositional Video Synthesis with Motion Controllability

decompose videos into three distinct types of conditions: textual conditions, spatial conditions, temperal conditions 条件的内容&#xff1a; a. textual condition: coarse grained visual content and motions, 使用openclip vit-H/14的text encoder b. spatial co…

社会工程渗透测试教程(二)

原文&#xff1a;annas-archive.org/md5/db987a87e1478b8a8617c263c631b477 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第六章&#xff1a;通过有效的威胁建模确保价值 Richard Ackroyd&#xff0c;随机风暴有限公司高级安全工程师 大多数客户意识到他们需要社会…

Linux文件chattr/lsattr/Linux权限(搭建权限测试环境实战)引申到内部原理及Linux删除系统文件原理-7539字详谈

企业高薪思维: 每一个阶段什么时候是最重要的&#xff1f;&#xff08;快速定位&#xff09; 1.学习最重要的事情 &#xff08;学生阶段&#xff0c;找工作前阶段&#xff09; 2.家庭&#xff0c;女朋友 &#xff08;工作阶段/学生阶段&#xff0c;学习不受到影响&#xff09; …

网络常识!!!

网络常识!!! 一:网络的发展史二:关键的概念三:IP地址四:端口号二级目录二级目录二级目录二级目录三级目录 一:网络的发展史 从游戏方面发展历程进行理解: 从单机游戏-----游戏支持局域网对战-------游戏支持广域网对战-------移动端 (1)局域网对战:在同一个网吧里,不同的游戏…

快速部署stable diffusion@Ubuntu

Stable Diffusion可以根据文本描述生成相关的图像&#xff0c;是当前最热门的文生图模型。 在Ubuntu下&#xff0c;可以选择快速安装&#xff0c;或者手动一步步安装。 快速安装 使用文档中的方法&#xff0c;先下载一个sh文件&#xff0c;然后执行这个文件&#xff0c;就自动…

UUPSUpgradeable部署合约和升级合约

文章目录 写一个合约1. 使用代理部署 并添加拥有者2. 没有name number为103. 使用代理升级部署 填写上面代理的合约地址4. 合约地址没有变&#xff0c;但是添加了name&#xff0c;并且保存了number的属性值 写一个合约 // SPDX-License-Identifier: MIT // Compatible with Op…

GNU Radio使用Python Block实现模块运行时间间隔获取

文章目录 前言一、timestamp_sender 模块二、timestamp_receiver 模块三、测试 前言 GNU Radio 中没有实现测量两个模块之间的时间测量模块&#xff0c;本文记录一下通过 python block 制作一个很简单的测时 block。 一、timestamp_sender 模块 使用 python block 做一个发送…

pyCharm导入pyspark中的sparkconf和sparkcontext错误

背景&#xff1a;学习黑马程序员python课程的pyspark实战部分时按照下图导入pysark包时发现sparkconf和sparkcontext无法导入和运行。 首先想到是不是在CMD窗口下载的pySpark路径及安装是否正确&#xff1f; 通过下图发现第三方库都安装正确&#xff0c;然后就考虑库的路径&a…

今日arXiv最热NLP大模型论文:浙江大学:蒸一蒸,多Agent变成单一模型,效果更好

“团结就是力量”&#xff0c;面对复杂多变的现实环境&#xff0c;multi-agent应运而生。相较于单打独斗的single-agent&#xff0c;multi-agent集结了多个功能各异的LLM&#xff0c;共同攻克难关。然而&#xff0c;这种协同作战的方式也带来了沉重的推理负担&#xff0c;限制了…

那些早期的iax和SIP软电话软件界面,看看你见过几个?

目录 一些iax/sip软电话UI图片SIP软电话的界面怎么设计SIP软电话的功能有哪些 早期voip发展中&#xff0c;很多公司开发了自己的SIP软电话&#xff0c;有些已经不存在了&#xff0c;有些还在使用中&#xff0c;比如X-Lite&#xff0c;Zoiper等等&#xff0c;我们一起看看这些早…

代码随想录算法训练营第三十九天| 62.不同路径、63.不同路径II

系列文章目录 目录 系列文章目录62.不同路径①回溯算法&#xff08;超时&#xff09;②深度搜索&#xff08;超时&#xff09;③动态规划 63. 不同路径 II动态规划 62.不同路径 ①回溯算法&#xff08;超时&#xff09; 本质是穷举。 class Solution {int[] chose new int[…

CB2-2CARD之Debian(Bookworm)安装Gnome看CCTV

CB2-2CARD之Debian&#xff08;Bookworm&#xff09;安装Gnome看CCTV 1. 源由2. 需求3. Debian系统桌面3.1 系统安装3.2 磁盘扩容3.3 系统更新3.4 Gnome安装 4. 测试4.1 CCTV网页测试4.2 系统空闲测试4.3 Firefox CPU占用率测试 5. 总结 1. 源由 近些年来&#xff0c;随着国内…

笔试狂刷--Day4(滑动窗口+贪心)

大家好,我是LvZi,今天带来笔试狂刷--Day4 一.简写单词 1.题目链接:简写单词 2.题目分析: 一个简单的模拟 3.代码实现: 1.先整体读取,再处理 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(St…

35K的鸿蒙音视频开发岗位面经分享~

一个月前&#xff0c;阿里云在官网音视频终端 SDK 栏目发布适配 HarmonyOS NEXT 的操作文档和 SDK&#xff0c;官宣 MediaBox 音视频终端 SDK 全面适配 HarmonyOS NEXT。 此外&#xff0c;阿里云播放器 SDK 也在华为开发者联盟官网鸿蒙生态伙伴 SDK 专区同步上线&#xff0c;面…

【快速上手ESP32(基于ESP-IDFVSCode)】08-SPI

SPI SPI&#xff0c;全称Serial Peripheral Interface&#xff0c;即串行外设接口&#xff0c;是一种同步串行接口技术。它最初由Motorola公司推出&#xff0c;并在其MC68HCXX系列处理器上首次定义。SPI接口主要应用在EEPROM、FLASH、实时时钟、AD转换器&#xff0c;以及数字信…

【MySQL】InnoDB与MyISAM存储引擎的区别与选择

存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式 。 存储引擎是基于表的&#xff0c;而不是基于库的&#xff0c;所以存储引擎也可被称为表类型。我们可以在创建表的时候&#xff0c;来指定选择的存储引擎&#xff0c;如果没有指定将自动选择默认的存储引擎。…