原生JS的拖拽属性draggable(详解)

news2024/11/16 3:28:52

摘要

作为h5新增的属性draggable,它能够给与一切的html元素拖动的效果。而在这个属性之下,也有着关于拖动效果的各个方法。
而这一篇文章,主要就是说一下关于draggable属性的使用以及工作场景。

1.了解draggable属性的使用

对我来讲,我希望在学习一个知识的时候,最开始就有显而易见的效果,所以我先写一个能够让人感受到draggable属性作用的例子:

对于拖拽,常见的场景一定有两个角色:

(1)拖动的元素A
(2)A被拖进的元素

现在我们在body中创建两个元素:

<body>
  <div id="Adiv" class="A">
    A---拖拽的元素
  </div>
  <div id="Bdiv" class="B">
    B---A被拖进的元素
  </div>
</body>

在这里插入图片描述
现在我们牢记两个点:

(1)拖动的元素要赋予draggable属性,属性值为true
(2)被拖进的元素要在dragover和dragenter事件值中阻止默认行为。先不需要知道这两个事件是做什么的。我们就先这样写!

<body>
  <div draggable="true" id="Adiv" class="A">
    A---拖拽的元素
  </div>
  <div id="Bdiv" class="B">
    B---A被拖进的元素
  </div>
</body>

<script>
  Bdiv.ondragover = function(e){
    e.preventDefault();
  }
  Bdiv.ondragenter = function(e){
    e.preventDefault();
  }
</script>

此时A元素就是可以拖入到B元素里面

(这个时候注意了,仅仅是效果上的拖入,不可能让A真正的成为B的子元素,松开鼠标后还是会恢复原样的)

在这里插入图片描述

2.拖动元素A的事件

Ok,现在知道了两个重要的角色A和B,现在我们先针对于A,在它拖动的过程中,我们可以控制的事件有哪些:

(1)dragstart方法:

该方法在按下鼠标并且移动鼠标时,会在A上触发该方法。同时鼠标的光标会变成禁用的样子,直到拖动到允许放置A的元素上,禁用的效果就会消失

而允许放置A的元素,就是刚刚说的在dragover和dragenter中阻止默认行为

现在我们用一个例子来演示这个方法,我希望在拖动A的时候,能让A本身变成黄色背景:

  Adiv.ondragstart = function(){
    this.style.backgroundColor = 'yellow'
  }

在这里插入图片描述
(2)drag方法

该方法发生在dragstart之后,只要时在拖动过程之中,该方法就会持续触发

  Adiv.ondrag = function(){
    console.log('drag事件');
  }

在这里插入图片描述
(3)dragend方法

该方法是在拖动结束的时候触发,也就是当你拖拽后,松开鼠标的一瞬间触发。


上面的三个方法,就是针对于被拖拽的元素的。也就是赋予draggable属性为true的元素。

一般我们比较常用的方法就是dragstrat方法,通过在这个方法中将被推拽的元素进行保存下来,再进行后续的操作。

3.拖入元素B的事件

针对于拖入元素的事件,它不需要元素具有draggable属性,只要你想,任何元素使用这些方法都是可以的。但要记住上面所说的那两个方法,阻止事件默认行为。

(1)dragenter方法

该方法是指拖拽元素A,在拖入到B之中,B所触发的事件。当然,任何具有draggable属性为true的元素,拖入到B中,都会触发改事件。

切记,这里事件的触发不需要松开鼠标

现在我们用一个例子来说明,当A拖入到B中,我们希望A是真正成为B的子元素:

  Bdiv.ondragenter = function(e){
    e.preventDefault();
    this.appendChild(Adiv);
  }

在这里插入图片描述

(2)dragover方法

该方法只要是,拖拽元素A在目标元素B中移动,就会持续触发。

  Bdiv.ondragover = function(e){
    console.log('dragover事件');
    e.preventDefault();
  }

在这里插入图片描述

(3)dragleave方法

该方法指的是拖拽元素A,在从目标元素B中离开的时候,会触发该方法

这里记住,一定是先进入到B,再离开B的时候触发该事件,也就是说要先触发dragenter方法,才能触发dragleave方法

