Fork me on GitHub

组件-拖拽

设计模式

封装一个拖拽组件

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
(function () {
let transform = getTransform();

function Drag(selector) {
this.elem = typeof selector === 'object' ? selector : document.getElementById(selector);
this.startX = 0;
this.startY = 0;
this.sourceX = 0;
this.sourceY = 0;
this.init()
}
Drag.prototype = {
constructor: Drag,
init: function () {
this.setDrag()
},
getStyle: function (property) {
return document.defaultView.getComputedStyle ? document.defaultView.getComputedStyle(this
.elem)[property] : this.elem.currentStyle[property]
},
//获取当前元素位置
getPosition: function () {
let pos = {
x: 0,
y: 0
};
if (transform) {
let transformValue = this.getStyle(transform);
if (transformValue === 'none') {
this.elem[transform] = 'translate(0,0)'
} else {
let tmp = transformValue.match(/-?\d+/g);
pos = {
x: parseInt(tmp[4].trim()),
y: parseInt(tmp[5].trim())
}
}
} else {
if (this.getStyle('position') === 'static') {
this.elem.position = 'relative'
} else {
let left = this.getStyle('left');
let top = this.getStyle('top')
pos = {
x: parseInt(left ? left : 0),
y: parseInt(top ? top : 0)
}
}
}
return pos
},
//设置当前元素位置
setPosition: function (pos) {
if (transform) {
this.elem.style[transform] = `translate(${pos.x}px,${pos.y}px)`
} else {
this.elem.style.left = pos.x + 'px';
this.elem.style.top = pos.y + 'px'
}
},
//绑定事件
setDrag: function () {
const self = this;
this.elem.addEventListener('mousedown', start, false);
//点击元素记录开始位置
function start(event) {
self.startX = event.pageX;
self.startY = event.pageY;

let curPos = self.getPosition(autumn);
self.sourceX = curPos.x;
self.sourceY = curPos.y;

document.addEventListener('mousemove', move, false);
document.addEventListener('mouseup', end, false)
}
//鼠标移动
function move(event) {

//获取鼠标当前位置
let currentX = event.pageX;
let currentY = event.pageY;
//计算差值
let distanceX = currentX - self.startY;
let distanceY = currentY - self.startY;

self.setPosition({
x: (self.sourceX + distanceX).toFixed(),
y: (self.sourceY + distanceY).toFixed()
})

}

function end() {
document.removeEventListener('mousemove', move);
document.removeEventListener('mouseup', end)
}

}
}
//私有方法,用来获取兼容transform
function getTransform() {
let transform = null,
divStyle = document.createElement('div').style,
_transforms = ['transform', 'webkitTransform', 'MozTransform', 'msTransform'],
i = 0,
len = _transforms.length;

for (; i < len; i++) {
if (_transforms[i] in divStyle) {
return transform = _transforms[i]
}
}
return transform
}
window.Drag = Drag;
})()
//扩展为一个jQuery插件
(function ($) {
$.fn.extend({
canDrag: function () {
new Drag(this[0]);
return this
}
})
})(jQuery)
$('.autumn').canDrag()
-------------本文结束感谢阅读-------------