Top

拖拽系列一、JavaScript实现简单的拖拽效果

    前端拖拽相关应用汇总

在现实生活中就像男孩子牵着(拖着)女朋友的手穿过马路;从马路的一端走到另一端这种场景很常见;

而在前端开发中拖拽效果也算是前端开发中应用最常见、最普遍的特效;其拖拽涉及知识点也是非常广泛;

具体体现在如一个轻量级web弹窗层layerui拖拽实现;

登录百度帐号页面https://www.baidu.com/拽实现;

拖拽式表单设计器http://formbuild.leipi.org/拖拽实现;

Ace – Responsive Admin拖拽排序等这些效果的实现都离不开拖拽

因此在前端项目的开发中前端开发人员掌握拖拽知识点必不可少的一个环节;这里楼主列举目前知道的拖拽相关应用;难免挂一漏万;欢迎您的补充;

下面将从实现一个最简单拖拽效果说起

    拖拽实现原理流程操作

理解拖拽的核心就是掌握鼠标相关的事件及鼠标操作事件的相关流程操作

①mousedown 鼠标按下时操作流程;

  * 设置鼠标按下mousedown标识 isDraging
  * 获取目标元素初始化的位置 initObjX initObjY
  * 获取鼠标初始化的位置 initMouseX initMouseY
  * 通过目标元素初始化的位置与鼠标按下时的位置计算元素偏移距离objX/objY
  * 设置元素的位置(objX/objY)

②mousemove 鼠标移动时操作流程(动态改变目标元素left/top值;请参考图2-1)

     * 目标元素移动之前确保鼠标按下标识isDraging为true

  * 目标元素水平方向移动距离(moveX) = 当前鼠标移动时位置 - 鼠标按下时鼠标初始化位置 + 鼠标按下时目标元素水平方向初始化位置initObjX

  * 目标元素垂直方向移动距离(moveY) = 当前鼠标移动时位置 - 鼠标按下时鼠标初始化位置 + 鼠标按下时目标元素垂直方向初始化位置initObjX

      * 设置目标元素水平方向(moveX/moveY)移动距离

③mouseup鼠标离开时操作流程

  * 停止动画 mouseup鼠标离开事件绑定在document上,原因是鼠标拖动过快离开时有可能不在目标元素上

    拖拽实现原理代码细节说明

1.获取CSS样式声明对象 [object CSSStyleDeclaration]

    * getComputedStyle、currentStyle 返回CSS样式声明对象([object CSSStyleDeclaration]) 只读
    * getComputedStyle 支持IE9+以上及正常浏览器
    * currentStyle 兼容IE8及IE8以下获取目标元素style样式

1 function getStyleValue(elem, property){
2     return window.getComputedStyle(elem,null) ? window.getComputedStyle(elem,null)[property] : elem.currentStyle[property];
3 }

2.事件绑定兼容处理 

  *addEventListener(type, listener, userCapture)是标准的绑定事件监听函数的方法,是W3C所支持的,Chrome、FireFox、Opera、Safari、IE9.0及其以上版本都支持该函数;

其中userCapture为false时;事件为事件冒泡;userCapture为true时;事件为事件捕获;  

    *IE8.0及其以下版本不支持该方法,它使用attachEvent()来绑定事件监听函数。

1 //事件处理程序
2 function eventHandler(elem, eventName, eventType){
3        // elem.attachEvent 兼容IE8及以下版本浏览器事件
4        // addEventListener 支持Chrome、FireFox、Opera、Safari、IE9.0及其以上版本都支持该函数
5        elem.addEventListener ? elem.addEventListener(eventType, eventName, false) : elem.attachEvent('on'+eventType, eventName);
6 };

3.被拖动目标元素移动距离计算

目标元素移动距离可以理解成物体的平移(结合图2-1)从目标元素A到移动后的目标元素A;目标元素坐标点连线就是目标元素移动距离

* 获取鼠标位置 event.clientX、event.clientY

* 目标元素水平方向移动距离 = 当前鼠标移动时位置 - 鼠标按下时鼠标初始化位置 + 鼠标按下时目标元素水平方向初始化位置