(4)drop方法

该方法是指,拖拽元素A被放置了目标元素B中的时候触发,那它和dragenter方法的区别在于,该方法需要鼠标松开才会触发。而这个方法也是最常用的方法。

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

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

相关文章

【单片机基础】初始51单片机

文章目录学习单片机需要掌握的基础知识1、用一句话说透什么是单片机&#xff1a;2、单片机上集成了什么&#xff1f;3、STC89C51/52单片机过时了吗&#xff1f;4、STC89C51和STC89C52有什么区别&#xff1f;5、单片机时序的概念&#xff08;基础知识很重要&#xff09;6、单片机…

基于功能安全的车载计算平台开发:系统层面

相对于功能安全概念阶段&#xff0c;系统阶段更专注于产品的详细设计&#xff0c;涉及系统工程、安全工程和架构设计等不同技术领域。同时&#xff0c;系统阶段也经常扮演着供应链上、下游功能安全的DIA交互阶段&#xff0c;是功能安全中非常重要且考验技术水平的阶段。 01 应…

微服务框架 SpringCloud微服务架构 8 Gateway 网关 8.6 过滤器链执行顺序

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构8 Gateway 网关8.6 过滤器链执行顺序8.6.1 过滤器执行顺序8.6.2 总结8 Gat…

【毕业设计】大数据房价数据分析可视化 - python

文章目录0 前言1 课题背景2 数据爬取2.1 爬虫简介2.2 房价爬取3 数据可视化分析3.1 ECharts3.2 相关可视化图表4 最后0 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#x1f525; 对毕设有任何疑问都可以问学长哦! 这两…

深度讲解风险策略的调优|附实操案例

量化风控审核过程中的通过率在贷前策略中是一大重要的内容&#xff0c;另外一个是逾期率。二者之间的因果关系就是通过率高低变化决定了逾期率风险的走势&#xff0c;通过率决定了逾期率的结果&#xff0c;而逾期率又对通过率起到了一个制衡的作用。 我们在本周早前详细谈过这个…

先验 后验 似然估计

一、完备事件组 设E是随机试验&#xff0c;Ω是相应的样本空间&#xff0c;A1&#xff0c;A2&#xff0c;...An为Ω的一个事件组&#xff0c;若 &#xff08;1&#xff09;AiAj&#xff08;ij&#xff09; &#xff08;2&#xff09;A1A2...AnΩ 则称A1A2...An为样本空间的…

web安全之MySQL手工注入的原理讲解和实验分析

目录 前提知识 靶场搭建 手工注入 高权限注入 sql注入之文件读写 基础防御 前提知识 数据库及sql语句知识&#xff0c;web相关知识。union合并查询的两个特征&#xff1a;前后查询互不干扰&#xff0c;前后查询的字段可以不同但是数量必须一致。order by 通过测试来猜解表…

解决SpringBoot整合Mybatis和Mybatis-Plus不能公用(版本兼容性问题)

1 前言 虽然Mybatis-Plus很好使&#xff0c;可以帮助我们生成CRUD的接口&#xff0c;但是有的情况下我们需要联合其他表进行多表查询&#xff0c;这时候Mybatis可以手写SQL的优势就体现出来了&#xff0c;一般在开发中&#xff0c;很多项目都是Mybatis和Mybatis-Plus公用的&am…

Markdowm使用手册

Markdown使用手册 目录Markdown使用手册一、基础语法1.1 书写各级标题1.2 字体加粗/斜体1.2.1 字体加粗1.2.2 字体倾斜1.3 线条使用1.3.1 删除线1.3.2 高亮线1.3.3 下划线二、插入工具2.1 插入代码2.1.1 插入某一行的代码2.1.2 插入整块的代码2.2 插入链接2.3 插入数学公式2.4 …

1546_AURIX_TC275_CPU子系统_指令耗时以及程序存储接口

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 这里接触到了几种测试的方式。其中一个是反复执行同一个命令&#xff0c;看看执行之间的间隔。执行的时候&#xff0c;命令是有一定顺序的。这样&#xff0c;有时候流水线等特性会导致效率…

【Java并发入门】03 互斥锁(上):解决原子性问题

