• 鼠标的拖拽原理


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

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

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

    [javascript] view plain copy
     
    1. obj.onmousedown = function(e) {  
    2.       //..........  
    3. }  

    ②鼠标移动会触发onmousemove事件

    [javascript] view plain copy
     
    1. obj.onmousemove = function(e) {  
    2.     //......  
    3. }  

    ③鼠标松开会触发onmouseup事件

    [javascript] view plain copy
     
    1. obj.onmouseup = function() {  
    2.      //......  
    3. }  


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

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

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

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

    [javascript] view plain copy
     
    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.   
    7.     //初始位置的X,Y 坐标  
    8.     initX = obj.offsetLeft;  
    9.     initY = obj.offsetTop;  
    10.   
    11.     //表示鼠标已按下  
    12.     flag = true;  
    13. }  
    14. obj.onmousemove = function(e) {  
    15.     // 确保鼠标已按下  
    16.     if(flag) {  
    17.         var mouseMoveX = e.pageX,mouseMoveY = e.pageY;  
    18.         this.style.left = parseInt(mouseMoveX) - parseInt(mouseDownX) + parseInt(initX) + "px";  
    19.         this.style.top = parseInt(mouseMoveY) - parseInt(mouseDownY) + parseInt(initY) + "px";  
    20.     }  
    21.       
    22. }  
    23. obj.onmouseup = function() {  
    24.     //标识已松开鼠标  
    25.     flag = false;  
    26. }  

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

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

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

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

  • 相关阅读:
    Git在window的使用(TortoiseGit)之一
    redis——学习之路五(简单的C#使用redis)
    Redis——学习之路四(初识主从配置)
    Redis——学习之路三(初识redis config配置)
    Redis——学习之路二(初识redis服务器命令)
    Redis——学习之路一(初识redis)
    博客搬家通知
    JAVA WEB项目中使用并改造editor.md实现Markdown编辑器
    SQLite及ORMlite在WebApp中的使用
    日期选择插件clndr的使用
  • 原文地址:https://www.cnblogs.com/yangguoe/p/8527262.html
Copyright © 2020-2023  润新知