JavaScript 滑移效果

这里说的滑移其实就是减速效果,能根据设定的坐标平面移动。
效果

自动滑移:
定点滑移:(鼠标点击)
定线滑移:(鼠标拖动轨迹)



代码:
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>滑移效果</title>
<script type="text/javascript">
var $ = function (id) {
    
return "string" == typeof id ? document.getElementById(id) : id;
}
;

function Event(e){
    
var oEvent = document.all ? window.event : e;
    
if (document.all) {
        oEvent.pageX 
= oEvent.clientX + document.documentElement.scrollLeft;
        oEvent.pageY 
= oEvent.clientY + document.documentElement.scrollTop;
    }

    
return oEvent;
}


function addEventHandler(oTarget, sEventType, fnHandler) {
    
if (oTarget.addEventListener) {
        oTarget.addEventListener(sEventType, fnHandler, 
false);
    }
 else if (oTarget.attachEvent) {
        oTarget.attachEvent(
"on" + sEventType, fnHandler);
    }
 else {
        oTarget[
"on" + sEventType] = fnHandler;
    }

}
;

function removeEventHandler(oTarget, sEventType, fnHandler) {
    
if (oTarget.removeEventListener) {
        oTarget.removeEventListener(sEventType, fnHandler, 
false);
    }
 else if (oTarget.detachEvent) {
        oTarget.detachEvent(
"on" + sEventType, fnHandler);
    }
 else 
        oTarget[
"on" + sEventType] = null;
    }

}
;

var Class = {
  create: 
function() {
    
return function() {
      
this.initialize.apply(this, arguments);
    }

  }

}


Object.extend 
= function(destination, source) {
    
for (var property in source) {
        destination[property] 
= source[property];
    }

    
return destination;
}



var Slippage = Class.create();
Slippage.prototype 
= {
  initialize: 
function(obj, options) {

    
this.obj = $(obj);
    
this._timer =null;
    
this._xs = this._ys = [];
    
this.X = parseInt(this.obj.style.left) || 0;
    
this.Y = parseInt(this.obj.style.top) || 0;
    
    
this.SetOptions(options);
    
this.Step = Math.abs(this.options.Step);
    
this.Time = Math.abs(this.options.Time);
    
this.Loop = this.options.Loop;
    
this.Relative = this.options.Relative;
    
    
this.SetPosition(this.options.X || [], this.options.Y || []);
  }
,
  
//设置默认属性
  SetOptions: function(options) {
    
this.options = {//默认值
        Step:        10,//滑动变化率
        Time:        10,//滑动延时
        X:            [],//x坐标变化
        Y:            [],//y坐标变化
        Loop:        false,//是否循环
        Relative:    true//是否相对位置
    }
;
    Object.extend(
this.options, options || {});
  }
,
  
//
  SetPosition: function(arrX, arrY) {
    
if(arrX.length <= 0 && arrX.length <= 0return false;
    
else if(arrX.length <= 0) arrX = [0];
    
else if(arrY.length <= 0) arrY = [0];
    
    
this._xs = arrX; this._ys = arrY;
    
    
if(this.Relative){
        
for(var i in this._xs)if (i == 0this._xs[0+= this.X; } else this._xs[i] += this._xs[i-1]; } }
        
for(var i in this._ys)if (i == 0this._ys[0+= this.Y; } else this._ys[i] += this._ys[i-1]; } }
    }

    
    
this.Set();
  }
,
  
