【JS】原生js实现拖拽功能基本思路

实现四种原生JavaScript拖拽效果 htmltable {th, td {th {pre {简介:本文深入解析了如何使用原生JavaScript来实现四种不同的拖拽效果。介绍了实现浏览器内拖拽、可超出浏览器边界的拖拽、点击元素头部进行拖拽以及结合头部点击和边界超出的拖拽效果。通过监听mousedownmousemove和mouseup事件,结合对鼠标位置和元素位置的计算,展示了如何控制元素在页面上的移动。 阅读详情

  如果要设置物体拖拽,那么必须使用三个事件,并且这三个事件的使用顺序不能颠倒。

  1. onmousedown:鼠标按下事件
  2. onmousemove:鼠标移动事件
  3. onmouseup:鼠标抬起事件

  拖拽的基本原理就是根据鼠标的移动来移动被拖拽的元素。鼠标的移动也就是x、y坐标的变化;元素的移动就是style.position的 top和left的改变。当然,并不是任何时候移动鼠标都要造成元素的移动,而应该判断鼠标左键的状态是否为按下状态,是否是在可拖拽的元素上按下的。

基本思路如下:
拖拽状态 = 0鼠标在元素上按下的时候{    
    拖拽状态 = 1    
    记录下鼠标的x和y坐标    
    记录下元素的x和y坐标    
   } 
 鼠标在元素上移动的时候{    
    如果拖拽状态是0就什么也不做。    
    如果拖拽状态是1,那么    
    元素y = 现在鼠标y - 原来鼠标y + 原来元素y    
    元素x = 现在鼠标x - 原来鼠标x + 原来元素x    
    }     
 鼠标在任何时候放开的时候{    
    拖拽状态 = 0    
}

部分实例代码:

HTML部分
<div class="calculator" id="drag">**********</div>

CSS部分

.calculator {
	position: absolute; /*设置绝对定位,脱离文档流,便于拖拽*/
	display: block;
	width: 218px;
	height: 280px;
	cursor: move;	/*鼠标呈拖拽状*/
}

JS部分

window.onload = function() {
	//拖拽功能(主要是触发三个事件:onmousedown\onmousemove\onmouseup)
	var drag = document.getElementById('drag');

	//点击某物体时,用drag对象即可,move和up是全局区域,也就是整个文档通用,应该使用document对象而不是drag对象(否则,采用drag对象时物体只能往右方或下方移动)
	drag.onmousedown = function(e) {
		var e = e || window.event; //兼容ie浏览器
		var diffX = e.clientX - drag.offsetLeft; //鼠标点击物体那一刻相对于物体左侧边框的距离=点击时的位置相对于浏览器最左边的距离-物体左边框相对于浏览器最左边的距离
		var diffY = e.clientY - drag.offsetTop;

		/*低版本ie bug:物体被拖出浏览器可是窗口外部时,还会出现滚动条,
			解决方法是采用ie浏览器独有的2个方法setCapture()\releaseCapture(),这两个方法,
			可以让鼠标滑动到浏览器外部也可以捕获到事件,而我们的bug就是当鼠标移出浏览器的时候,
			限制超过的功能就失效了。用这个方法,即可解决这个问题。注:这两个方法用于onmousedown和onmouseup中*/
			if(typeof drag.setCapture!='undefined'){
				drag.setCapture();
			}

		document.onmousemove = function(e) {
			var e = e || window.event; //兼容ie浏览器
			var left=e.clientX-diffX;
			var top=e.clientY-diffY;

			//控制拖拽物体的范围只能在浏览器视窗内,不允许出现滚动条
			if(left<0){
				left=0;
			}else if(left >window.innerWidth-drag.offsetWidth){
				left = window.innerWidth-drag.offsetWidth;
			}
			if(top<0){
				top=0;
			}else if(top >window.innerHeight-drag.offsetHeight){
				top = window.innerHeight-drag.offsetHeight;
			}

			//移动时重新得到物体的距离,解决拖动时出现晃动的现象
			drag.style.left = left+ 'px';
			drag.style.top = top + 'px';
		};
		document.onmouseup = function(e) { //当鼠标弹起来的时候不再移动
			this.onmousemove = null;
			this.onmouseup = null; //预防鼠标弹起来后还会循环(即预防鼠标放上去的时候还会移动)

			//修复低版本ie bug
			if(typeof drag.releaseCapture!='undefined'){
				drag.releaseCapture();
			}
		};
	};
};

Author:致知

Sign:路漫漫其修远兮,吾将上下而求索。

JavaScript实现原生鼠标拖拽方框选中功能 通过本章节的介绍,我们了解了鼠标拖拽操作的实现原理,包括使用mousedownmousemove和mouseup事件来捕捉用户的拖拽动作,并根据这些动作动态更新目标元素的位置和大小。我们还学会了如何在拖拽过程中绘制和更新覆盖层以显示选区方框,并在拖拽结束时进行相关处理。下一章节将探讨如何在用户界面上绘制选中的方框区域,并优化绘制性能。在本章中,我们深入探讨了如何通过JavaScript实现鼠标事件处理中的边界限制和目标元素检查。 阅读详情

相关推荐

原生js实现四种拖拽效果

四种拖拽效果:只可在浏览器中拖拽;可超出浏览器拖拽;点击头部在浏览器中拖拽;点击头部可超出浏览器拖拽

如何实现原生 JS 的拖拽效果

前言: 关于“拖拽”,其实是一个老生常谈的需求了,并且还是一个非常经典的面试题。之前在项目中拖拽的场景都是直接使用轮子,虽然很快就能完成设计需求,但是这个的原理一直都是我十分想去深入了解的一部分。正好在今天的项目中再一次碰到了这个需求,我觉得是时候去探索一下它了。tips: 本文不会使用 Draggable 去实现,而是会采用原生的 JS 鼠标移动,鼠标点击等事件去完成。并且你需要明确知道的一点是...

我本可以容忍阳光,如果我不曾见过太阳,然而阳光已使我荒凉,成为更新的荒凉。 1393

JSP 可拖拽浮动窗口

一款javascript开发的浮动窗口,支持最小化,支持鼠标拖拽,可以设定弹出事件,可以进行初始化位置以及大小。完全面向对象编程,简单易用的一款javascript的控件

一文带你了解原生js实现拖拽的具体细节

本文通过图文的方式介绍了使用原生js实现元素拖拽的方式,包含了逻辑分析,边界处理等。

qq_52569656的博客 2388

JS拖动鼠标画出方框实现鼠标选区的方法

主要介绍了JS拖动鼠标画出方框实现鼠标选区的方法,涉及javascript鼠标事件及页面元素样式的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下

原生JS实现拖拽效果

本文实例为大家分享了JS实现拖拽效果的具体代码,供大家参考,具体内容如下 想要让整个元素移动需要三个事件: 鼠标按下 onmousedown 鼠标移动 onmousemove 鼠标抬起 onmouseup html <div id=login class=login> <!-- 点击title拖拽 --> <div id=title class=login-title>登录会员 <!-- title end --> <span><a>关

如何用原生 JS 实现拖拽效果

大厂技术高级前端Node进阶点击上方程序员成长指北,关注公众号回复1,加入高级Node交流群前言: 关于“拖拽”,其实是一个老生常谈的需求了,并且还是一个非常经典的面试题。之前在项目中拖拽的场景都是直接使用轮子,虽然很快就能完成设计需求,但是这个的原理一直都是我十分想去深入了解的一部分。正好在今天的项目中再一次碰到了这个需求,我觉得是时候去探索一下它了。tips: 本文不会使用 Drag...

程序员成长指北 952

南邮-软件设计实验(C++版)

南邮软件设计 A档 一、分数统计 课题内容:   设计一个分数统计程序。包括学生信息的输入输出以及排序。通过该课题全面熟悉数组、字符串、文件的使用,掌握程序设计的基本方法及友好界面的设计。 课题要求: (1)输入某班级学生的姓名、分数; (2)对(1)的分数进行降幂排列并输出; (3)具有输入输出界面。 示例代码: #include<bits/stdc++.h> using...

Dainelcw 1万+

原生JavaScript实现拖拽功能

原生JavaScript实现拖拽功能

太阳与星辰的博客 2179

股票行情接口,最全的接入方法

股票行情接口一般有两种,一种是WebSocket,一种是http,通过WebSocket可以获取逐笔的股票tick数据,实时并且高效;通过http接口可以获取股票行情接口中的股票历史数据;WebSocket是一种高效的双向通信协议,它允许数据的实时推送,避免了不断的轮询请求。其次,WebSocket允许您订阅特定的数据源或股票数据产品,只接收您感兴趣的信息,提高了数据的效率和可用性。通过接入股票行情数据的HTTP接口,您可以将数据导入到自己的分析工具或系统中,进行更深入的数据分析、模型构建和决策支持。

apifinance的博客 3428

【26美赛D题】2026美赛数学建模(MCM/ICM)思路解析及代码分享

2026美赛D题数学建模竞赛思路解析摘要:本文针对美赛D题提供系统性解决方案,提出四层建模框架(数据层、机理层、模型层、决策层),强调逻辑闭环比模型复杂度更重要。包含通用建模步骤:指标体系构建、状态评估、动态预测和策略优化,并给出Python基础代码框架。论文建议采用七段式结构,突出从现实问题到决策方案的完整闭环。核心在于通过数据驱动方法揭示问题规律,结合多源数据整合、系统行为建模和风险评估,最终形成可落地的决策建议,体现数学建模解决实际问题的能力。

一键难忘的博客 1085

原生js实现拖拽功能基本思路

如果要设置物体拖拽,那么必须使用三个事件,并且这三个事件的使用顺序不能颠倒。 onmousedown:鼠标按下事件onmousemove:鼠标移动事件onmouseup:鼠标抬起事件   拖拽的基本原理就是根据鼠标的移动来移动被拖拽的元素。鼠标的移动也就是x、y坐标的变化;元素的移动就是style.position的 top和left的改变。当然,并不是任何时候移动

cynwang的博客 1万+

2025华为od机试真题B卷【版本管理】JavaScript实现

在 软件版本管理中,版本号由点分割的数字组成,例如 1.2.3 和 2.8。现在,你需要编写一个函数,计算两个版本号之间的可用版本号个数。这里的可用版本号指的是所有满足 version1<x<version2的版本号x的个数。若 version1 >=version2 返回0.,

MISAYAONE的博客 254

【拖拽】拖动原理 拖动基本思路

** 拖拽 ** 必须使用三个事件: 1.onmousedown:鼠标按下事件 2.onmousemove:鼠标移动事件 3.onmouseup:鼠标抬起事件 1、要绝对定位,脱离文档流才能移动。 2、绑定拖拽的元素,移动和鼠标松开后是对document的绑定。 3、点击:a= 获取当前鼠标坐标、b =div距浏览器距离、c = 鼠标在div内部距离=a-b。 移动:通过 a - c 建立鼠标与div的关系,防止鼠标超出div。 ** 拖拽判断: ** 0鼠标在元素上按下的时候判断: 拖拽状态 = 1

Wave_explosion的博客 870

上位机图像处理和嵌入式模块部署(qmacvisual获取边界点)

【声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在图像处理中,解决了分割的问题之后,下面就是属性信息的提取。在这其中,有一种属性是非常重要的 ,那就是外界轮廓的边界点获取。这个边界点,可以用来计算长度,也可以用来进行直线、圆的拟合,具体的用途取决于现场的实际使用场景。目前qmacvisual支持对边界点的提取,相关控件可以直接用来提取边界点。

嵌入式-老费,一个分享专业嵌入式知识的blog 884

利用GAT(图论分析工具箱)构建并分析大脑结构协变网络学习笔记

前言 前面我学习了利用DTI构建白质纤维脑网络,并采用GRETNA计算了小世界网络属性。阅读文献发现可以利用灰质体积或皮层指标(皮层厚度、折叠指数、沟深)等构建结构协变网络再进行网络拓扑属性的计算。因此,我采用前面提取的灰质体积和皮质数据进行了结构协变网络分析,特此写下笔记以便后面的学习。 一、数据准备 二、构建结构协变网络 三、全局属性的统计分析 四、局部属性的统计分析 五、网络攻击分析 六、度的分布 ..................

weixin_52073820的博客 7498

原生JS实现拖拽移动与缩放

原生JS实现拖拽移动与缩放思路1.基本样式css部分HTML部分2.拖拽功能3.缩放功能 思路 缩放的原理:鼠标按下去时,获取当前的鼠标位置和盒子的宽高,鼠标按下并移动后获取此时的鼠标位置。 拖拽后的宽高=初始宽高+(拖拽后鼠标距离屏幕的位置 - 第一次按下时鼠标距离屏幕的位置)。 1.基本样式 css部分 <style> .box { width: 100px; height: 100px; backgro

Silence_555的博客 1775

【数据分析八步法】将模糊需求转化为可验证的分析问题

国内访问Huggingface官方源常遇网络问题,可通过切换国内镜像提升下载速度。三种配置方式:1)设置HF_ENDPOINT环境变量;2)在from_pretrained中直接指定镜像参数;3)修改本地Huggingface配置文件。常用镜像包括hf-mirror.com、阿里云ModelScope和清华镜像源。注意镜像同步延迟、私有模型限制,建议配合huggingface-cli工具使用,必要时取消代理设置。合理配置镜像源可显著改善Huggingface生态使用体验。

Mr数据杨 858

原生JS拖拽从原理到实现

拖拽在js中挺常用的,不过目前有很多做拖拽的插件,H5也以及支持了拖拽事件,不过了解一下拖拽的原理也是有必要的,其实用原生js实现拖拽并不难。 首先讲一下拖拽的原理,假设浏览器上有一个元素(元素已经绝对定位了),起始位置为(mx, my),即距浏览器上方mypx,左方mxpx,如下图 拖拽元素的过程无非就是改变该元素的left值和top值,那么left和top值设为多少才对呢,其实这个...

daydream13580130043的博客 1791

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

原生JS鼠标拖拽的原理及实现

JS鼠标拖拽的原理及实现 原生JS鼠标拖拽的原理及实现。 我们在网页操作的时候,经常用到鼠标拖拽元素的行为。今天就来讨论一下鼠标拖拽元素的原理及简单的实现过程。 首先鼠标拖拽要用到三大事件。 onmousedown:鼠标选择元素 onmousemove:鼠标移动元素 onmouseup:释放元素 也就是先用鼠标点击元素,然后拖拽元素到某一位置,释放元素的过程。在这个选择,移动...

哈哈哈 1678

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

原生js实现拖拽效果,js拖拽原理

之前用原生js中的H5中的api:gragstart,graggover,drop写的拖拽发现不能微调位置,于是改为用原生js来写拖拽效果。 我们一共会用到三个事件:mosedown,mosemove以及moseup。 第一种理解方式:(更易于理解) 拖拽: 1.鼠标摁下可以开始拖拽 2.记录摁下时的鼠标位置和元素位置 3...

MFWSCQ的博客 1696

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

原生JavaScript实现课程表拖拽功能(保姆级教程)

本教程将详细讲解一个基于原生JavaScript实现的课程表拖拽系统。科目拖拽功能:支持将左侧科目拖拽到右侧课程表可视化反馈:拖拽过程中的悬停效果、放置动画数据持久化:使用LocalStorage保存课程表状态删除功能:每个课程项内置删除按钮响应式布局:采用Flex布局适配不同屏幕最终实现效果:左侧科目列表可拖拽右侧5列课程表(周一到周五)拖拽时显示半透明占位效果成功放置后显示带删除按钮的科目卡片刷新页面自动恢复上次状态纯原生实现:不依赖任何第三方库完整数据流:从UI交互到本地存储的闭环。

2301_80119335的博客 1460

原生 JavaScript 实现拖拽排序功能:从基础到优化

支持鼠标拖拽元素改变顺序拖拽过程中提供视觉反馈实时更新元素序号数据与视图同步更新简洁美观的 UI 设计拖拽时元素会有轻微放大和阴影效果被拖拽元素经过其他元素时,目标元素会显示背景色变化松开鼠标后,所有元素会平滑调整到新位置控制台会输出排序后的结果本文详细介绍了如何使用原生 JavaScript 和 HTML5 拖拽 API 实现拖拽排序功能。通过监听拖拽事件,我们可以实时调整元素位置并同步更新数据,从而实现直观的排序交互。

ccc1006的博客 1287
上一篇: 【CSS】CSS选择器优先级及!important属性
下一篇: 【Servlet】web.xml中servlet的配置方法
励志故事
博客等级 码龄12年 99粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值