服务器之家:专注于服务器技术及软件下载分享
分类导航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服务器之家 - 编程语言 - JavaScript - 原生javascript实现拖动元素示例代码

原生javascript实现拖动元素示例代码

2021-03-01 18:36JavaScript教程网 JavaScript

首先改变被拖动元素的布局属性,接着捕捉鼠标事件,当触发mousedown时,记录下当前鼠标在元素中的相对位置,接着处理mousemove事件

本文介绍原生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>

延伸 · 阅读

精彩推荐