php拖拽原理,JS拖拽效果及原理解析

这篇文章主要介绍了如何实现js拖拽效果及原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

元素拖拽分成3个步骤:按下鼠标,移动鼠标,松开鼠标。

拖拽原理:按下拖拽元素后开始监听文档中鼠标移动事件,然后再监听鼠标松开事件;鼠标移动时,元素div要随着鼠标一起移动,需要计算元素div位移的距离(移动的距离=鼠标离可视窗口的位置 – 鼠标在div中相对于左上角的位置)。然后松开鼠标时,删除移动事件和松开事件,元素完成拖拽。

一开始先监听鼠标按下事件mousedown,事件触发执行mouseHandler函数;

div.addEventListener("mousedown",mouseHandler);

进入mouseHandler函数后,进行if else if 的判断,如果是按下事件,就监听鼠标移动和松开事件,这里要用document文档来作为监听对象,如果使用元素div监听时,如果鼠标在移动过程超出了div元素,就无法拖拽元素;

进入移动事件,就把鼠标移动的距离(鼠标离可视窗口的位置 – 鼠标在div中相对于左上角的位置)赋值给元素的left和top,元素就可以随着鼠标移动;

最后进入松开鼠标事件,删除了移动和送开鼠标事件,元素就会停在鼠标松开的位置

关键:元素显示位置=鼠标离可视窗口的位置 – 鼠标相对于在div元素左上角的位置

js代码带注释

var div=document.querySelector("div");

var offsetX,offsetY;  //定义全局变量用于接收鼠标坐标的变量

div.addEventListener("mousedown",mouseHandler);

function mouseHandler(e){ //事件的执行函数自带参数e

if(e.type==="mousedown"){ //e.type是执行事件的类型

offsetX=e.offsetX;

offsetY=e.offsetY;

document.addEventListener("mousemove",mouseHandler)

document.addEventListener("mouseup",mouseHandler) //如果有鼠标移动或松开事件的发生再次执行mouseHandler函数

}else if(e.type==="mousemove"){

div.style.left=e.clientX-offsetX+"px"; //鼠标相对当前可视窗口的坐标 - 相对元素左上角的坐标

div.style.top=e.clientY-offsetY+"px";

}else if(e.type==="mouseup"){

document.removeEventListener("mousemove",mouseHandler);

document.removeEventListener("mouseup",mouseHandler); //删除鼠标移动和鼠标松开事件

}

}

效果如图:

81094277e6a43a91d1178869fedad17c.gif

注意:div元素要设置定位才可以进行移动。

以上就是本文的全部内容,希望对大家的学习有所帮助。

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

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

相关文章

jqGrid细节备注—pager文字的设置,更改默认的提交方式

