关于拖拽功能

写在前面

提及拖拽,我们去实践的时候,总是想要依赖第三方工具,有些场景下第三方拖拽库确实方便;有些场景使用第三方拖拽库反而复杂化了

自己手动实现拖拽的demo

提示:可以看下打印信息,知道了拖拽主体(被拖拽)A数据信息,又知道的要放在位置B数据的信息,操作一下数据,视图自然就更新了

需要补一些课:

  1. preventDefault是个什么东西?别一上来就是阻止默认事件,什么是默认事件?
  2. dataTransfer是什么?
<template>
  <div class="container">
    <div class="config-left">
      <div
        v-for="item in floorConfigListShow"
        :key="item.id"
      >
        <div
          class="content"
          @drop="onUsedDrop($event, item)"
          @dragover="allowDrop($event)"
        >
          <div
            class="item"
            draggable="true"
            @dragstart="onUsedDragStart($event, item)"
          >
            
          </div>     
        </div>
      </div>
    </div>

    <div class="config-right">
      <div
        @drop="onUnusedDrop($event)"
        @dragover="allowDrop($event)"
      >
        <div
          class="item"
          draggable="true"
          v-for="item in showUnusedButtons"
          :key="item.id"
          @dragstart="onUnusedDragStart($event, item)"
        >
          {{ item.id }}
        </div>
           
      </div>
    </div>
  </div>
  
</template>

<script>

export default {
  name: "ElevatorConfigPanel",
  components: {
    
  },
  data() {
    return {
      floorConfigListShow: [{id: 1, name: "A"}, {id: 2, name: 'B'}],
      showUnusedButtons: [{id: 1}, {id: 2}]
    };
  },
  methods: {
    /**
     * 阻止默认方式,否则是无法移动元素的
     * 默认是无法将元素放到其他元素上。
     */
    allowDrop(e) {
      e.preventDefault();
    },
    /**
     * 开始拖拽
     */
    onUsedDragStart(e, info) {
      console.log('已配置区域的拖拽', e);
      e.dataTransfer.setData('info', JSON.stringify(info));
    },
    /**
     * 左侧drop事件
     */
    onUsedDrop(e, item) {
      e.preventDefault();
      let info = JSON.parse(e.dataTransfer.getData('info'));
      console.log("info", info);
      console.log("floor", item);
    },
    /**
     * 右侧开始拖拽
     * @param {*} e
     * @param {*} info
     */
    onUnusedDragStart(e, info) {
      e.dataTransfer.setData('info', JSON.stringify(info));
    },
    /**
     * 右侧drop事件事件
     */
    onUnusedDrop(e) {
      e.preventDefault();
      let info = JSON.parse(e.dataTransfer.getData('info'));
      console.log('右侧drop时间', info);
    }
   
  }
};
</script>

<style lang="less" scoped>
.container {
  display: flex;
  margin-left: 100px;
  padding: 10px;
  width: 700px;
  height: 500px;
  border: 1px dashed red;
  .config-left {
    width: 50%;
    height: 100%;
    border: 1px dashed yellow;
    .content {
      width: 100px;
      height: 100px;
      .item {
        width: 100%;
        height: 100%;
        text-align:center;
        border: 1px solid white;
      }
    }
  }
  .config-right {
    width: 50%;
    height: 100%;
    border: 1px dashed blue;
    .item {
        width: 100px;
        height: 100px;
        text-align:center;
        border: 1px solid white;
      }
  }
}
</style>

在这里插入图片描述
右边移动到左边:
在这里插入图片描述

左边移动到右边:
在这里插入图片描述

例如:
在语言模型中,编码器和解码器都是由一个个的 Transformer 组件拼接在一起形成的。

提示:这里可以添加技术名词解释

例如:

  • Bert
  • GPT 初代
  • GPT-2
  • GPT-3
  • ChatGPT

技术细节:Js中拖拽(拉)事件(drag 和 drop)

