javascript基础之拖拽
因为之前自学过一些web的东西,深感网上搜罗代码还要抓虫子的艰辛,所以打算将学习中遇到的重难点po出来,也算是复习一下,同时希望能给后来人提供一些帮助。如果您发现文中有错误的地方,烦请指出,如果觉得文章对您有帮助,也请您点一个赞支持一下。
拖拽是我们在学习javascript面向对象的时候的一个典型的例子。首先按照学习面向对象的基本路径,先写出面向过程的代码,然后更改为面向对象。
先把HTML结构布局好,就一句简单的代码即可。
<div id="div1"></div>
然后使用CSS添加样式。
#div1{ width: 200px; height: 200px; background: #3fa; position: absolute;}
接着使用面向过程的方法来实现拖拽的效果。原理如下:
js代码如下:
window.onload = function () { var oDiv = document.getElementById("div1"); var disX = 0; var disY = 0; oDiv.|| event; disX = oEvent.clientX - oDiv.offsetLeft; disY = oEvent.clientY - oDiv.offsetTop; document.|| event; var oLeft = oEvent.clientX - disX; var oTop = oEvent.clientY - disY; oDiv.style.left = oLeft + "px"; oDiv.style.top = oTop + "px"; } document.onmouseup = function () { document.onmousemove = null; document.onmouseup = null; } }};
接下来将面向过程改为面向对象,将全局变量变换为属性,代码如下:
function Drag(id) { this.disX = 0; this.disY = 0; var _this = this; this.oDiv = document.getElementById(id); this.oDiv.onmousedown = function (ev) { _this.FnDown(ev); return false; /*阻止默认时间*/ }}Drag.prototype.FnUp = function () { document.onmousemove = null; document.onmouseup = null;};Drag.prototype.FnMove = function (ev) { var oEvent = ev || event; var oLeft = oEvent.clientX - this.disX; var oTop = oEvent.clientY - this.disY; this.oDiv.style.left = oLeft + "px"; this.oDiv.style.top = oTop + "px";};Drag.prototype.FnDown = function (ev) { var _this = this; var oEvent = ev || event; this.disX = oEvent.clientX - this.oDiv.offsetLeft; this.disY = oEvent.clientY - this.oDiv.offsetTop; document.onmousemove = function (ev) { _this.FnMove(ev); }; document.onmouseup = function () { _this.FnUp(); };};
下面是一个受限制的拖拽,拖拽的区块只能在可是区内拖动,不能超出范围。代码如下:
function LimitedDrag(id){ Drag.call(this,id);}for(var i in Drag.prototype){ LimitedDrag.prototype[i] = Drag.prototype[i];}LimitedDrag.prototype.FnMove = function (ev) { var oEvent = ev || event; var oLeft = oEvent.clientX - this.disX; var oTop = oEvent.clientY - this.disY; if(oLeft < 0){ /*左右不能越过窗口*/ oLeft = 0; }else if(oLeft > document.documentElement.clientWidth - this.oDiv.offsetWidth){ oLeft = document.documentElement.clientWidth - this.oDiv.offsetWidth; } if(oTop < 0){ /*上下不能越过窗口*/ oTop = 0; }else if (oTop > document.documentElement.clientHeight - this.oDiv.offsetHeight){ oTop = document.documentElement.clientHeight - this.oDiv.offsetHeight; } this.oDiv.style.left = oLeft + "px"; this.oDiv.style.top = oTop + "px";};
完整的代码在附件中。
里面有很多我没有讲到的细节,大家可以看一下智能社Blue老师的视频,我觉得Blue老师讲的真心不错。。