m0_46602893 2021-05-26 13:53 采纳率: 91.5%
浏览 21
已结题

JS多物体运动问题?

<!DOCTYPE html>
<html lang="en">
      <head>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <title>Document</title>
            <style>
                  div{width: 100px;height: 30px;background-color: red;margin-top: 30px;}
            </style>
            <script>
                  window.onload = function(){
                        var DIVS = document.getElementsByTagName("div");
                        for(var i = 0; i < DIVS.length; i++){
                              DIVS[i].onmouseover = function(){
                                    startMove(this,500);
                              }
                              DIVS[i].onmouseout = function(){
                                    startMove(this,100);
                              }
                        }
                  }

                  function startMove(node,target){
                  var timer = null; 

                        clearInterval(timer);
                        
                        timer = setInterval(function(){
                              var speed = (target - node.offsetWidth) / 8;
                              speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
                              if(node.offsetWidth == target){
                                    clearInterval(timer);
                              }else{
                                    node.style.width = node. offsetWidth + speed + "px";
                              }
                        

                        },30);
                  }
            </script>
      </head>
      <body>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
      </body>
</html>

问题一:为什么把var timer = null; 放在函数内部,执行的结果就是当鼠标滑过div长度没有达到500的时候快速滑出这个时候div就会不停地闪烁快速的变长变短?

<!DOCTYPE html>
<html lang="en">
      <head>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <title>Document</title>
            <style>
                  div{width: 100px;height: 30px;background-color: red;margin-top: 30px;}
            </style>
            <script>
                  window.onload = function(){
                        var DIVS = document.getElementsByTagName("div");
                        for(var i = 0; i < DIVS.length; i++){
                              DIVS[i].onmouseover = function(){
                                    startMove(this,500);
                              }
                              DIVS[i].onmouseout = function(){
                                    startMove(this,100);
                              }
                        }
                  }
                  var timer = null; 

                  function startMove(node,target){

                        clearInterval(timer);
                        var speed = (target - node.offsetWidth) / 8;
                        speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
                        timer = setInterval(function(){
                              
                              if(node.offsetWidth == target){
                                    clearInterval(timer);
                              }else{
                                    node.style.width = node. offsetWidth + speed + "px";
                              }
                        

                        },30);
                  }
            </script>
      </head>
      <body>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
      </body>
</html>

为什么把speed放在

  timer = setInterval(function(){

                              

                              if(node.offsetWidth == target){

                                    clearInterval(timer);

                              }else{

                                    node.style.width = node. offsetWidth + speed + "px";

                              }

               },30);

外部的时候在把鼠标放在div上再移出的时候div长度会无限加长和缩短?

  • 写回答

1条回答 默认 最新

  • iMingzhen 2021-05-26 17:30
    关注

    1. var timer 放在函数内部,鼠标经过和离开的时候会同时执行两个startMove创建2个timer,因为清除不到另一个startMove里的timer,放在外面才能正确清除。而没有清除timer的话,一个timer(鼠标经过触发的)一直执行边长,一个一直执行缩短(鼠标离开时触发的),所以就会造成闪烁

     

    2.speed放外面,会导致speed的值不准确

     

    补充下,这种动画还是用css3更优

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 9月4日
  • 已采纳回答 8月27日

悬赏问题

  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)