<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
<style type="text/css">
.target{
color:red
width:50px
height:50px
background:red
border:1px solid yellow
color:
}
</style>
</head>
<body>
<p id="demo">单击按钮创建button元素</p>
<button onclick="myFunction()">点我</button>
<script>
(function() {
// 这是一个私有属性,不需要被实例访问
var transform = getTransform()
function Drag() {
// 放在构造函数中的属性,都是属于每一个实例单独拥有
var d=document.createElement("div")
d.className="target"
d.innerText = "abc"
document.body.appendChild(d)
this.elem = d
this.startX = 0
this.startY = 0
this.sourceX = 0
this.sourceY = 0
this.init()
}
// 原型
Drag.prototype = {
constructor: Drag,
init: function() {
// 初始时需要做些什么事情
this.setDrag()
},
// 稍作改造,仅用于获取当前元素的属性,类似于getName
getStyle: function(property) {
return document.defaultView.getComputedStyle ?
document.defaultView.getComputedStyle(this.elem, false)[property] :
this.elem.currentStyle[property]
},
// 用来获取当前元素的位置信息,注意与之前的不同之处
getPosition: function() {
var pos = {x: 0, y: 0}
if(transform) {
var transformValue = this.getStyle(transform)
if(transformValue == 'none') {
this.elem.style[transform] = 'translate(0, 0)'
} else {
var temp = transformValue.match(/-?\d+/g)
pos = {
x: parseInt(temp[4].trim()),
y: parseInt(temp[5].trim())
}
}
} else {
if(this.getStyle('position') == 'static') {
this.elem.style.position = 'relative'
} else {
pos = {
x: parseInt(this.getStyle('left') ? this.getStyle('left') : 0),
y: parseInt(this.getStyle('top') ? this.getStyle('top') : 0)
}
}
}
return pos
},
// 用来设置当前元素的位置
setPostion: 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() {
var self = this
this.elem.addEventListener('mousedown', start, false)
function start(event) {
self.startX = event.pageX
self.startY = event.pageY
var pos = self.getPosition()
self.sourceX = pos.x
self.sourceY = pos.y
document.addEventListener('mousemove', move, false)
document.addEventListener('mouseup', end, false)
}
function move(event) {
var currentX = event.pageX
var currentY = event.pageY
var distanceX = currentX - self.startX
var distanceY = currentY - self.startY
self.setPostion({
x: (self.sourceX + distanceX).toFixed(),
y: (self.sourceY + distanceY).toFixed()
})
}
function end(event) {
document.removeEventListener('mousemove', move)
document.removeEventListener('mouseup', end)
// do other things
}
}
}
// 私有方法,仅仅用来获取transform的兼容写法
function getTransform() {
var transform = '',
divStyle = document.createElement('div').style,
transformArr = ['transform', 'webkitTransform', 'MozTransform', 'msTransform', 'OTransform'],
i = 0,
len = transformArr.length
for(
if(transformArr[i] in divStyle) {
return transform = transformArr[i]
}
}
return transform
}
// 一种对外暴露的方式
window.Drag = Drag
})()
// 使用:声明2个拖拽实例
function myFunction(){
new Drag()
}
</script>
</body>
</html>