原生JS-鼠标拖动

原生JS-鼠标拖动

  • 通过鼠标的点击事件
  • 通过h5的属性

通过鼠标的点击事件


步骤: 1. 鼠标按下div。 2. 鼠标移动,div跟着移动
原生js,实现拖拽效果。1. 给被拖拽的div加上 onmousedown 鼠标【按下事件】。鼠标按下的时候,开始监听鼠标的移动。2. div按下后,全局监听鼠标【移动事件】。鼠标移动后,给div赋值。绝对定位。3. 全局监听鼠标【抬起事件】。当鼠标抬起的时候。取消监听鼠标的【移动】【抬起】事件。
<!DOCTYPE html>
<html><head>    <meta charset="UTF-8"><title>Drag</title><style>#box {width: 60px;height: 60px;background-color: red;position: absolute; }</style></head><body><div id="box"></div>  </body><script>// 一共就两步://      1. 鼠标按下div//      2. 鼠标移动,div跟着移动// 原生js,实现拖拽效果。// 1. 给被拖拽的div加上 onmousedown 鼠标【按下事件】。// 鼠标按下的时候,开始监听鼠标的移动。// 2. div按下后,全局监听鼠标【移动事件】。// 鼠标移动后,给div赋值。绝对定位。// 3. 全局监听鼠标【抬起事件】。// 当鼠标抬起的时候。取消监听鼠标的【移动】【抬起】事件。window.onload = function () {	let divDom = document.getElementById("box");// 一. 监听div按下的事件divDom.onmousedown = function (ev) {let oevent = ev || event;let distanceX = oevent.clientX - divDom.offsetLeft;let distanceY = oevent.clientY - divDom.offsetTop;// 二. 全局监听鼠标的移动事件。document.onmousemove = function (ev) {let oevent = ev || event;divDom.style.left = oevent.clientX - distanceX + 'px';divDom.style.top = oevent.clientY - distanceY + 'px';};// 三. 全局监听鼠标的抬起事件。当鼠标抬起的时候,给去全局监听。document.onmouseup = function () {document.onmousemove = null;document.onmouseup = null;};};};</script>
</html>

通过h5的属性

添加 draggable="true" 就能拖动。然后记录位置。

