在JS实现博客前端页面(四)中已经实现了对弹窗组件的封装,如今咱们想要在浏览器窗口内能够对弹窗进行拖拽移动,就须要封装拖拽事件。前端
首先咱们须要了解拖拽的原理,大体分为以下几个步骤:segmentfault
将鼠标移动到须要拖拽的物体上,按下鼠标,触发onmousedown事件;浏览器
按住鼠标的同时,选中物体,并进行拖动,触发onmousemove事件;this
放开鼠标,中止拖动,物体会停留在最后的位置,触发onmouseup事件;prototype
再次按下鼠标,会重复循环以上操做。code
注意:
onmousedown按下事件只在物体对象范围内起做用,此处指定对象为窗体loginBox便可;
但窗体的onmousemove、onmouseup事件则需在整个页面文档范围内起做用,应该指定对象为document.对象
在base.js中封装drag()拖拽事件,代码以下:事件
Base.prototype.drag = function(){ for (var i=0;i<this.elements.length;i++){ var element = this.elements[i]; //鼠标按下事件 element.onmousedown = function(e){ var e= e|| window.event; var that = this;//这里的this指向element对象 //获取鼠标点击位置相对于窗体left和top的位移 var diffX = e.clientX - that.offsetLeft; var diffY = e.clientY - that.offsetTop; //鼠标移动事件 document.onmousemove = function(e){ var e = e||window.event; //在移动过程当中窗体的offsetLeft、offsetTop会随着事件触发位置的e.clientX、e.clientY变化而变化,但diffX、diffY是固定不变的 //故使用e.clientX - diffX能够获取移动后窗体的left值,top值同理 var left = e.clientX - diffX ; var top = e.clientY - diffY; //设置移动的位置不得超过浏览器的边缘 //使用offsetWidth、offsetHeight能够得到窗体自身的宽度、高度 //窗体距左的偏移量加上窗体自身的宽度不超过浏览器的宽度 if(left < 0){ left = 0; }else if(left > window.InnerWidth - that.offsetWidth){ left = window.InnerWidth - that.offsetWidth; } //窗体距上的偏移量加上窗体自身的高度不超过浏览器的高度 if(top < 0){ top = 0; }else if(top > window.InnerHeight - that.offsetHeight){ top = window.InnerHeight - that.offsetHeight; } //设置窗体移动后的偏移量 that.style.left = left + 'px'; that.style.top = top + 'px'; } //鼠标放开事件 document.onmouseup = function(){ //清空事件 this.onmousemove = null;//这里的this指向document对象 this.onmouseup = null; } }; } return this; }
window.onload = function () { var loginBox=$().getId("loginBox");//获取窗体 //拖拽窗体 loginBox.drag(); };