本文介绍原生javascript实现元素拖动。
思路:
1.首先改变被拖动元素的布局属性,关键是“position:absolue”;
2.捕捉鼠标事件"mousedown","mousemove","mouseup";
3.当触发"mousedown"时,记录下当前鼠标在元素中的相对位置,_x,_y;
4.紧接着处理"mousemove"事件,通过改变元素的top和left属性来移动元素;
5.当触发"mouseup"时间时,终止拖动。
同时,应考虑代码的封装性和浏览器的兼容性,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
|
<!DOCTYPE html> <html> <head> <title>draggable div</title> <style type= "text/css" > body{ margin: 0; padding: 0; background-color: #fff; } #drag_div{ width: 150px; height: 150px; padding: 10px; margin: 10px; background-color: #66dd33; cursor: move; } </style> </head> </html> <body> <div id= "drag_div" ></div> </body> <script type= "text/javascript" > function Drag () { this .initialize.apply( this , arguments); } Drag.prototype = { // 初始化 initialize : function (element, options) { this .element = this .$(element); // 被拖动的对象 this ._x = this ._y = 0; // 鼠标在元素中的位置 this ._moveDrag = this .bind( this , this .moveDrag); this ._stopDrag = this .bind( this , this .stopDrag); // 设置参数 this .setOptions(options); // 设置鼠标去“拖”的“柄”对象(注意与被拖动的对象区别) this .handle = this .$( this .options.handle); // 设置回调函数 this .onStart = this .options.onStart; this .onMove = this .options.onMove; this .onStop = this .options.onStop; this .handle.style.cursor = "move" ; this .changeLayout(); // 注册开始拖动事件 this .addHandler( this .handle, "mousedown" , this .bind( this , this .startDrag)); }, // 改变被拖动对象的布局属性 changeLayout: function () { this .element.style.top = this .element.offsetTop + "px" ; this .element.style.left = this .element.offsetLeft + "px" ; this .element.style.position = "absolute" ; this .element.style.margin = "0" ; }, startDrag : function (event) { var event = event || window.event; this ._x = event.clientX - this .element.offsetLeft; this ._y = event.clientY - this .element.offsetTop; this .addHandler(document, "mousemove" , this ._moveDrag); this .addHandler(document, "mouseup" , this ._stopDrag); this .preventDefault(event); this .handle.setCapture && this .handle.setCapture(); this .onStart(); }, moveDrag : function (event) { var event = this .getEvent(event); var iTop = event.clientY - this ._y; var iLeft = event.clientX - this ._x; this .element.style.top = iTop + "px" ; this .element.style.left = iLeft + "px" ; this .onMove(); }, stopDrag : function () { this .removeHandler(document, "mousemove" , this ._moveDrag); this .removeHandler(document, "mouseup" , this ._stopDrag); this .handle.releaseCapture && this .handle.releaseCapture(); this .onStop() }, setOptions : function (options) { this .options = { handle: this .element, //事件对象 onStart : function () {}, // 开始时回调函数 onMove : function (){}, // 拖拽时回调函数 onStop : function (){} // 停止时回调函数 }; for ( var p in options){ this .options[p] = options[p]; } }, $ : function (id) { return typeof id === "string" ? document.getElementById(id):id; }, addHandler : function (element, eventType, handler) { if (element.addEventListener){ return element.addEventListener(eventType, handler, false ); } else { return element.attachEvent( "on" +eventType, handler); } }, removeHandler : function (element, eventType, handler) { if (element.removeEventListener){ return element.removeEventListener(eventType, handler, false ); } else { return element.detachEvent( "on" + eventType, handler); } }, getEvent: function (event) { return event || window.event; }, preventDefault: function (event) { if (event.preventDefault){ event.preventDefault(); } else { event.returnValue = false ; } }, bind : function (obj, handler) { return function () { return handler.apply(obj, arguments); } } }; window.onload = function () { var drag_div = document.getElementById( "drag_div" ); var drag = new Drag(drag_div, {handle: drag_div}); } </script> </html> |