原生js实现拖拽功能基本思路详解
如果要设置物体拖拽,那么必须使用三个事件,并且这三个事件的使用顺序不能颠倒。
1.onmousedown:鼠标按下事件
2.onmousemove:鼠标移动事件
3.onmouseup:鼠标抬起事件
拖拽的基本原理就是根据鼠标的移动来移动被拖拽的元素。鼠标的移动也就是x、y坐标的变化;元素的移动就是style.position的top和left的改变。当然,并不是任何时候移动鼠标都要造成元素的移动,而应该判断鼠标左键的状态是否为按下状态,是否是在可拖拽的元素上按下的。
基本思路如下:
拖拽状态=0鼠标在元素上按下的时候{ 拖拽状态=1 记录下鼠标的x和y坐标 记录下元素的x和y坐标 } 鼠标在元素上移动的时候{ 如果拖拽状态是0就什么也不做。 如果拖拽状态是1,那么 元素y=现在鼠标y-原来鼠标y+原来元素y 元素x=现在鼠标x-原来鼠标x+原来元素x } 鼠标在任何时候放开的时候{ 拖拽状态=0 }
部分实例代码:
HTML部分
**********
CSS部分
calculator{ position:absolute;/*设置绝对定位,脱离文档流,便于拖拽*/ display:block; width:218px; height:280px; cursor:move;/*鼠标呈拖拽状*/ }
JS部分
window.onload=function(){ //拖拽功能(主要是触发三个事件:onmousedown\onmousemove\onmouseup) vardrag=document.getElementById('drag'); //点击某物体时,用drag对象即可,move和up是全局区域,也就是整个文档通用,应该使用document对象而不是drag对象(否则,采用drag对象时物体只能往右方或下方移动) drag.onmousedown=function(e){ vare=e||window.event;//兼容ie浏览器 vardiffX=e.clientX-drag.offsetLeft;//鼠标点击物体那一刻相对于物体左侧边框的距离=点击时的位置相对于浏览器最左边的距离-物体左边框相对于浏览器最左边的距离 vardiffY=e.clientY-drag.offsetTop; /*低版本iebug:物体被拖出浏览器可是窗口外部时,还会出现滚动条, 解决方法是采用ie浏览器独有的2个方法setCapture()\releaseCapture(),这两个方法, 可以让鼠标滑动到浏览器外部也可以捕获到事件,而我们的bug就是当鼠标移出浏览器的时候, 限制超过的功能就失效了。用这个方法,即可解决这个问题。注:这两个方法用于onmousedown和onmouseup中*/ if(typeofdrag.setCapture!='undefined'){ drag.setCapture(); } document.onmousemove=function(e){ vare=e||window.event;//兼容ie浏览器 varleft=e.clientX-diffX; vartop=e.clientY-diffY; //控制拖拽物体的范围只能在浏览器视窗内,不允许出现滚动条 if(left<0){ left=0; }elseif(left>window.innerWidth-drag.offsetWidth){ left=window.innerWidth-drag.offsetWidth; } if(top<0){ top=0; }elseif(top>window.innerHeight-drag.offsetHeight){ top=window.innerHeight-drag.offsetHeight; } //移动时重新得到物体的距离,解决拖动时出现晃动的现象 drag.style.left=left+'px'; drag.style.top=top+'px'; }; document.onmouseup=function(e){//当鼠标弹起来的时候不再移动 this.onmousemove=null; this.onmouseup=null;//预防鼠标弹起来后还会循环(即预防鼠标放上去的时候还会移动) //修复低版本iebug if(typeofdrag.releaseCapture!='undefined'){ drag.releaseCapture(); } }; }; };
总结
以上所述是小编给大家介绍的原生js实现拖拽功能基本思路详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!