原子性问题的源头是线程切换 Q&#xff1a;如果禁用 CPU 线程切换是不是就解决这个问题了&#xff1f; A&#xff1a;单核 CPU 可行&#xff0c;但到了多核 CPU 的时候&#xff0c;有可能是不同的核在处理同一个变量&#xff0c;即便不切换线程&#xff0c;也有问题。 所以&a…

C++代码基本内存操作及原理

文章目录前言操作系统内存地址空间基本数据类型sizeof运算符指针运算内存分配与回收堆与栈malloc/new与free/delete基本类型的指针操作类定义中的内存使用前言 ​ C凭借其指针变量可以直接操作内存而得到了非常高的效率和程序性能&#xff0c;在一种编程语言里独树一帜。当然&…

网络变压器工厂:了解POE POE+ 网络变压器(网络隔离滤波器)

Hqst盈盛&#xff08;华强盛&#xff09;电子导读&#xff1a;这一节给大家分享&#xff1a;POE POE POE 网络变压器(网络滤波器&#xff0c;网络隔离变压器&#xff09;的相关知识--poe poe 与POE简介及相关标准&#xff1b; 一、网络变压器 POE、 POE 与POE简介 POE 是Power …

Day17-购物车页面-收货地址-把address信息存储到vuex中

1.将address信息存储到vuex中&#xff1a; 我的操作&#xff1a; 1》在 store 目录中&#xff0c;创建用户相关的 vuex 模块&#xff0c;命名为 user.js&#xff1a; ①&#xff1a;新建user.js文件 ②&#xff1a;为user.js编写内容 2》在 store/store.js 模块中&#xff0c…

typora安装和配置PicGo图床

typora安装和配置PicGo图床typora安装和配置PicGo图床typora安装安装picgo图床配置picgo图床图床服务器picgo配置七牛云typora安装和配置PicGo图床 typora安装 windows安装typora 参考&#xff1a;https://www.bilibili.com/read/cv19476097/ m1 mac安装typora比较简单&…

数据结构-栈ArrayDeque的实现

优雅&#xff0c;实在是太优雅了 能把复杂的东西简单化就是功底。 我为何有如此感慨&#xff0c;了解ArrayDeque的实现你就知道&#xff0c;今天我们要讲的是以栈为思想而实现的ArrayDeque&#xff0c;我们都知道栈是先进后出&#xff0c;和队列相反&#xff0c;如下图&#x…

二叉树的中序遍历三种解法(递归+迭代+线索化)

文章目录递归迭代线索二叉树解法传送门&#xff1a; 添加链接描述 给你一颗二叉树&#xff0c;让你实现中序的遍历 递归 递归没什么好说的&#xff0c;直接无脑递归即可&#xff0c;时间复杂度&#xff1a;O&#xff08;n&#xff09;&#xff0c;空间复杂度&#xff1a;O&am…

搭建环境AI画图stable-diffusion

目录简介环境准备安装conda(方式1)安装conda&#xff08;方式2&#xff0c;推荐&#xff09;验证conda安装成功安装stable-diffusion的环境简介 本文旨在记录过程&#xff0c;偶然看见一个AI画图的&#xff0c;体验看看。 stable-diffusion是一个输入简单图片&#xff0c;输出…

【Java难点攻克】「Guava RateLimiter」针对于限流器的入门到实战和源码原理分析

限流器的思路和算法 如果让你来造一个限流器&#xff0c;有啥想法&#xff1f; 漏桶算法 用一个固定大小的队列。比如设置限流为5qps&#xff0c;1s可以接受5个请求&#xff1b;那我们就造一个大小为5的队列&#xff0c;如果队列为满了&#xff0c;就拒绝请求&#xff1b;如…

JRebelXRebel的配置和使用(进阶篇)

JRebel&XRebel的配置和使用嘚吧嘚设置JRebel快捷键XRebel使用嘚吧嘚 之前简单介绍了JRebel&XRebel的安装和使用&#xff0c;不了解的朋友可以补补课&#x1f606;。 JRebel&XRebel这款插件不仅仅可以用来热部署&#xff0c;所以继续分享一下这款插件的相关使用&a…