Javascript实现重力弹跳拖拽运动效果

声明:

By:GenialX

个人主页:胡旭博客 - www.ihuxu.com

QQ:2252065614

演示地址:

http://www.ihuxu.com/project/gcdmove/

调用示例:

var GCDM = gcdMove(oDiv,100,0);

GCDM.startMove();//开始运动

GCDM.stopMove();//结束运动

该段JS代码已经封装好了,代码如下:

简要说明 - obj为要改动的对象元素,通常为某个div;iSpeedX,iSpeedY为div出师的横向(右侧),竖向(下)的初始速度,当然也可以设为零。

  1 /**
  2  * @Desc 重力碰撞拖拽运动 - Gravity Crash Drag Move(gcdMove)
  3  * @Author GenialX
  4  * @URL www.ihuxu.com
  5  * @QQ 2252065614
  6  * @Date 2013.06.22
  7  */
  8 
  9 function gcdMove(obj, iSpeedX, iSpeedY) {
 10 
 11     _this = this;//public identifier
 12 
 13     //construct fun
 14     var gcdMove;
 15     //self defined fun
 16     var start;
 17     _this.startMove;
 18     //other var
 19     var iTimer;
 20     var iLastX = 0;
 21     var iLastY = 0;
 22 
 23     //construct fun
 24     start = function() {
 25         clearInterval(iTimer);
 26 
 27         iTimer = setInterval(function() {
 28 
 29             iSpeedY += 3;
 30 
 31             var l = obj.offsetLeft + iSpeedX;
 32             var t = obj.offsetTop + iSpeedY;
 33 
 34             if (t >= document.documentElement.clientHeight - obj.offsetHeight) {
 35                 iSpeedY *= -0.8;
 36                 iSpeedX *= 0.8;
 37                 t = document.documentElement.clientHeight - obj.offsetHeight;
 38             } else if (t <= 0) {
 39                 iSpeedY *= -1;
 40                 iSpeedX *= 0.8;
 41                 t = 0;
 42             }
 43 
 44             if (l >= document.documentElement.clientWidth - obj.offsetWidth) {
 45                 iSpeedX *= -0.8;
 46                 l = document.documentElement.clientWidth - obj.offsetWidth;
 47             } else if (l <= 0) {
 48                 iSpeedX *= -0.8;
 49                 l = 0;
 50             }
 51 
 52             if (Math.abs(iSpeedX) < 1) {
 53                 iSpeedX = 0;
 54             }
 55 
 56             if (iSpeedX == 0 && iSpeedY == 0 && t == document.documentElement.clientHeight - obj.offsetHeight) {
 57                 clearInterval(iTimer);
 58             }
 59 
 60             obj.style.left = l + 'px';
 61             obj.style.top = t + 'px';
 62 
 63         }, 30);
 64     }
 65     
 66     _this.startMove = function(){
 67             obj.onmousedown = function(ev) {
 68 
 69         clearInterval(iTimer);
 70 
 71         var oEvent = ev || event;
 72 
 73         var disX = oEvent.clientX - obj.offsetLeft;
 74         var disY = oEvent.clientY - obj.offsetTop;
 75 
 76         document.onmousemove = function(ev) {
 77             var oEvent = ev || event;
 78 
 79             var l = oEvent.clientX - disX;
 80             var t = oEvent.clientY - disY;
 81 
 82             obj.style.left = l + 'px';
 83             obj.style.top = t + 'px';
 84 
 85             if(iLastX ==0){
 86                 iLastX = l;
 87             }
 88             if(iLastY == 0){
 89                 iLastY = t;
 90             }
 91             iSpeedX = l - iLastX;
 92             iSpeedY = t - iLastY;
 93 
 94             iLastX = l;
 95             iLastY = t;
 96 
 97         }
 98     }
 99 
100     obj.onmouseup = function() {
101         document.onmousedown = null;
102         document.onmousemove = null;
103         document.onmouseup = null;
104         start();
105     }
106         start();
107     }
108     
109     _this.stopMove = function(){
110         clearInterval(iTimer);
111         obj.onmousedown = null;
112         document.onmousemove = null;
113         obj.onmouseup = null;
114         iLastX = 0;
115         iLastY = 0;
116         iSpeedX = 0;
117         iSpeedY = 0;
118         disX = 0;
119         disY = 0;
120     }
121     
122     //CONSTRUCT AREA
123     var gcdMove = function() {
124 
125         if (!iSpeedX) {
126             iSpeedX = 0;
127         }
128         if (!iSpeedY) {
129             iSpeedY = 0;
130         }
131     }
132     
133     gcdMove();
134 }