HTML5专门提供了拖拽功能,刀耕火种的岁月里据说用的是mouseover等事件(我没去了解,说新的)

浏览器兼容性

链接放这里,后面看到这篇文章可以去看看最新的支持情况
在这里插入图片描述

拖拽Api的介绍

拖拽流程

可以拖动dom在浏览器中进行移动。
过程叙述:用户可使用鼠标选择可拖拽(draggable)元素,将元素拖拽到可放置(droppable)元素,并释放鼠标按钮以放置这些元素。拖拽操作期间,会有一个可拖拽元素的半透明快照跟随着鼠标指针

1.dragstart事件

dragstart类似于鼠标按下事件:当元素开始被拖拽的时候触发的事件
作用于:被拖拽的元素

2.dragenter事件

dragenter类似于鼠标进入元素的事件:当拖拽的元素进入目标元素的上方时,触发的事件
作用于:目标元素

3.dragover事件

dragover类似于鼠标在某元素上的事件:拖拽元素在目标元素上移动的时候触发的事件
作用于:目标元素

4.drop事件(必须要dragover事件触发)

drop类似于鼠标松开的事件:被拖拽的元素在目标元素上,鼠标放开触发的事件
作用于:目标元素

5.dragend事件

类似于鼠标松开的事件:当拖拽完成后触发的事件
作用于:被拖拽的元素

MDN关于拖拽的解析

链接: MDN关于拖拽的解析

相关属性

1.draggable(让元素可拖拽)

draggable解释说明:

draggable用于标识元素是否允许使用 拖放操作 API (en-US) 拖动。
draggable的取值如下:
true,表示元素可以被拖动 ;
false,表示元素不可以被拖动 ;
如果该属性没有设值,则默认值 为 auto,表示使用浏览器定义的默认行为。

dataTransfer(对应的拖拽媒介)

拖拽拽对象用来传递的媒介(存储被拖拽元素的数据信息或其他信息),使用一般为Event.dataTransfer

1.DataTransfer.clearData()

删除与给定类型关联的数据。类型参数是可选的。如果类型为空或未指定,则删除与所有类型关联的数据。如果指定类型的数据不存在,或者 data
transfer 中不包含任何数据,则该方法不会产生任何效果。

2.DataTransfer.getData()

检索给定类型的数据,如果该类型的数据不存在或 data transfer 不包含数据,则返回空字符串。

3.DataTransfer.setData()

设置给定类型的数据。如果该类型的数据不存在,则将其添加到末尾,以便类型列表中的最后一项将是新的格式。如果该类型的数据已经存在,则在相同位置替换现有数据。

// 在event事件对象上调用 dataTransfer 通过 setData(名称1,值1)
// 进行传递数据,通过 getData(名称1) 获取值;类似于sessionStorage(本地存储)
event.dataTransfer.setData('drag_text',event.target.innerHTML) 
4.DataTransfer.setDragImage()

用于设置自定义的拖动图像。

preventDefault(阻止默认事件)

不可以将一个元素放到另一个元素上面就是默认事件---->阻止默认事件,就是让这一操作可以正常进行

在这里的主要作用是,在dragstart这个事件的时候,不能使用 preventDefault 阻止默认事件, 使用了preventDefault的后果就是,不能进行拖拽!!!!!!!!

Event.effectAllowed (拖拽的效果)

拖拽效果的一个设置

第三方拖拽库

VueGridLayout

链接: link

