js实现拖拽
用原生Js实现的拖拽效果
1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta http-equiv="x-ua-compatible" content="ie=edge"> 6 <title>封装拖拽</title> 7 <meta name="viewport" content="width=device-width, initial-scale=1,minimum-scale=1,maximum-sacle=1,user-scalable=no"> 8 <style> 9 div#target{ 10 width: 100px; 11 height: 100px; 12 position: relative; 13 left: 0; 14 background-color: orange; 15 color: #fff; 16 text-align: center; 17 line-height: 100px; 18 margin: 5px; 19 cursor: pointer; 20 } 21 </style> 22 </head> 23 <body> 24 <div id="target"></div> 25 <script> 26 (function () { 27 // 这是一个私有属性,不需要被实例访问 28 var transform = getTransform(); 29 function Drag(selector) { 30 // 放在构造函数中的属性,都是属于每一个实例单独拥有 31 this.elem = typeof selector === 'object' ? selector : document.getElementById(selector); 32 this.startX = 0; 33 this.startY = 0; 34 this.sourceX = 0; 35 this.sourceY = 0; 36 37 this.init(); 38 } 39 40 Drag.prototype = { 41 constructor: Drag, 42 init: function () { 43 // 初始时需要做些什么事情 44 this.setDrag(); 45 }, 46 // 稍作改造,仅用于获取当前元素的属性,类似于getName 47 getStyle: function (property) { 48 return document.defaultView.getComputedStyle ? document.defaultView.getComputedStyle(this.elem, false)[property] : this.elem.currentStyle[property] 49 }, 50 // 用来获取当前元素的位置信息,注意与之前的不同之处 51 getPosition: function () { 52 var pos = {x: 0, y: 0}; 53 if (transform) { 54 var transformValue = this.getStyle(transform); 55 if (transformValue === 'none') { 56 this.elem.style[transform] = 'translate(0, 0)'; 57 } else { 58 var temp = transformValue.match(/-?\d+/g); 59 pos = { 60 x: parseInt(temp[4].trim()), 61 y: parseInt(temp[5].trim()) 62 } 63 } 64 } else { 65 if (this.getStyle('postion') === 'static') { 66 this.elem.style.position = 'relative'; 67 } else { 68 pos = { 69 x: parseInt(this.getStyle('left') ? this.getStyle('left') : 0), 70 y: parseInt(this.getStyle('top') ? this.getStyle('top') : 0) 71 } 72 } 73 } 74 return pos; 75 }, 76 // 用来设置当前元素的位置 77 setPostion: function (pos) { 78 if (transform) { 79 this.elem.style[transform] = 'translate('+ pos.x +'px, '+ pos.y +'px)'; 80 } else { 81 this.elem.style.left = pos.x + 'px'; 82 this.elem.style.top = pos.y + 'px'; 83 } 84 }, 85 // 该方法用来绑定事件 86 setDrag: function () { 87 var self = this; 88 this.elem.addEventListener('mousedown', start, false); 89 function start(event) { 90 self.startX = event.pageX; 91 self.startY = event.pageY; 92 93 var pos = self.getPosition(); 94 95 self.sourceX = pos.x; 96 self.sourceY = pos.y; 97 98 document.addEventListener('mousemove', move, false); 99 document.addEventListener('mouseup', end, false); 100 }; 101 function move(event) { 102 var currentX = event.pageX; 103 var currentY = event.pageY; 104 105 var distanceX = currentX - self.startX; 106 var distanceY = currentY - self.startY; 107 108 self.setPostion({ 109 x: (self.sourceX + distanceX).toFixed(), 110 y: (self.sourceY + distanceY).toFixed() 111 }) 112 }; 113 function end(event) { 114 document.removeEventListener('mousemove', move); 115 document.removeEventListener('mouseup', end); 116 } 117 } 118 } 119 // 私有方法,仅仅用来获取transform的兼容写法 120 function getTransform() { 121 var transform = '', 122 divStyle = document.createElement('div').style, 123 transformArr = ['transform', 'webkitTransform', 'MozTransform', 'msTransform', 'OTransform'] 124 for (var i = 0; i < transformArr.length; i++) { 125 if (transformArr[i] in divStyle) { 126 return transform = transformArr[i]; 127 } 128 } 129 return transform; 130 } 131 window.Drag = Drag; 132 })() 133 new Drag('target'); 134 </script> 135 </body> 136 </html>