ximalangyashan 2023-02-15 15:04 采纳率: 98.9%
浏览 11
已结题

有限2个疑JS移动dom对象无法停止

JS移动dom对象无法停止

代码如下

<!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>
            #box{width: 200px;height: 200px;top: 300px;background-color: red;position: absolute}
            #deadline{width: 1px;height: 900px;background-color: black;position: absolute;left: 1000px;}
      </style>
      <script>
            window.onload = function(){
                  var BTN = document.getElementById("btn");
                  BTN.onclick = function(){
                        Starmove(1000);
                  }
            }
            var timer = null;
            var Starmove = function(goal){
                  var BOX = document.getElementById("box");
                  var speed = (goal - BOX.offsetLeft)/18;
                  clearInterval(timer);
                  timer = setInterval(function(){
                        if(BOX.offsetLeft == goal ){
                              clearInterval(timer);
                        }else{
                              BOX.style.left = BOX.offsetLeft + speed + "px"
                        }
                  },30)
            }
      </script>
</head>
<body>
      <button id="btn">开始运动</button>
      <div id="box"></div>
      <span id="deadline"></span>
</body>
</html>

有限2个疑问
1:当var speed = (goal - BOX.offsetLeft)/18;时,为什么box方块会出界?而设置var speed = (goal - BOX.offsetLeft)/8时不会出界?
2:已经设置了
if(BOX.offsetLeft == goal ){
clearInterval(timer);
所以我认为无论给speed设置一个怎样的数字,它都会最终停在目的地,为什么这个当我给speed = 5的时候它不会停止,而是无限运动出界?

  • 写回答

4条回答 默认 最新

  • CSDN专家-showbo 2023-02-15 15:07
    关注

    除以18 speed会出现浮点数,浮点数四则运算时会有精度丢失问题,导致BOX.offsetLeft == goal不匹配。
    除以8 speed为整数,没有精度问题,所以能停止
    要改下逻辑,offsetleft大于goal就设置为goal防止浮点数计算精度丢失的问题

                  timer = setInterval(function () {
                      var left = BOX.offsetLeft + speed;
                      if (left > goal) {///////////////////////////
                          clearInterval(timer);
                          left = goal;////////
                      }
                      BOX.style.left = left + "px"
     
                  }, 30)
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 2月23日
  • 已采纳回答 2月15日
  • 创建了问题 2月15日

悬赏问题

  • ¥500 52810做蓝牙接受端
  • ¥15 基于PLC的三轴机械手程序
  • ¥15 多址通信方式的抗噪声性能和系统容量对比
  • ¥15 winform的chart曲线生成时有凸起
  • ¥15 msix packaging tool打包问题
  • ¥15 finalshell节点的搭建代码和那个端口代码教程
  • ¥15 Centos / PETSc / PETGEM
  • ¥15 centos7.9 IPv6端口telnet和端口监控问题
  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录