拖拽封装(图片、div)
一、普通写法
调用方法:drag(元素);
var oImg = document.getElementById('img1'); drag(oImg);
函数主体
function drag(obj) { //封装函数 obj.onmousedown = function(ev) { //鼠标点击需要拖动的元素执行的函数 var ev = ev || event; //事件的浏览器兼容性 var disX = ev.clientX - this.offsetLeft; //鼠标到拖拽元素左侧的距离=鼠标当前距离浏览器左侧的距离-拖动元素左侧距离浏览器左侧的距离 var disY = ev.clientY - this.offsetTop; //鼠标到拖拽元素顶部的距离=鼠标当前距离浏览器顶部的距离-拖动元素顶部距离浏览器顶部的距离 if (obj.setCapture) { //如果存在setCapture()说明是IE678,所以需要设置全局捕获来阻止拖拽时的默认行为 obj.setCapture(); } document.onmousemove = function(ev) { //当鼠标移动的时候执行的函数 var ev = ev || event; //事件的浏览器兼容性 obj.style.left = ev.clientX - disX + 'px'; //拖动元素左侧的位置=当前鼠标距离浏览器左侧的距离 - (物体宽度的一半) obj.style.top = ev.clientY - disY + 'px'; //拖动元素顶部的位置 } document.onmouseup = function() { //鼠标放开时执行的函数 document.onmousemove = document.onmouseup = null; //清空鼠标移动时的函数 if (obj.releaseCapture) { //如果存在releaseCapture()说明是IE678,所以需要解除刚才设置的全局捕获 obj.releaseCapture(); } } return false; //取消文字选择的默认行为 } }
完整例子:
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>无标题文档</title> <style> #div1 {width: 100px; height: 100px; background: red; position: absolute;} #img1 { position: absolute;} </style> <script> window.onload = function() { var oDiv = document.getElementById('div1'); var oImg = document.getElementById('img1'); drag(oImg); //图片调用封装拖拽函数 drag(oDiv); //div调用封装拖拽函数 function drag(obj) { //封装函数 obj.onmousedown = function(ev) { //鼠标点击需要拖动的元素执行的函数 var ev = ev || event;//事件的浏览器兼容性 var disX = ev.clientX - this.offsetLeft; //鼠标到拖拽元素左侧的距离=鼠标当前距离浏览器左侧的距离-拖动元素左侧距离浏览器左侧的距离 var disY = ev.clientY - this.offsetTop; //鼠标到拖拽元素顶部的距离=鼠标当前距离浏览器顶部的距离-拖动元素顶部距离浏览器顶部的距离 if ( obj.setCapture ) { //如果存在setCapture()说明是IE678,所以需要设置全局捕获来阻止拖拽时的默认行为 obj.setCapture(); } document.onmousemove = function(ev) { //当鼠标移动的时候执行的函数 var ev = ev || event;//事件的浏览器兼容性 obj.style.left = ev.clientX - disX + 'px'; //拖动元素左侧的位置=当前鼠标距离浏览器左侧的距离 - (物体宽度的一半) obj.style.top = ev.clientY - disY + 'px';//拖动元素顶部的位置 } document.onmouseup = function() { //鼠标放开时执行的函数 document.onmousemove = document.onmouseup = null; //清空鼠标移动时的函数 if ( obj.releaseCapture ) { //如果存在releaseCapture()说明是IE678,所以需要解除刚才设置的全局捕获 obj.releaseCapture(); } } return false; //取消文字选择的默认行为 } } } </script> </head> <body> <div id="div1"></div> <img src="1.jpg" id="img1" /> <!--需要在那个范围内拖拽,div就在哪个父级内--> </body> </html>
二、面向对象写法
window.onload = function(){ var d1 = new Drag('div1'); d1.init(); }; function Drag(id){ this.oDiv = document.getElementById(id); this.disX = 0; this.disY = 0; } Drag.prototype.init = function(){ var This = this; this.oDiv.onmousedown = function(ev){ var ev = ev || window.event; This.fnDown(ev); return false; }; }; Drag.prototype.fnDown = function(ev){ var This = this; this.disX = ev.clientX - this.oDiv.offsetLeft; this.disY = ev.clientY - this.oDiv.offsetTop; document.onmousemove = function(ev){ var ev = ev || window.event; This.fnMove(ev); }; document.onmouseup = this.fnUp; }; Drag.prototype.fnMove = function(ev){ this.oDiv.style.left = ev.clientX - this.disX + 'px'; this.oDiv.style.top = ev.clientY - this.disY + 'px'; }; Drag.prototype.fnUp = function(){ document.onmousemove = null; document.onmouseup = null; };
<div id="div1"></div>
使用方法:
window.onload = function(){ var d1 = new Drag('div1'); //div1为需要拖拽的div的id d1.init(); //调用init方法 };
三、继承的写法
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>无标题文档</title> <style> #div1{ width:100px; height:100px; background:red; position:absolute;} #div2{ width:100px; height:100px; background:yellow; position:absolute; left:100px;} </style> <script> window.onload = function(){ var d1 = new Drag('div1'); d1.init(); var d2 = new ChildDrag('div2'); d2.init(); }; function Drag(id){ //父类构造函数 this.obj = document.getElementById(id); this.disX = 0; this.disY = 0; } Drag.prototype.init = function(){ //父类方法 var This = this; this.obj.onmousedown = function(ev){ var ev = ev || window.event; This.fnDown(ev); document.onmousemove = function(ev){ var ev = ev || window.event; This.fnMove(ev); }; document.onmouseup = function(){ This.fnUp(); }; return false; }; }; Drag.prototype.fnDown = function (ev) { //父类方法 this.disX = ev.clientX - this.obj.offsetLeft; this.disY = ev.clientY - this.obj.offsetTop; }; Drag.prototype.fnMove = function (ev) { //父类方法 this.obj.style.left = ev.clientX - this.disX + 'px'; this.obj.style.top = ev.clientY - this.disY + 'px'; }; Drag.prototype.fnUp = function () { //父类方法 document.onmousemove = null; document.onmouseup = null; }; function ChildDrag(id){ //子类构造函数 Drag.call(this,id); //继承父类的属性 } extend( ChildDrag.prototype , Drag.prototype ); //继承父类的方法 ChildDrag.prototype.fnMove = function(ev){ //重新改写父类的方法,定义子类自己的方法,使拖拽的元素拖拽时左右不能超出屏幕 var L = ev.clientX - this.disX; var T = ev.clientY - this.disY; if(L<0){ L = 0; } else if(L>document.documentElement.clientWidth - this.obj.offsetWidth){ L = document.documentElement.clientWidth - this.obj.offsetWidth; } this.obj.style.left = L + 'px'; this.obj.style.top = T + 'px'; }; function extend(obj1,obj2){ //封装的继承方法的函数 for(var attr in obj2){ obj1[attr] = obj2[attr]; } } </script> </head> <body> <div id="div1"></div> <div id="div2"></div> </body> </html>