m0_46602893 2021-04-20 18:41 采纳率: 91.5%
浏览 132
已采纳

js问题,为什么这个代码这样写后面的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: 20px;
                  height: 20px;
                  background-color: red;
                  border-radius: 50%;
                  position: absolute;
            }
      </style>
      <script>
            window.onload = function () {
                  var arr = document.getElementsByTagName("div");
                  for (i = arr.length - 1; i > 0; i--) {
                              arr[i].style.top = arr[i - 1].offsetTop + "px";
                              arr[i].style.left = arr[i - 1].offsetLeft + "px";
                        }
                  document.onmousemove = function (ev) {
                        var e = ev || window.event;
                        
                        arr[0].style.top = e.clientY + "px";
                        arr[0].style.left = e.clientX + "px";
                  }
            }
      </script>
</head>

<body>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
</body>

</html>

我把

for (i = arr.length - 1; i > 0; i--) {

                              arr[i].style.top = arr[i - 1].offsetTop + "px";

                              arr[i].style.left = arr[i - 1].offsetLeft + "px";

                        }

写在了触发函数外面,但是我认为我可以用for循环将里面圆点的位置全部都变成我想要的位置后(把后一个圆点放在前一个圆点位置上),然后再用onmousemove函数让第一个圆点跟随鼠标就行了,但是为什么按照这个逻辑后面的圆点无法跟随第一个圆点?

  • 写回答

3条回答 默认 最新

  • Menkongkong 2021-04-21 09:17
    关注

    先说你代码中第一个问题,window.onload内的函数会在页面加载时执行,你在里面先通过for循环修改了样式,然后给document添加了一个鼠标滑动事件,想要做一个鼠标跟随的效果。鼠标滑动的匿名函数里你会更具当前的鼠标位置去修改第一个arr的位置属性,但是后面的小圆点的位置你没有去修改呀,你只是在页面加载时去修改了后面小圆点的样式,那么你的鼠标变只能控制第一个小圆点,如果想要控制后面的小圆点,应该将for循环封装到一个函数里,然后滑动事件去调用这个函数。

    然后是for (i = arr.length - 1; i > 0; i--)中,i的问题,这里你的i没有在for循环中定义,直接这样使用i,i会被解析为一个全局变量,你现在只有一个循环,当循环for函数有两个以上并且都用i的时候,会导致全局变量污染,这就是很严重的bug了,正常情况下你应该使用for (let i = arr.length - 1; i > 0; i--)。而且由于你这里的i是一个全局变量,就会导致i的值不停的被覆盖重写,当你for循环执行完以后i的值为0,那么你的所有arr[i]都是arr[0],

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 stm32代码移植没反应
  • ¥15 matlab基于pde算法图像修复,为什么只能对示例图像有效
  • ¥100 连续两帧图像高速减法
  • ¥15 组策略中的计算机配置策略无法下发
  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)
  • ¥50 mac mini外接显示器 画质字体模糊