import VueGridLayout from 'vue-grid-layout'; 

 components: {
    GridLayout: VueGridLayout.GridLayout,
    GridItem: VueGridLayout.GridItem
  }
  <grid-layout
                :layout.sync="layout"
                :col-num="12"
                :row-height="36"
                :margin="[0, 0]"
                :is-draggable="draggable"
                :is-resizable="resizable"
                :is-bounded="bounded"
                :vertical-compact="true"
                :use-css-transforms="true"
                @layout-updated="layoutUpdatedEvent"
              >
                <grid-item
                  v-for="item in layout"
                  :static="item.static"
                  :x="item.x"
                  :y="item.y"
                  :w="item.w"
                  :h="item.h"
                  :i="item.i"
                  :key="item.i"
                  drag-allow-from=".vue-draggable-handle"
                >
                 
                </grid-item>
              </grid-layout>



   layout:[
       {"x": 0, "y": 1, "w": 12, "h": 1, "i": "0", static: false},
        {"x": 0, "y": 0, "w": 12, "h": 1, "i": "1", static: false},
        {"x": 0, "y": 2, "w": 12, "h": 1, "i": "2", static: false},
        {"x": 0, "y": 3, "w": 12, "h": 1, "i": "3", static: false}
      ]

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

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

相关文章

latex中\documentclass[preprint,review,12pt]{elsarticle}的详细解释

在LaTeX中&#xff0c;\documentclass 是一个命令&#xff0c;用于指定文档所使用的文档类。文档类定义了文档的总体结构、格式和样式。elsarticle 是一个常用的文档类&#xff0c;它主要用于在Elsevier出版的期刊上提交论文。 详细解释 \documentclass[preprint,review,12pt…

基于Spring Boot+Vue的论坛网站

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

ViewModel 原理

在现代Android应用开发中&#xff0c;ViewModel是架构组件库的一个关键部分&#xff0c;它在提高应用的稳定性和性能方面发挥着重要作用。在这篇文章中&#xff0c;我们将深入探讨ViewModel的工作原理和最佳实践。 ViewModel简介 ViewModel是Android Jetpack架构组件的一部分…

2024.03.03 健身打卡第 14 天

成功只有一个——按照自己的方式&#xff0c;去度过人生 2024.03.03 健身打卡第 14 天

[Vulnhub]靶场 Red

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 …

前端el-date-picker传递的日期格式不是自己想要的格式

解决方法&#xff1a; 添加format和value-format属性进行解决。 format“YYYY-MM-DD” value-format“YYYY-MM-DD” 注意&#xff1a;日期格式要用大写&#xff01;&#xff01;&#xff01;&#xff01;用小写会出现错误&#xff0c;不能回填选择的日期&#xff0c;会直接传入…

TCP/IP-常用网络协议自定义结构体

1、TCP/IP模型&#xff1a; 2、TCP/IP- 各层级网络协议&#xff08;从下往上&#xff09;&#xff1a; 1&#xff09;数据链路层&#xff1a; ARP: 地址解析协议&#xff0c;用IP地址获取MAC地址的协议&#xff0c;通过ip的地址获取mac地 …

带你快速初步了解Python字典

1.字典 定义多个数据一般使用列表&#xff0c;但是列表也存在一定的缺陷 若列表中有多个元素&#xff0c;想访问其中某个元素&#xff0c;比较不方便 定义字典的语法&#xff1a;{key1:value1, key2:value2, key3:value3......} 字典和列表习惯的使用场景&#xff1a; &qu…

PCSA时钟控制集成之时钟门控级别

这一部分描述了&#xff1a; • 时钟门控的级别。 • 实现最大效果的时钟门位置。 • 实现有效和高效时钟门控的集成方法。 时钟树是由时钟缓冲器构建的&#xff0c;这些缓冲器在时钟源&#xff08;时钟输入或PLL&#xff09;与时钟终端&#xff08;寄存器或RAM&#xff09…

软件测试项目实战,某购物车/测试点分析实战(详细步骤)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 第一步&#xff1…

SpringBoot整合OAuth2 实现单点登录 SSO

单点登录&#xff1a; SSO服务端和SSO客户端直接是通过授权以后发放Token的形式来访问受保护的资源相对于浏览器来说&#xff0c;业务系统是服务端&#xff0c;相对于SSO服务端来说&#xff0c;业务系统是客户端浏览器和业务系统之间通过会话正常访问不是每次浏览器请求都要去S…

