/**
* 自定义执行函数将变量封为私有变量
*/
;
(function(window) {
//这是一个私有属性,不需要被实例访问
var 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();
},
// 稍作改造,仅用于获取当前元素的属性,类似于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;
},
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() {
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.setPosition({
x: (self.sourceX + distanceX).toFixed(),
y: (self.sourceY + distanceY).toFixed(),
})
}
function end() {
document.removeEventListener('mousemove',move);
document.removeEventListener('mouseup',end);
}
},
};
//私有方法,仅仅用来获取transform的兼容写法
function getTransform() {
var transform = '',
divStyle = document.createElement('div').style,
transformArr = ['transform', 'webkitTransform', 'MozTransform', 'msTransform', 'OTransform'],
i = 0;
len = transformArr.length;
for(; i < len; i++){
if(transformArr[i] in divStyle){
return transform = transformArr[i]
}
}
return transform;
}
//一种对外暴露的方式
window.Drag = Drag;
})(window);
new Drag('app');
面向对象思维用100行代码封装一个拖拽类
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 本周任务(12.17-23) 每天三件事 运动:至少健身房三次 雅思:三课,补上周三课 科研:知识付费调研汇总整理...