这种方式简单的多,只需要添加属性,然后记录位置就行。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title><style>div{width: 100px;height: 100px;background-color: red;position: absolute;left: 0px;top: 0px;}</style>
</head>
<body><div draggable="true"></div><script>var div = document.getElementsByTagName('div')[0];var X = 0,Y = 0;div.ondragstart = function(e){   X = e.clientX;  //记录鼠标点下的位置。(因为div的定位点,是左上角 0,0)Y = e.clientY;}div.ondragend = function(e){var X1 = e.clientX - X; //结束的位置,减去鼠标点下的位置,那么得到的位置,就是div落下的位置。var Y1 = e.clientY - Y;div.style.left = div.offsetLeft + X1 + 'px'; //这里还需要加上 div当前的位置, 累加。 div.style.top = div.offsetTop + Y1 + 'px';}</script>
</body>
</html>

这个属性最常见的用法是把A元素,拖动到B容器中。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title><style>#div{width: 100px;height: 100px;background-color: red;position: absolute;left: 0px;top: 0px;}#div2{width: 200px;height: 200px;background-color: green;margin-top:200px;}</style>
</head>
<body><div id="div" draggable="true"></div><div id="div2"></div><script>// 获取可以拖动的元素const draggable = document.getElementById('div');// 获取容器元素const droppable = document.getElementById('div2');// 容器元素droppable.addEventListener('dragover', dragOver);droppable.addEventListener('drop', dragDrop);function dragOver(e) {e.preventDefault();}function dragDrop(e) {// 添加DOM this.append(draggable);}</script>
</body>
</html>

A移动前
在这里插入图片描述

A移动后
在这里插入图片描述
可以写点样式,用于显示隐藏div

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv3 | 核心主干网络,特征图解码,多类损失函数详解

https://zhuanlan.zhihu.com/p/76802514) 文章目录 1. 核心改进1.1主干网络1.2 特征图解码1.2.1 检测框&#xff08;位置&#xff0c;宽高&#xff09;解码1.2.2 检测置信度解码1.2.3 类别解码 1.3 训练损失函数1.3.1 正负样本定义1.3.2 损失函数 1. 核心改进 1.1主干网络 更…

Python操作Hive数据仓库

Python连接Hive 1、Python如何连接Hive&#xff1f;2、Python连接Hive数据仓库 1、Python如何连接Hive&#xff1f; Python连接Hive需要使用Impala查询引擎 由于Hadoop集群节点间使用RPC通信&#xff0c;所以需要配置Thrift依赖环境 Thrift是一个轻量级、跨语言的RPC框架&…

【AI视野·今日Sound 声学论文速览 第二十一期】Mon, 9 Oct 2023

AI视野今日CS.Sound 声学论文速览 Mon, 9 Oct 2023 Totally 13 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;MBTFNet,用于歌声质量增强的多带宽时频神经网络 (from 西工大 Audio, Speech and Language Processing Group (ASLPNPU),) Daily…

go语言教程4:switch和map

文章目录 switchswitch匹配字典 go语言教程&#xff1a;安装入门➡️for循环➡️数组、切片和指针 switch和map&#xff0c;一个是控制流&#xff0c;一个是数据结构&#xff0c;之所以把两个不同类型的知识点放在一起讲解&#xff0c;是因为二者有着极其相似的运行逻辑&#…

linux下安装ffmpeg的详细教程、ffmpeg is not installed

1、下载解压 wget http://www.ffmpeg.org/releases/ffmpeg-6.0.tar.gz tar -zxvf ffmpeg-6.0.tar.gz 2、 进入解压后目录,输入如下命令/usr/local/ffmpeg为自己指定的安装目录 cd ffmpeg-6.0 ./configure --prefix/usr/local/ffmpeg make sudo make install 3、配置变量 v…

神经网络(MLP多层感知器)

分类 神经网络可以分为多种不同的类型&#xff0c;下面列举一些常见的神经网络类型&#xff1a; 前馈神经网络&#xff08;Feedforward Neural Network&#xff09;&#xff1a;前馈神经网络是最基本的神经网络类型&#xff0c;也是深度学习中最常见的神经网络类型。它由若干个…

IDEA使用模板创建webapp时,web.xml文件版本过低的一种解决方法

创建完成后的web.xml 文件&#xff0c;版本太低 <!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>Archetype Created Web Appl…

Unity设计模式——模板模式

模板方法模式&#xff0c;定义一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使得 子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 Abstract Class 是抽象类&#xff0c;其实也就是一抽象模板&#xff0c;定义并实现了一个模版方法。这…

主从Reactor高并发服务器

文章目录 Reactor模型的典型分类单Reactor单线程单Reactor多线程多Reactor多线程本项目中实现的主从Reactor One Thread One Loop各模型的优点与缺点 项目分解Reactor服务器模块BufferSocketChannelEpollerTimerWheelEventLoopAnyConnectionAcceptorLoopThreadLoopThreadPoolTc…

嵌入式Linux裸机开发(五)中断管理

系列文章目录 文章目录 系列文章目录前言STM32 中断系统IMX6U中断控制8个中断GIC中断控制器GIC介绍中断IDGIC逻辑分块GIC协处理器 中断使能中断优先级 重点代码分析官方SDK函数start.S文件自行编写中断驱动文件 前言 最近在学习中发现&#xff0c;学Linux嵌入式不仅是对Linux的…

c语言终点站--文件操作

前言&#xff1a; 为什么要学习文件操作呢&#xff1f;想要知道这个问题&#xff0c;我们就需要先了解什么是数据的可持久化。 那么什么是数据的可持久化呢&#xff1f;数据的可持久化就是把内存中的数据对象永久的保存在电脑的磁盘文件中&#xff0c;将程序数据在持久状态和…

Three.js如何计算3DObject的2D包围框?

推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 在Three.js应用开发中&#xff0c;有时你可能需要为3D场景中的网格绘制2D的包围框&#xff0c;应该怎么做&#xff1f; 朴素的想法是把网格的3D包围框投影到屏幕空间&#xff0c;例如&#xff0c;下图中的绿色框 3D包围框…