拖拽功能主要是用在让用户做一些自定义的动作,比如拖动排序,弹出框拖动移动等等,效果还是蛮不错的。下面讲解一下拖拽的原理,希望可以帮助到有需要的朋友!

一、拖拽的流程动作
①鼠标按下
②鼠标移动
③鼠标松开

二、拖拽流程中对应的JS事件
①鼠标按下会触发onmousedown事件

  1. obj.onmousedown = function(e) {
  2. //..........
  3. }

②鼠标移动会触发onmousemove事件

  1. obj.onmousemove = function(e) {
  2. //......
  3. }

③鼠标松开会触发onmouseup事件

  1. obj.onmouseup = function() {
  2. //......
  3. }

三、实现的原理讲解
拖拽其实是通过获取鼠标移动的距离来实现的,即计算移动前的位置的坐标(x,y)与移动中的位置的坐标(x,y)差值。
当鼠标按下或鼠标移动时,都可以获取到当前鼠标的位置,即移动前的位置与移动中的位置。
那么上面①与②的代码就应该变成这样

  1. var mouseDownX,mouseDownY  // 因在移动中需计算鼠标的偏移需要用到鼠标按下时的坐标,固声明称全局变量
  2. obj.onmousedown = function(e) {
  3. mouseDownX = e.pageX;
  4. mouseDownY = e.pageY;
  5. }
  6. obj.onmousemove = function(e) {
  7. var mouseMoveX = e.pageX,mouseMoveY = e.pageY;
  8. }

移动前与移动后坐标有了,那么计算偏移,先看下图

很明显移动后元素的X坐标为  鼠标移动后的X坐标 - 鼠标按下的X坐标 + 元素的初始X坐标
Y坐标为  鼠标移动后的Y坐标 - 鼠标按下的Y坐标 + 元素的初始Y坐标
把新的 X,Y 替换元素的 X,Y 就搞定了。
那么代码就应该更换为:

  1. var mouseDownX,mouseDownY,initX,initY,flag = false;
  2. obj.onmousedown = function(e) {
  3. //鼠标按下时的鼠标所在的X,Y坐标
  4. mouseDownX = e.pageX;
  5. mouseDownY = e.pageY;
  6. //初始位置的X,Y 坐标
  7. initX = obj.offsetLeft;
  8. initY = obj.offsetTop;
  9. //表示鼠标已按下
  10. flag = true;
  11. }
  12. obj.onmousemove = function(e) {
  13. // 确保鼠标已按下
  14. if(flag) {
  15. var mouseMoveX = e.pageX,mouseMoveY = e.pageY;
  16. this.style.left = parseInt(mouseMoveX) - parseInt(mouseDownX) + parseInt(initX) + "px";
  17. this.style.top = parseInt(mouseMoveY) - parseInt(mouseDownY) + parseInt(initY) + "px";
  18. }
  19. }
  20. obj.onmouseup = function() {
  21. //标识已松开鼠标
  22. flag = false;
  23. }

需要注意的事,如果用jquery库来写的话三个事件为mousedown、mousemove、mouseup,名称稍微有点差别。

还有一点,被拖拽的元素的样式要设置成绝对或相对位置才有效果。

至此,最简单的元素拖拽功能就讲完了~~~~

如有不正确之处欢迎大家指正!

