zoukankan      html  css  js  c++  java
  • js实现拖拽+碰撞+重力

    <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>
  • 相关阅读:
    read_csv 函数
    fillna()
    一个逗号引发的错误
    数据预处理
    groupby()
    泰坦尼克号 预处理
    python string
    python title()的用法
    translate()函数及ROT13加密
    python Lambda, filter, reduce and map
  • 原文地址:https://www.cnblogs.com/asqq/p/3194960.html
Copyright © 2011-2022 走看看