javascript动画之磁性吸附效果篇
前面的话
上一篇,我们介绍了javascript动画之模拟拖拽效果篇。但在实际应用中,常常需要为拖拽的元素限定范围。而通过限定范围,再增加一些辅助的措施,就可以实现磁性吸附的效果
范围限定
如果我们限定元素只可以在可视范围内移动,那么就需要对其进行范围限定
首先,先要搞清楚是可视区域限定被拖拽元素
左侧范围L0=0
右侧范围R0=document.documentElement.clientWidth
上侧范围T0=0
下侧范围B0=document.documentElement.clientHeight
元素的上下左右四边分别为
左侧边L=offsetLeft
右侧边R=offsetLeft+offsetWidth
上侧边T=offsetTop
下侧边B=offsetTop+offsetHeight
functionlimitedRange(obj,fn){ varL0=0; varR0=document.documentElement.clientWidth; varT0=0; varB0=document.documentElement.clientHeight; varL=obj.offsetLeft; varR=obj.offsetLeft+obj.offsetWidth; varT=obj.offsetTop; varB=obj.offsetTop+obj.offsetHeight; if(L>=L0&&R<=R0&&T>=T0&&B<=B0){ fn(obj); } }
拖拽范围
如果将范围限定用在拖拽元素上,则需要一些改变
首先,限定条件并不是在范围内执行什么,而是不在范围内时,应该执行什么
由于在拖拽实现中,已经获取了元素距离可视区域左上角的X轴和Y轴的距离,所以不需要再通过offsetLeft和offsetTop进行重新获取
<divid="test"style="height:100px;width:100px;background:pink;position:absolute;top:0;left:0;">测试文字</div> <script> functiondrag(obj){ obj.onmousedown=function(e){ e=e||event; //获取元素距离定位父级的x轴及y轴距离 varx0=this.offsetLeft; vary0=this.offsetTop; //获取此时鼠标距离视口左上角的x轴及y轴距离 varx1=e.clientX; vary1=e.clientY; //鼠标按下时,获得此时的页面区域 varL0=0; varR0=document.documentElement.clientWidth; varT0=0; varB0=document.documentElement.clientHeight; //鼠标按下时,获得此时的元素宽高 varEH=obj.offsetHeight; varEW=obj.offsetWidth; document.onmousemove=function(e){ e=e||event; //获取此时鼠标距离视口左上角的x轴及y轴距离 x2=e.clientX; y2=e.clientY; //计算此时元素应该距离视口左上角的x轴及y轴距离 varX=x0+(x2-x1); varY=y0+(y2-y1); /******范围限定*******/ //获取鼠标移动时元素四边的瞬时值 varL=X; varR=X+EW; varT=Y; varB=Y+EH; //在将X和Y赋值给left和top之前,进行范围限定 //只有在范围内时,才进行相应的移动 //如果脱离左侧范围,则left置L0 if(L<L0){X=L0;} //如果脱离右侧范围,则left置为R0 if(R>R0){X=R0-EW;} //如果脱离上侧范围,则top置T0 if(T<T0){Y=T0;} //如果脱离下侧范围,则top置为B0 if(B>B0){Y=B0-EH;} obj.style.left=X+'px'; obj.style.top=Y+'px'; } document.onmouseup=function(e){ //当鼠标抬起时,拖拽结束,则将onmousemove赋值为null即可 document.onmousemove=null; //释放全局捕获 if(obj.releaseCapture){ obj.releaseCapture(); } } //阻止默认行为 returnfalse; //IE8-浏览器阻止默认行为 if(obj.setCapture){ obj.setCapture(); } } } drag(test); </script>
磁性吸附
磁性吸附只需要在范围限定的基础上,做一些修改即可
下列代码中,只要元素的四边,距离可视区域范围的四边小于50px,则元素将直接吸附对应的边上
<divid="test"style="height:100px;width:100px;background:pink;position:absolute;top:0;left:0;">测试文字</div> <script> functiondrag(obj){ obj.onmousedown=function(e){ e=e||event; //获取元素距离定位父级的x轴及y轴距离 varx0=this.offsetLeft; vary0=this.offsetTop; //获取此时鼠标距离视口左上角的x轴及y轴距离 varx1=e.clientX; vary1=e.clientY; //鼠标按下时,获得此时的页面区域 varL0=0; varR0=document.documentElement.clientWidth; varT0=0; varB0=document.documentElement.clientHeight; //鼠标按下时,获得此时的元素宽高 varEH=obj.offsetHeight; varEW=obj.offsetWidth; document.onmousemove=function(e){ e=e||event; //获取此时鼠标距离视口左上角的x轴及y轴距离 x2=e.clientX; y2=e.clientY; //计算此时元素应该距离视口左上角的x轴及y轴距离 varX=x0+(x2-x1); varY=y0+(y2-y1); /******磁性吸附*******/ //获取鼠标移动时元素四边的瞬时值 varL=X; varR=X+EW; varT=Y; varB=Y+EH; //在将X和Y赋值给left和top之前,进行范围限定 //只有在范围内时,才进行相应的移动 //如果到达左侧的吸附范围,则left置L0 if(L-L0<50){X=L0;} //如果到达右侧的吸附范围,则left置为R0 if(R0-R<50){X=R0-EW;} //如果到达上侧的吸附范围,则top置T0 if(T-T0<50){Y=T0;} //如果到达右侧的吸附范围,则top置为B0 if(B0-B<50){Y=B0-EH;} obj.style.left=X+'px'; obj.style.top=Y+'px'; } document.onmouseup=function(e){ //当鼠标抬起时,拖拽结束,则将onmousemove赋值为null即可 document.onmousemove=null; //释放全局捕获 if(obj.releaseCapture){ obj.releaseCapture(); } } //阻止默认行为 returnfalse; //IE8-浏览器阻止默认行为 if(obj.setCapture){ obj.setCapture(); } } } drag(test); </script>
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持毛票票!