默认的pager显示的文字,在英文版本下是如下 (file grid.locale-en.js): $.jgrid { defaults : { recordtext: "View {0} - {1} of {2}", emptyrecords: "No records to view", loadtext: "Loading...", pgtext : "Page {0} of …

浅谈拓扑排序

今天来讲讲拓扑排序 度娘告诉我 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样…

makemid+matlab,《MATLAB基础》双语课

MATLAB双语教学视频第17讲MATLAB双语教学视频第18讲Summarizing DataIn this section...“Overview” on page 5-10“Measures of Location” on page 5-10“Measures of Scale” on page 5-11“Shape of a Distribution” on page 5-11OverviewMany MATLAB functions enable y…

php获取页面的可视内容高度,网页制作技巧:获取页面可视区域的高度_css

文章简介:获取页面可视区域高度,获取页面高度,获取滚动条滚动上去的页面高度.function getWH(){ var wh {}; "Height Width".replace(/[^/s]/g,function(a){ var b a.toLowerCase(); wh[b]window["inner".concat(a)] d…

安装与配置-以前的某个程序安装已在安装计算机上创建挂起的文件操作......

今日在Windows XP SP2的计算机上,安装SQL Server 2000 Standard Edition,安装不上,错误信息如下: 文字描述为: 以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机。 解决方法…

带预览图的js切换效果!

效果图: js代码: var isIE (document.all) ? true : false;var $ function (id) {return "string" typeof id ? document.getElementById(id) : id; };var Class {create: function() {return function() { this.initialize.apply(this,…

Python成长之路【第七篇】:Python基础之装饰器

一、什么是装饰器 装饰:装饰既修饰,意指为其他函数添加新功能 器:器既函数 装饰器定义:本质就是函数,功能是为其他函数添加新功能 二、装饰器需要遵循的原则 1、不能修改装饰器的源代码(开放封闭原则&#…

sql数据库与oracle数据库同步,[sql数据库同步]Oracle与SQL Server如何实现表数据同步...

在线QQ客服:1922638专业的SQL Server、MySQL数据库同步软件数据库的Oracle版本为10.2,并安装在Linux系统上。数据库SQL Server的版本是SQL 2005,已安装在Windows XP系统上。现在我们需要做的是在两个数据库表之间同步数据。现在,最…

零食嘴----美食领域的美丽说

零食嘴美食分享社区首页 阿里巴巴参谋长曾鸣曾说过:“淘宝等美丽说模式整整等了两年。不仅在女性领域,阿里希望在各个维度都出现‘美丽说’。” 零食嘴就是美食领域美丽说。 所谓的美丽说模式,是指社会化电子商务分享的模式,在一个…

测试用例设计方法

测试用例设计方法 本篇由本人整理黑盒、白盒、接口测试一系列用例设计方法。 黑盒测试用例设计方法包括等价类划分法、边界值分析法、错误推测法、因果图法、判定表驱动法、正交试验设计法、功能图法、场景图法等。 (一)等价类划分法 定义:等…

Disk Quota磁盘配额

Disk Quota :磁盘配额 限制某个用户或某个组,对某个分区(生效级别是文件系统)的使用能力;由于早期的Unix系统是多用户、多任务的环境,所以一台主机的磁盘会被多个用户使用,某个用户占用大量的磁盘空间会影响其他用户对…

linux进度条脚本,Linux下简易进度条的实现代码

在生活中,进度条是很常见的,那么,进度条是如何实现的呢?首先,进度条的动态是利用人眼视觉暂留效果的。实际上是如下过程:先输出:[ ]表示进度是1%,刷新之后再输出:[ …

[原]Jenkins(二十) jenkins再出发之Error: Opening Robot Framework log failed

错误缘由:使用plugin [public robot framework test results] 生成的HTML文件都无法正常打开.解决方案:Connect on your jenkins url (http://[IP]:8080/) Click on administer Jenkins Click on consol jenkins Copy this into the field and execut…

【016】VS2010连接内置SQL数据库

参考:传智播客.Net培训.net视频教程 >> 【05】第五季 ADO.NET(1-30) 示例代码:sql_test.zip 首先建立一个 控制台 或者 WinForm 项目,然后进行下面的操作! 1. 在 项目 上面右键》添加》新建项 2. 接下…

为什么生产环境都是linux,关于生产环境linux系统中的wheel用户组

本文系统环境:CentOS Linux release 7.7.1908 (Core)一般来说,目前linux系统中的wheel组,默认情况是没有使用到的、如果要使用wheel组,让其有具体的作用,需要结合/etc/pam.d/su文件配置很多在Linux中为了更进一步加强系…

微信小程序----全局变量

全局变量的作用 在微信小程序开发中,会遇到一个很实际的应用场景,就是一个变量会在多个页面进行使用。 例如: 1. 在微信小程序开发中使用高德地图的微信小程序开发,其中key值就需要在多个页面使用; 2. 在微信小程序开…

linux centos-6.5,Linux(CentOS 6.5)安装 mysql

linux下安装软件的方式很多,这里是使用简单而方便的yum来安装一、使用yum 安装mysql服务,客户端1、检查是否已经安装: yum list installed | grep mysql2、 yum list installed | grep MYSQL3、查询结果:4、这是我已经安装的mysq…

amcharts应用

查看选中的软件的下载量,通过amchart报表工具显示出软件日下载量,月下载量以及年下载量,下面简单介绍,amchart在struts2中的应用。 amCharts提供JavaScript/HTML5图表。一套包括串行(列,栏,线&a…

linux下makefile中cp,make与makefile 的理解

当我们写程序过程中存在多个文件之间有复杂的包含关系时,若修改了其中一个源文件,就重新编译所有文件,一般是不必要的,并且当文件很多时,就显得非常笨拙。所有包含该文件的文件需要重新编译,而其它无关系的…

keil用c语言怎么编辑器,用keil软件编写单片机程序的步骤

猜你感兴趣:新手教程:单片机的学习实践步骤运用单片机便是了解单片机硬件结构,以及内部资源的运用,在汇编或C语言中学会各种功用的初始化设置,以及完成各种功用的程序编制。 运用按钮输入信号,发光二极管显…