* 目标元素垂直方向移动距离 = 当前鼠标移动时位置 - 鼠标按下时鼠标初始化位置 + 鼠标按下时目标元素垂直方向初始化位置

1 var moveX = event.clientX - initMouseX + initObjX;
2 var moveY = event.clientY - initMouseY + initObjY;

    简单的拖拽效果实现源码

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="UTF-8">
 5         <title>simpleDrag 实现一个简单拖拽特效</title>
 6         <style>
 7             body {
 8                 margin: 0;
 9                 padding: 0;
10                 position: relative;
11             }
12             .box {
13                 width: 100px;
14                 height: 100px;
15                 background: deeppink;
16                 position: absolute;
17                 left: 25px;
18                 top: 25px;
19                 cursor: move;
20             }
21         </style>
22     </head>
23     <body>
24         <div class="box" id="box" style="position: absolute;left: 25px;top: 25px;"></div>
25         <script type="text/javascript">
26             window.onload = function(){
27                 //鼠标初始化位置
28                 var initMouseX = 0;
29                 var initMouseY = 0;
30                 //元素的初始化位置
31                 var initObjX = 0;
32                 var initObjY = 0;
33                 
34                 //鼠标按下标识
35                 var isDraging = false;
36                 
37                 //DOM-Object
38                 function g(id){
39                     return document.getElementById(id);
40                 }
41                 //事件处理程序
42                 function eventHandler(elem, eventName, eventType){
43                     // elem.attachEvent 兼容IE8及以下版本浏览器事件
44                     // addEventListener 支持Chrome、FireFox、Opera、Safari、IE9.0及其以上版本都支持该函数
45                     elem.addEventListener ? elem.addEventListener(eventType, eventName, false) : elem.attachEvent('on'+eventType, eventName);
46                 };
47                 
48                 //获取style属性值
49                 function getStyleValue(elem, property){
50                     //getComputedStyle、currentStyle 返回CSS样式声明对象([object CSSStyleDeclaration]) 只读
51                     //getComputedStyle 支持IE9+以上及正常浏览器
52                     //currentStyle 兼容IE8及IE8以下获取目标元素style样式
53                     return window.getComputedStyle(elem,null) ? window.getComputedStyle(elem,null)[property] : elem.currentStyle[property];
54                 }
55                 //设置目标元素的位置
56                 function setObjPos(elem, pos){
57                     elem.style.left = pos.x +'px';
58                     elem.style.top = pos.y +'px';
59                 }
60                 //mousedown
61                 eventHandler(g('box'), function(event){
62                     //鼠标初始化位置
63                     initMouseX = event.clientX;
64                     initMouseY = event.clientY;
65                     //元素的初始化位置
66                     initObjX = parseInt(getStyleValue(g('box'), 'left'));
67                     initObjY = parseInt(getStyleValue(g('box'), 'top'));
68                     
69                     //鼠标按下标识
70                     isDraging = true;
71                 },'mousedown');
72                 //mousemove
73                 eventHandler(g('box'), function(event){
74                     if(isDraging){
75                         //鼠标初始化位置
76                         var moveX = event.clientX - initMouseX + initObjX;
77                         var moveY = event.clientY - initMouseY + initObjY;
78                         
79                         //设置元素位置
80                         setObjPos(g('box'), {x:moveX, y:moveY});
81                    }
82                 },'mousemove');
83                 //mouseup  document.documentElement 防止鼠标拖出元素外
84                 eventHandler(document.documentElement, function(event){
85                     //鼠标离开停止动画
86                     isDraging = false;
87                 },'mouseup');
88             }
89         </script>
90     </body>
91 </html>

在线编辑代码请点击 http://jsrun.net/2RkKp/edit

作者:Avenstar

出处:http://www.cnblogs.com/zjf-1992/p/6832941.html

关于作者:专注于前端开发、喜欢阅读

本文版权归作者所有,转载请标明原文链接

posted @ 2017-05-11 08:45  Avenstar  阅读(4631)  评论(0编辑  收藏  举报