<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>js实现拖拽+碰撞+重力</title>
<script>
window.onload=function ()
{ var notice=document.getElementById("notice")
var h2=document.getElementById('h2');
var closed=document.getElementById("closed");
var other=document.getElementById("other")
var lastX=0;
var lastY=0;
var timer=null;
var start=true;
var iSpeedX=0;
var iSpeedY=0;
closed.onclick=function(){
clearInterval(timer);
window.clearInterval(start)
startMoves(notice,{left:-240,top:0},move_type.buffer,function(){other.style.display="block";})
}
other.onclick=function(){
var l=(document.documentElement.clientWidth-notice.offsetWidth)/2
var t=(document.documentElement.clientHeight-notice.offsetHeight)/2
other.style.display="none";
startMoves(notice,{ top:parseInt(t),left:parseInt(l)},move_type.buffer)
}
start=window.setInterval( startMove,1000);
h2.onmousedown=function (ev)
{
var oEvent=ev||event;
var disX=oEvent.clientX-notice.offsetLeft;
var disY=oEvent.clientY-notice.offsetTop;
document.onmousemove=function (ev)
{
var oEvent=ev||event;
var l=oEvent.clientX-disX;
var t=oEvent.clientY-disY;
if(l<0)
{
l=0;
}
else if(l>document.documentElement.clientWidth-notice.offsetWidth)
{
l=document.documentElement.clientWidth-notice.offsetWidth;
}
if(t<0)
{
t=0;
}
else if(t>document.documentElement.clientHeight-notice.offsetHeight)
{
t=document.documentElement.clientHeight-notice.offsetHeight;
}
notice.style.left=l+'px';
notice.style.top=t+'px';
iSpeedX=l-lastX;
iSpeedY=t-lastY;
lastX=l;
lastY=t;
};
document.onmouseup=function ()
{
document.onmousemove=null;
document.onmouseup=null;
startMove();
};
clearInterval(timer);
return false
};
function startMove(){
clearInterval(timer);
timer=setInterval(function (){
var notice=document.getElementById('notice');
iSpeedY+=3;
var l=notice.offsetLeft+iSpeedX;
var t=notice.offsetTop+iSpeedY;
notice.style.margin=0;
if(t>=document.documentElement.clientHeight-notice.offsetHeight)
{
iSpeedY*=-0.8;
iSpeedX*=0.8;
t=document.documentElement.clientHeight-notice.offsetHeight;
}
else if(t<=0)
{
iSpeedY*=-1;
iSpeedX*=0.8;
t=0;
}
if(l>=document.documentElement.clientWidth-notice.offsetWidth)
{
iSpeedX*=-0.8;
l=document.documentElement.clientWidth-notice.offsetWidth;
}
else if(l<=0)
{
iSpeedX*=-0.8;
l=0;
}
if(Math.abs(iSpeedX)<1)
{
iSpeedX=0;
}
if(Math.abs(iSpeedY)<1)
{
iSpeedY=0;
}
if(iSpeedX==0 && iSpeedY==0 && t==document.documentElement.clientHeight-notice.offsetHeight)
{
clearInterval(timer);
}
else
{
notice.style.left=l+'px';
notice.style.top=t+'px';
}
}, 30);
}
};
</script>
</head>
<body>
<style type="text/css">
html, body, div,h2 {margin:0px; padding:0px; font-size:12px;}
body {background-image:url(http://img1.t.sinajs.cn/t4/skin/skin005/images/mm_body_bg.jpg); background-repeat:no-repeat; background-position:center 0; background-color:#004B7D}
#notice {width:260px;height:260px;position:absolute;overflow:hidden; border-radius:3px; margin-top:-130px; top:50%; left:50%; margin-left:-130px; }
#bg {width:260px;height:260px;position:absolute;top:0px;left:0px;background:#000000;opacity:0.3;z-index:3; filter:alpha(opacity=30) }
#information {background:#EDEDED;width:250px;height:250px;z-index:5;position:absolute;left:5px;top:5px;}
#information h2{ border:2px solid #F00; position:relative; font-weight:normal; font-size:13px; height:26px; line-height:26px; background:#F9C; padding-left:10px; cursor:move;}
#information a{ position:absolute; right:5px; top:4px; height:16px; width:16px; display:block; line-height:16px; background:#FFF; text-align:center; border-radius:30px; z-index:999; cursor:pointer;}
#other{ width:20px; height:260px; background:#F99; z-index:9999; position:absolute; left:240px; top:0; border-radius:0px 5px 5px 0; display:none; cursor:pointer; text-align:center;}
</style>
<div id="notice">
<div id="information">
<h2 id="h2">亲点击我可以拖拽哦!<a id="closed" title="点击我隐藏">×</a></h2>
</div>
<div id="bg"></div>
<div id="other">点击我显示吧</div>
</div>
<script type="text/javascript">
function css(obj, attr, value)
{
if(arguments.length==2)
{
if(attr!='opacity')
{
return parseInt(obj.currentStyle?obj.currentStyle[attr]:document.defaultView.getComputedStyle(obj, false)[attr]);
}
else
{
return Math.round(100*parseFloat(obj.currentStyle?obj.currentStyle[attr]:document.defaultView.getComputedStyle(obj, false)[attr]));
}
}
else if(arguments.length==3)
switch(attr)
{
case 'width':
case 'height':
case 'paddingLeft':
case 'paddingTop':
case 'paddingRight':
case 'paddingBottom':
value=Math.max(value,0);
case 'left':
case 'top':
case 'marginLeft':
case 'marginTop':
case 'marginRight':
case 'marginBottom':
obj.style[attr]=value+'px';
break;
case 'opacity':
obj.style.filter="alpha(opacity:"+value+")";
obj.style.opacity=value/100;
break;
default:
obj.style[attr]=value;
}
return function (attr_in, value_in){css(obj, attr_in, value_in)};
}
var move_type={
buffer: 1,
flex: 2
};
function stopMove(obj)
{
clearInterval(obj.timer);
}
function startMoves(obj, oTarget, iType, fnCallBack, fnDuring)
{
//obj是指要运动的物体
//itype是要采取哪种类型的运动move_type.buffer为缓冲运动,move_type.flex弹性运动。
//oTarget是目标要运行到多少来.默认是px所以不需要带单位。
//fnCallBack运动结束要做些什么。
//fnduring在运动中要进行什么
var fnMove=null;
if(obj.timer)
{
clearInterval(obj.timer);
}
switch(iType)
{
case move_type.buffer:
fnMove=doMoveBuffer;
break;
case move_type.flex:
fnMove=doMoveFlex;
break;
}
obj.timer=setInterval(function (){
fnMove(obj, oTarget, fnCallBack, fnDuring);
}, 30);
}
function doMoveBuffer(obj, oTarget, fnCallBack, fnDuring)
{
var bStop=true;
var attr='';
var speed=0;
var cur=0;
for(attr in oTarget)
{
cur=css(obj, attr);
if(oTarget[attr]!=cur)
{
bStop=false;
speed=(oTarget[attr]-cur)/5;
speed=speed>0?Math.ceil(speed):Math.floor(speed);
css(obj, attr, cur+speed);
}
}
if(fnDuring)fnDuring.call(obj);
if(bStop)
{
clearInterval(obj.timer);
obj.timer=null;
if(fnCallBack)fnCallBack.call(obj);
}
}
function doMoveFlex(obj, oTarget, fnCallBack, fnDuring)
{
var bStop=true;
var attr='';
var speed=0;
var cur=0;
for(attr in oTarget)
{
if(!obj.oSpeed)obj.oSpeed={};
if(!obj.oSpeed[attr])obj.oSpeed[attr]=0;
cur=css(obj, attr);
if(Math.abs(oTarget[attr]-cur)>=1 || Math.abs(obj.oSpeed[attr])>=1)
{
bStop=false;
obj.oSpeed[attr]+=(oTarget[attr]-cur)/5;
obj.oSpeed[attr]*=0.7;
css(obj, attr, cur+obj.oSpeed[attr]);
}
}
if(fnDuring)fnDuring.call(obj);
if(bStop)
{
clearInterval(obj.timer);
obj.timer=null;
if(fnCallBack)fnCallBack.call(obj);
}
}
</script>
</body>
</html>