//
  Set: function() {
    
//当全部坐标指向同一个位置时会进入死循环
    if(this._xs.length <= 0 && this._ys.length <= 0return;
    
    
if(this._xs.length > 0this.X = this._xs.shift();
    
if(this._ys.length > 0this.Y = this._ys.shift();
    
    
if(this.Loop && this._xs.length > 0 && this._ys.length > 0this._xs.push(this.X);this._ys.push(this.Y); }
    
    
//$("aa").innerHTML+=this._ys.length+"=";
    this.Move(this.X, this.Y);
  }
,
  
//
  Move: function(iX, iY) {
    clearTimeout(
this._timer);

    
var iLeft = parseInt(this.obj.style.left) || 0, iTop = parseInt(this.obj.style.top) || 0, iLeftStep = this.GetStep(iX, iLeft), iTopStep = this.GetStep(iY, iTop);
    
    
if (iLeftStep == 0 && iTopStep == 0{
        
this.Set();
    }
 else {
        
this.obj.style.left = (iLeft + iLeftStep) + "px"this.obj.style.top = (iTop + iTopStep) + "px";
        
var oThis = thisthis._timer = setTimeout(function(){ oThis.Move(iX, iY); }this.Time);
    }

  }
,
  
//
  GetStep: function(iTarget, iNow) {
    
var iStep = (iTarget - iNow) / this.Step;
    
if (iStep == 0return 0;
    
if (Math.abs(iStep) < 1return (iStep > 0 ? 1 : -1);
    
return iStep;
  }

}
;

window.onload 
= function(){
    
new Slippage("idSlippage3"{ X: [200,200,0,-200,-100,-100], Y: [0,0,100,-100,100,-100], Loop: true });
    
    
var oSlippage = new Slippage("idSlippage");
    $(
"aa").onclick = function(e)var oEvent = Event(e);oSlippage.Move(oEvent.pageX, oEvent.pageY);}
    
    
var oSlippage2 = new Slippage("idSlippage2"{ Step: 1, Relative: false }),x=[],y=[];
    $(
"bb").onmousedown = function(e){ addEventHandler(this"mousemove", Set); }
    $(
"bb").onmouseout = function(e){ removeEventHandler(this"mousemove", Set); x=y=[];}
    $(
"bb").onmouseup = function(e){ removeEventHandler(this"mousemove", Set); oSlippage2.SetPosition(x, y);x=y=[];}
    
function Set(e)var oEvent = Event(e); x.push(oEvent.pageX); y.push(oEvent.pageY); }
}


</script>
</head>
<body>
自动滑移:
<div id="cc" style="height:200px; width:500px; border:1px solid #000000;  position:relative;overflow:hidden;">
  
<div id="idSlippage3" style="width:10px; height:10px; background:#000000; position:absolute; z-index:99; top:50px; left:50px;"> </div>
</div>
定点滑移:(鼠标点击)
<div id="aa" style="height:200px; width:500px; border:1px solid #000000; overflow:hidden;">
  
<div id="idSlippage" style="width:10px; height:10px; background:#000000; position:absolute; z-index:99; top:-50px; left:50px;"> </div>
</div>
定线滑移:(鼠标拖动轨迹)
<div id="bb" style="height:200px; width:500px; border:1px solid #000000; overflow:hidden;">
  
<div id="idSlippage2" style="width:10px; height:10px; background:#000000; position:absolute; z-index:99; top:-50px; left:50px;"> </div>
</div>
</body>
</html>

转载请注明出处:http://www.cnblogs.com/cloudgamer/

如有任何建议或疑问,欢迎留言讨论。

如果觉得文章不错的话,欢迎点一下右下角的推荐。

程序中包含的js工具库CJL.0.1.min.js,原文在这里

posted @ 2008-05-16 15:14 cloudgamer 阅读(11620) 评论(21) 编辑 收藏

 回复 引用 查看   
#1楼 2008-05-16 15:48 求知无傲      
好玩
 回复 引用 查看   
#2楼 2008-05-16 17:49 Freewind      
很好很强大...
 回复 引用 查看   
#3楼[楼主] 2008-05-16 18:05 cloudgamer      
@Freewind
@求知无傲

谢谢

 回复 引用   
#4楼 2008-05-16 18:35 vicqqq[未注册用户]
貌似蝌蚪~
 回复 引用   
#5楼 2008-05-17 09:33 medci[未注册用户]
好可愛,收藏了,yaya~~
 回复 引用 查看   
#6楼 2008-05-17 11:17 ppchen(陈荣林)      
挺好玩,收藏了。
 回复 引用 查看   
#7楼[楼主] 2008-05-17 23:04 cloudgamer      
@medci
@ppchen(陈荣林)

谢谢

 回复 引用 查看   
#8楼 2008-05-19 11:40 Clark Zheng      
收藏,谢谢博主
 回复 引用 查看   
#9楼[楼主] 2008-08-25 23:48 cloudgamer      
@Clark Zheng
谢谢

 回复 引用 查看   
#10楼 2008-09-15 08:23 xoyozo      
做JS游戏?
 回复 引用 查看   
#11楼[楼主] 2008-09-16 01:06 cloudgamer      
@xoyozo
一个关于移动的特效而已

好玩
 回复 引用 查看   
#13楼[楼主] 2008-09-23 09:24 cloudgamer      
@volnet(可以叫我大V)
谢谢关注

 回复 引用   
#14楼 2009-05-20 10:02 haiyang
很好 可做网页特效 帅
 回复 引用   
#15楼 2009-11-12 14:10 llffff[未注册用户]
博主太强了!
 回复 引用 查看   
#16楼 2010-05-22 16:54 xiaogan      
很好看,beautiful !
 回复 引用 查看   
#17楼 2010-08-30 11:10 vii      
cool!现在看这些感觉心有余而力不足。你的每个程序中几乎都会有GetStep函数,看得郁闷,或许我的抽象能力和逻辑能力比较差。怎样去理解动画深层次的原理呢!特别是根据每个时间段去获取那些要使用的变量!Oh, My God, 能告诉我您是如何修炼的吗?现在没人指导,迷茫ing...
 回复 引用 查看   
#18楼[楼主] 2010-08-30 14:01 cloudgamer      
@xiaogan
@llffff
@haiyang
谢谢支持

 回复 引用 查看   
#19楼[楼主] 2010-08-30 14:02 cloudgamer      
@vii
就是用来渐变的

 回复 引用 查看   
#20楼 2010-11-16 16:44 余杉      
牛,强,厉害,看了这个,我都觉得不能轻易的用我的中文来赞赏你了,真的很强大... ...
受益匪浅

 回复 引用 查看   
#21楼[楼主] 2010-11-16 17:27 cloudgamer      
@余杉
过奖了

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1200705 w70Jjw4ChrM=