Pyglet图形界面版2048游戏——详尽实现教程(上)

目录 Pyglet图形界面版2048游戏 一、色块展示 二、绘制标题 三、方阵色块 四、界面布局 五、键鼠操作 Pyglet图形界面版2048游戏 一、色块展示 准备好游戏数字的背景颜色&#xff0c;如以下12种&#xff1a; COLOR ((206, 194, 180, 255), (237, 229, 218, 255), (23…

详解算法的时间复杂度和空间复杂度!

目录 ​编辑 1. 算法效率 2. 时间复杂度 2.1 时间复杂度的概念 2.2 大O的表示渐进法 2.3 一个栗子 3. 空间复杂度 4. 常见复杂度对比 5. 完结散花 ​​​​​​​ 悟已往之不谏&#xff0c;知来者犹可追 创作不易&#xff0c;宝子们&#xff01;如果这篇文章对你们有…

C++之queue和deque

1、queue queue&#xff08;队列&#xff09;&#xff0c;一种数据结构&#xff0c;可以让某些数据结构的操作变得简单。队列&#xff08;queue&#xff09;最大的特点就是先进先出。就是说先放入queue容器的元素一定是要先出队列之后&#xff0c;比它后进入队列的元素才能够出…

二维码门楼牌管理系统技术服务详解:性能标准与反光膜要求

文章目录 前言一、二维码门楼牌管理系统技术服务的性能要求二、反光膜的性能标准三、制作完成的反光膜表层保护 前言 随着科技的快速发展&#xff0c;二维码门楼牌管理系统在现代化城市管理中扮演着越来越重要的角色。这一系统不仅提高了管理效率&#xff0c;还为市民提供了更…

Autosar Appl介绍

AUTOSAR架构中的应用层 AUTOSAR 应用层构成AUTOSAR 架构中的最顶层,被认为对所有车辆应用至关重要。AUTOSAR 标准使用“组件”概念指定应用层实现。 在谈论应用层实现时,应该考虑的三个最重要的部分是: AUTOSAR 应用软件组件这些组件的 AUTOSAR 端口AUTOSAR 端口接口 AUTOS…

steam++加速问题:出现显示443端口被 vmware-hostd(9860)占用的错误。

目录 前言&#xff1a; 正文&#xff1a; 前言&#xff1a; 使用Steam对GitHub进行加速处理时&#xff0c;建议使用2.8.6版本。 下载地址如下&#xff1a;Release 2.8.6 BeyondDimension/SteamTools GitHub 下载时注意自己的系统位数 正文&#xff1a; 使用GitHub时会使…

任务拆解的艺术

1.任务拆解背后的深层逻辑 任务拆解背后的深层逻辑主要涉及以下几个方面&#xff1a; 分解复杂性&#xff1a; 任务拆解的首要目的是分解复杂的大目标或任务&#xff0c;将其分解成更小、更具体的部分。这种分解有助于减少问题的复杂性&#xff0c;使其更易于理解和解决。通过将…

DC-2靶机详解

写写自己打DC-2的过程 使用工具 kali DC-2的靶机下载地址为&#xff1a;https://www.vulnhub.com/entry/dc-2,311/ 环境配置。 Kali和DC-2都设置为NAT模式&#xff0c;都为仅主机模式也可以。 信息收集 arp-scan -l nmap -sn 192.168.236.0/24 获取靶机ip&#xff1a;192.16…

K8S之Deployment的介绍和使用

Deployment的理论和实操 Deployment控制器&#xff1a;概念、原理解读概述工作原理 编写Deployment资源清单文件使用案例&#xff1a;创建一个web站点Deployment管理pod&#xff1a;扩容、缩容通过deployment管理应用&#xff0c;实现扩容&#xff0c;把副本数变成3通过deploym…