经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
Js BOM中用定时器实现简单运动会遇到的一些小问题及解决
来源:cnblogs  作者:徒手摘星辰  时间:2021/3/8 11:51:04  对本文有异议
  • 简单运动

    • 简单运动:是一种视觉暂留效果,只要元素变化过程时间够短,给人眼造成的效果就是一个运动的效果,人眼的视觉残留的时间0.1~0.4 s

    • 可以通过定时器,实现每隔一个极短时间(50~100毫秒左右),执行函数,函数内部让运动的属性值发生变化

    • 定时器常见问题1

      • 将定时器的开始和停止过程写在不同的事件函数内部,容易出现用户错误点击情况:

      ? 简单运动代码如下:

  1. <html>
  2. <head>
  3. <meta charset="UTF-8">
  4. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Document</title>
  7. <style>
  8. #box{
  9. width: 100px;
  10. height: 100px;
  11. position: absolute;
  12. left: 0;
  13. background-color: lightcoral;
  14. }
  15. </style>
  16. </head>
  17. <body>
  18. <input type="button" id="start" value="开始">
  19. <input type="button" id="end" value="停止">
  20. <div id="box"></div>
  21. <script>
  22. var start = document.getElementById("start");
  23. var end = document.getElementById("end");
  24. var box = document.getElementById("box");
  25. //信号量 -- 全局变量存储left的属性值,每次都会发生变化实现移动
  26. var boxleft = 0;//初始值必须与box的初始属性值一样
  27. var boxInveral;
  28. start.onclick = function(){
  29. boxInveral = setInterval(function(){
  30. boxleft += 10;
  31. box.style.left = boxleft + "px";
  32. },100);
  33. };
  34. //清除定时器
  35. end.onclick = function(){
  36. clearInterval(boxInveral);
  37. }
  38. </script>
  39. </body>
  40. </html>
  • 定时器常见问题1
    • 将定时器的开始和停止过程写在不同的事件函数内部,容易出现用户错误点击情况:
    • 多次点击开始,会造成加速 :(每一个定时器都是独立的,每点击一次,就相当于再+10,造成加速);
      多次点击开始,不能够停止 :(清除定时器,清除的是当前最新的定时器,而前面设置的全局变量存储的定时器,在你每点击一次开始按钮,就会改变其指向,指向最新的定时器,所以清除定时器,只能清除当前最新的定时器。而前面的那些点击生成的定时器没有办法引用到,也就没有办法再去清除了);
    • 解决方法:设表先关,每次开启新定时器之前,先清除一次前面的定时器,这样就会永远保留当前最新的定时器。
  1. <script>
  2. var start = document.getElementById("start");
  3. var end = document.getElementById("end");
  4. var box = document.getElementById("box");
  5. //信号量 -- 全局变量存储left的属性值,每次都会发生变化实现移动
  6. var boxleft = 0;//初始值必须与box的初始属性值一样
  7. var boxInveral;
  8. start.onclick = function(){
  9. //定时器写在事件函数内部,当事件多次被触发,会导致定时器累积
  10. //解决方法:设表先关
  11. clearInterval(boxInveral);//关闭之前的定时器
  12. boxInveral = setInterval(function(){
  13. boxleft += 10;
  14. box.style.left = boxleft + "px";
  15. },100);
  16. };
  17. //清除定时器
  18. end.onclick = function(){
  19. clearInterval(boxInveral);
  20. }
  21. </script>
  • 定时器常见问题2

    • 要求让元素走到指定位置停止,如果步长设置不合理,停止的位置可能就不是指定位置。

    • 解决方法:拉钟停表,在定时器内部每次都要判断是否走到了终点,要不要停止定时器;

      如果走到或超过了终点,强行拉到终点,并停止定时器

  1. <script>
  2. var start = document.getElementById("start");
  3. var end = document.getElementById("end");
  4. var box = document.getElementById("box");
  5. //信号量 -- 全局变量存储left的属性值,每次都会发生变化实现移动
  6. var boxleft = 0;//初始值必须与box的初始属性值一样
  7. var boxInveral;
  8. start.onclick = function(){
  9. clearInterval(boxInveral);
  10. boxInveral = setInterval(function(){
  11. // boxleft += 10;
  12. // boxleft += 20;
  13. // boxleft += 30;//当前进设置的逐渐变大,最终停下来的位置也不是指定位置了
  14. boxleft += 35;
  15. //判断这一次的运动是否走到了指定500px位置
  16. if(boxleft >= 500){
  17. // 解决上面问题方法就是 强行拉到指定位置,直接给变量赋值指定位置
  18. box.style.left = 500 + "px";
  19. // 清除定时器
  20. clearInterval(boxInveral);
  21. }
  22. box.style.left = boxleft + "px";
  23. },100);
  24. };
  25. //清除定时器
  26. end.onclick = function(){
  27. clearInterval(boxInveral);
  28. }
  29. </script>
  • 定时器常见问题3

    • 要求规定时间内让元素走到规定的结束位置,时间间隔可以更改

    • 解决方法:步标整除;

      ? 总距离 = 步长 * 次数;

      ? 时间间隔自定义,总时长固定;

      ? 求出总次数 = 总时间 / 时间间隔

      ? 定义计数器变量,每执行一次定时器函数加1,直到执行达到总次数,停止定时器

    • 如:3秒,让div从100px走到700px

      1. <html>
      2. <head>
      3. <style>
      4. #box{
      5. width: 100px;
      6. height: 100px;
      7. position: absolute;
      8. left: 100px;
      9. background-color: lightcoral;
      10. }
      11. </style>
      12. </head>
      13. <body>
      14. <input type="button" id="start" value="开始">
      15. <input type="button" id="end" value="停止">
      16. <div id="box"></div>
      17. <script>
      18. var start = document.getElementById("start");
      19. var end = document.getElementById("end");
      20. var box = document.getElementById("box");
      21. //已知 开始位置、结束位置、总时长、时间间隔
      22. // 总距离 = 步长 * 总次数
      23. // 总距离可以由 开始位置 减 结束位置 得到;已知
      24. // 总次数由 总时长 / 时间间隔 得到;已知
      25. // 所以 步长 = (开始位置 减 结束位置)/(总时长 / 时间间隔);
      26. //信号量 ,相当于初始值
      27. var boxleft = 100;//初始值必须与box的初始属性值一样
      28. var endleft = 700;//结束位置
      29. var time = 1000;//总时长
      30. var interval = 50;//时间间隔
      31. var step = (endleft - boxleft)/(time / interval);//步长
      32. var boxInveral;
      33. var count = 0;//定义一个次数的累加器
      34. start.onclick = function(){
      35. clearInterval(boxInveral);
      36. boxInveral = setInterval(function(){
      37. //每次加步长
      38. boxleft += step;
      39. //每运动一次,累加器加1
      40. count ++;
      41. //判断是否达到总次数
      42. if(count >= (time / interval)){
      43. //由于总距离与总时长可能求出的次数不是整数,这样最后停下来的位置也肯可能不准
      44. // 拉钟停表
      45. boxleft = endleft;
      46. clearInterval(boxInveral);
      47. }
      48. box.style.left = boxleft + "px";
      49. },interval);
      50. };
      51. //清除定时器
      52. end.onclick = function(){
      53. clearInterval(boxInveral);
      54. }
      55. </script>
      56. </body>
      57. </html>

原文链接:http://www.cnblogs.com/dreamtown/p/14483598.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号