JS鼠标的拖拽原理的更多相关文章

  1. js实现可拖拽的div

    前言 下午忙里偷闲想写一个可拖拽的例子,留在脑海里一直都是三个事件mouseDown,mouseUp,mouseMove, 但从没有动手实践过,今天想起了自己实践了并学习了张鑫旭的demo实现. 学习 ...

  2. php和js实现文件拖拽上传

    Dropzone.js实现文件拖拽上传 http://www.sucaihuo.com/php/1399.html demo http://www.sucaihuo.com/jquery/13/139 ...

  3. JS事件中级 --- 拖拽

    http://bbs.zhinengshe.com/thread-1200-1-1.html 要求:实现div块的拖拽 原理:拖拽过程中鼠标点和div块的相对位置保持不变. 需要理解三点: 1. 为什 ...

  4. js拖拽原理和碰撞原理

    拖拽的原理onmousedown 选择元素onmousemove 移动元素onmouseup 释放元素 1:如果拖拽的时候有文字:被选中,会产生问题原因:当鼠标按下的时如果页面中有文字或者图片被选中的 ...

  5. js拖拽原理及简单实现(渣渣自学)

    第一步 首先简单分析下需求吧,我们就是想实现鼠标拖拽带颜色的方块时,让方块停留在鼠标松开的位置,需要计算的就是拖拽前的坐标和拖拽后的坐标,鼠标移动后相对于原位置的偏移量=目标元素的偏移量,根据这个等式 ...

  6. JS拖拽原理

    实现拖拽效果主要跟鼠标的三个事件有关: onmousedown : 选择要拖拽的元素 onmousemove : 移动元素 onmouseup : 释放元素 三个事件的关系: obj.onmoused ...

  7. 原生js实现div拖拽+按下鼠标计时

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <style> ...

  8. 纯JS实现可拖拽表单

    转载注明出处!!! 转载注明出处!!! 转载注明出处!!! 因为要用到可拖拽表单,个人要比较喜欢自己动手,不怎么喜欢在不懂实现或者原理的情况下用插件,所以查找资料实现了一个. 思路:放入:用mouse ...

  9. js仿QQ拖拽删除

    原生js实现仿QQ拖拽删除交互,无需任何依赖. 项目演示请看这里, gitHub请移步这里. 由于源码很长,所以贴到最下面了. 效果截图如下: 核心思想呢,就是点击圆点的时候全屏覆盖个canvas,在 ...

随机推荐

  1. 【2-SAT】【并查集】ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined) D. The Door Problem

    再来回顾一下2-SAT,把每个点拆点为是和非两个点,如果a能一定推出非b,则a->非b,其他情况同理. 然后跑强连通分量分解,保证a和非a不在同一个分量里面. 这题由于你建完图发现都是双向边,所 ...

  2. [HDU6271]Master of Connected Component

    [HDU6271]Master of Connected Component 题目大意: 给出两棵\(n(n\le10000)\)个结点的以\(1\)为根的树\(T_a,T_b\),和一个拥有\(m( ...

  3. Problem I: 打印金字塔

    #include<stdio.h> int main() { int n,i,j,k; scanf("%d",&n); ;i<=n;i++) { ;j&l ...

  4. 分布式缓存DistributedCache的使用

    分布式缓存用于将使用的小文件首先分发到各个datanode节点上,然后利用map/reduce阶段的setup()方法将文件内容读入内存,加快程序执行.具体实现方法如下: http://demievi ...

  5. Delphi Thread

    Thread给几点说明:1.MyThread的实例作为TForm1的成员变量2.不要使用Form1这个全局变量,线程中可要使用它的Handle,你可以在Form中创建MyThread的实例时把Hand ...

  6. weblogic下同域不同端口下的跨域问题解决

      环境:同一台服务器,同一个Weblogic应用程序,分别建两个域,两个域IP一样,端口不同.一个域里放Web应用A,一个放Web应用B. 操作:用户访问A程序的时候,A程序会返回一个链接,让用户去 ...

  7. 渗透笔记0x00

    今天朋友在入侵织梦的网站系统,通过最新的Exp获得了织梦后台的账号和密码 账号:admin 密码:abc123456 但是,找来找去找不到后台,就让我提权试试. 我看了下:http://pxc.nci ...

  8. 转:http2基本中文翻译

    https://github.com/fex-team/http2-spec/blob/master/HTTP2%E4%B8%AD%E8%8B%B1%E5%AF%B9%E7%85%A7%E7%89%8 ...

  9. javascript - 闭包之一些常见的写法

    /** * 防御型分号 */ ; (function () { //code.... console.log('一开始,我自己执行了!!!'); })(); /** * 形参 -> 实参 * 定 ...

  10. Tornado框架的初步使用

    Tornado的搭建很简单,使用pip,或者下载源码均可.   我们先看一个最简单的程序: import tornado.ioloop import tornado.web class MainHan ...