原生JS 多属性同时匀速运动的速度正负判断

我需要实现的功能是
1.当鼠标移入div1时,宽和高匀速变化到目标点200.
2.当鼠标移出div1时,高和高匀速变化到目标点100.
3.调用函数时speed传参只传正数,在move运动函数内部进行speed的正负判断。

故障:下面的代码目前的效果是鼠标移入时正常,移出时没有匀速变化的效果。

为了检测故障,我加了一条测试用的代码alert(startValue+':'+json[attr]+':'+speed);,测出的结果是,当div1从200运动到100时,弹出的2次结果中的speed第一次是负的,第二次居然是正的。虽然知道这是导致bug的原因,但我不知道为什么会在鼠标移出时,速度会弹出负的。

//下面是完整代码。请哪位高手帮忙看一下,感激不尽。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<style>
    #div1{width: 100px;height: 100px;background-color: red;}
</style>
</head>
<body>
    <div id="div1"></div>
</body>
<script>
var div1=document.getElementById('div1');
var timer=null;

div1.onmouseover=function(){
    move({width:200,height:200},10);
}
div1.onmouseout=function(){
    move({width:100,height:100},10);
}
/*--------------------运动框架-------------------------*/

function move(json,speed){
    clearInterval(timer);
    startValue=0;
    for(var attr in json){
        startValue=parseInt(getStyle(div1,attr));
        speed=startValue>json[attr]?-speed:speed;//判断速度正负。
        alert(startValue+':'+json[attr]+':'+speed);//测试用。
    }
    timer=setInterval(function(){
        for(var attr in json){
            changeValue=0;
            changeValue=parseInt(getStyle(div1,attr));
            if((speed<0&&changeValue+speed<=json[attr])||(speed>0&&changeValue+speed>=json[attr])){
                div1.style[attr]=json[attr]+'px';
                clearInterval(timer);
            }
            else{
                div1.style[attr]=changeValue+speed+'px';
            }            
        }
    },30);
}
/*--------------------获取样式的函数-------------------------*/
function getStyle(obj,attr)
{
    return obj.currentStyle?obj.currentStyle[attr]:getComputedStyle(obj,null )[attr];
}
</script> 
</html>
阅读 1.8k
1 个回答

首先,如果要单纯地解决这个问题,可以这样做:在move函数的for循环中加一个break语句即可。如下:

for(var attr in json){
    startValue=parseInt(getStyle(div1,attr));
    speed=startValue>json[attr]?-speed:speed;//判断速度正负。
    break;
    alert(startValue+':'+json[attr]+':'+speed);//测试用。
}

你先看看效果是否你想要的。

造成问题的原因是,你对一个json进行遍历,但是在每次循环中,每次都会改变speed的值。当鼠标移开时,第一次循环之后speed的值是-10,但是第二次循环之后,speed的值是-speed,即就是-(-10),所以speed又被改变成了10,所以满足的是这个条件

if((speed<0&&changeValue+speed<=json[attr])||    
   (speed>0&&changeValue+speed>=json[attr])){
            div1.style[attr]=json[attr]+'px';
            clearInterval(timer);
}   

div的宽度和高度是直接被从200修改成100的。

加油!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题